我在想是否存在一种“平滑”的方法来重新部署Java WAR到生产服务器(没有集群,没有OSGi)?
我能想到的唯一方法是停止服务器,更新文件,然后重新启动服务器。并且在10分钟前我需要在网站上显示维护警告。
你的做法是什么?
我能想到的唯一方法是停止服务器,更新文件,然后重新启动服务器。并且在10分钟前我需要在网站上显示维护警告。
你的做法是什么?
首先,热部署并不总是有效的。我们花了很多时间来确保每个新模块都被加载,但最终发现这样做并不值得。因此,你所做的可能听起来不好,但却是部署新 WAR 包最可靠的方式。
我们目前的方法是在所有服务器前面使用带有负载均衡器的交换机。我们至少运行两个应用服务器实例。当我们关闭一个服务器进行维护时,流量会自动转移到另一个服务器。
一些交换机非常便宜。如果您没有足够的负载来证明需要一个新的盒子,并且您的两个实例可以在同一台盒子上运行,则可以考虑使用交换机。
在某些情况下,交换机实际上可以节省成本。例如,我们有一个 SSL 页面,以前需要使用 6 个盒子,现在在交换机中使用 SSL 加速后只需要 2 个盒子就可以正常运行。
你可以看一下JRebel,但我不会在生产环境中使用它。在生产环境中,我们基本上做的是相同的事情,尽管我们的老板一直梦想着热部署。不幸的是,热部署在大多数复杂应用程序中仅仅是纸上谈兵 - 在增量热部署中总会出现一些问题...
一些应用服务器确实支持重新部署而不中断服务。至少对于WebLogic来说是这样的,请参见使用生产重新部署更新应用程序。请注意,这不是热部署(我永远不会在生产服务器上使用热部署)。
如果没有应用服务器的支持,恐怕您将无法进行真正“平滑”的重新部署。如果您想要最小化停机时间,一种方法是在同一台服务器或另一台服务器上并行部署新应用程序,并在完成后更改路由规则。但是客户端将失去他们的会话。
mv old.war new.war
,然后让应用服务器自动处理。但是对于24/7高负载服务来说,这可能不是一个可行的选择。