我想知道是否有将 Java WAR 重新部署到生产服务器(没有集群,没有 OSGi)的“平滑方式”?
我能想到的就是停止服务器,更新文件,重新启动服务器。我需要提前 10 分钟在网站上显示维护警告。
你的方法是什么?
我想知道是否有将 Java WAR 重新部署到生产服务器(没有集群,没有 OSGi)的“平滑方式”?
我能想到的就是停止服务器,更新文件,重新启动服务器。我需要提前 10 分钟在网站上显示维护警告。
你的方法是什么?
首先,热部署并不总是有效。我们花了很多时间来确保每个新模块都已加载,并认为不值得麻烦。因此,您所做的可能听起来很糟糕,但它是部署新 WAR 的最可靠方法。
我们目前的方法是在所有服务器前使用带有负载均衡器的交换机。我们至少运行 2 个应用程序服务器实例。当我们关闭一台服务器进行维护时,流量会自动转到另一台服务器。
有些开关真的很便宜。如果您没有足够的负载来证明新盒子的合理性,并且您的 2 个实例可以在同一个盒子上运行。
在某些情况下,交换机实际上可以省钱。例如,我们有一个 SSL 页面,过去使用 6 个盒子,现在它在 2 个盒子上运行良好,并在交换机中使用 SSL 加速。
您可能会看一下JRebel,尽管我不会在生产中使用它。在生产中,我们的做法基本相同,尽管我们的老板一直梦想着热重新部署。不幸的是,它们主要在纸面上得到支持——在大多数复杂的应用程序中,热重新部署总是会出错。对于增量热重新部署来说,情况更是如此……
一些应用服务器确实支持在不中断服务的情况下重新部署。这对于 WebLogic 至少是正确的,请参阅使用生产重新部署来更新应用程序。请注意,这不是热部署(我永远不会对生产服务器使用热部署)。
如果没有应用程序服务器的支持,恐怕您将无法进行真正的“顺利”重新部署。如果您想最大限度地减少停机时间,一种方法是并行部署新应用程序(在同一台服务器或另一台服务器上)并在完成后更改路由规则。但是客户会失去他们的会话。
通常可以优化启动时间。我们的 Web 应用程序在 5-7 秒内从 Jetty 启动。其他 Java Web 服务器更糟糕,因为它们启动速度很慢。
另外,据我所知(不是我做的),前端 Web 服务器(例如 apache,我们使用 lighttpd)可以配置为在 Jetty 时保持请求一段时间(我们最多 30 秒)还没有准备好。因此,我们在部署时只需轻松重启 Jetty,在最坏的情况下,用户只会有几秒钟的延迟,这通常看起来就像是互联网连接故障。
通常,mv old.war new.war
让 AS 从那里拿走它,尽管 24/7 服务非常繁忙,但我想这不是一个选择。
正如 ZZ Coder 已经提到的,负载均衡器是一个很好的解决方案,尤其是对于大型部署。对于我自己的项目,我使用 nginx Web 服务器的反向 http 代理功能。它将所有 http 数据包从指定的 Web 上下文(从 Internet 中查看)重定向到我网络内的服务器。配置非常简单:
location /best-app-ever/ {
proxy_pass host-address:8080/some-app-1.1
root /home/www/some-app-1.1
}
切换版本也应该很流畅。假设您已经部署了新版本的应用程序,只需更改 nginx 配置文件并应用更改:
location /best-app-ever/ {
proxy_pass host-address:8080/some-app-1.2
root /home/www/some-app-1.2
}
sudo nginx -t
sudo service nginx restart
请注意,如果您的 Web 应用程序是有状态的和/或包含一些正在运行或计划的进程,则部署和取消部署可能不会那么顺利。