我想知道是否有一种将Java WAR重新部署到生产服务器(没有集群,没有OSGi)的“平滑方式”?
我能想到的就是停止服务器,更新文件,重启服务器。事先10分钟,我需要在网站上显示维护警告。
你的方法是什么?
答案 0 :(得分:8)
首先,热部署并不总是有效。我们花了很多时间来确保每个新模块都已加载并确定它不值得麻烦。所以你所做的可能听起来很糟糕,但这是部署新WAR的最可靠方式。
我们当前的方法是在所有服务器前使用带负载均衡器的交换机。我们运行至少2个应用程序服务器实例。当我们关闭一台服务器进行维护时,流量会自动转到另一台服务器。
有些开关非常便宜。如果你没有足够的负载来证明新盒子的合理性,你的2个实例可以在同一个盒子上运行。
在某些情况下,交换机实际上可以省钱。例如,我们有一个SSL页面,过去常常使用6个盒子,现在它可以在2个盒子上正常运行,并且交换机中有SSL加速。
答案 1 :(得分:1)
您可能会看一下JRebel,但我不会在制作中使用它。在生产中我们基本上做同样的事情,尽管我们的老板一直梦想着热重新演绎。不幸的是,它们主要是在纸上支持 - 在大多数复杂的应用程序中,热重新部署总会出现问题。增量热重新计算更为真实......
答案 2 :(得分:1)
某些应用程序服务器确实支持重新部署而不会中断服务。对于WebLogic,这至少是正确的,请参阅Using Production Redeployment to Update Applications。请注意,这是不热部署(我绝不会将热部署与生产服务器一起使用)。
如果没有应用程序服务器支持,我担心您将无法进行真正的“平稳”重新部署。如果要最小化停机时间,一种方法是并行部署新应用程序(在同一服务器或另一台服务器上),并在完成后更改路由规则。但客户会松开会议。
答案 3 :(得分:1)
通常可以优化启动时间。我们的Web应用程序在5-7秒内从Jetty开始。其他Java Web服务器更糟糕,因为它们开始非常慢。
另外,正如我所知(不是我这样做),前端Web服务器(例如apache,我们使用lighttpd)可以配置为在一段时间内保持请求(我们的最多30秒)虽然码头没有准备好。因此,我们只需在部署时轻松重启Jetty,在最坏的情况下用户只需要几秒钟的延迟,这通常看起来就像是因特网连接故障。
答案 4 :(得分:0)
通常mv old.war new.war
让AS从那里拿走它,虽然有非常繁忙的24/7服务,但我想这不是一个选择。
答案 5 :(得分:0)
正如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应用程序是有状态的和/或包含某些正在运行或已调度的进程,则部署和取消部署可能不会那么顺利。