生产环境中WAR文件的平滑部署?

11
我在想是否存在一种“平滑”的方法来重新部署Java WAR到生产服务器(没有集群,没有OSGi)?
我能想到的唯一方法是停止服务器,更新文件,然后重新启动服务器。并且在10分钟前我需要在网站上显示维护警告。
你的做法是什么?

为什么要停止服务器、更新文件、重启服务器,而不是只进行取消部署/部署操作呢?我们的生产服务器上有几个.war Web 应用程序,通常只需要进行取消部署/部署操作:没有必要将整个服务器和所有 Web 应用程序都关闭! - NoozNooz42
1
@nooz:嗯,我只在服务器上运行一个应用程序。我找不到任何有关使用Jetty重新部署的教程/指南,所有我找到的都是如何进行快速开发的。 - stephanos
哦,我明白了...我不知道Jetty(也许其他人会评论)。但是使用Tomcat有几种方法可以卸载/重新部署单个.war文件(我曾经使用Ant任务来完成,但现在我正在使用管理器应用程序)。这样可以节省关闭/重启Tomcat所需的时间。 - NoozNooz42
6个回答

8

首先,热部署并不总是有效的。我们花了很多时间来确保每个新模块都被加载,但最终发现这样做并不值得。因此,你所做的可能听起来不好,但却是部署新 WAR 包最可靠的方式。

我们目前的方法是在所有服务器前面使用带有负载均衡器的交换机。我们至少运行两个应用服务器实例。当我们关闭一个服务器进行维护时,流量会自动转移到另一个服务器。

一些交换机非常便宜。如果您没有足够的负载来证明需要一个新的盒子,并且您的两个实例可以在同一台盒子上运行,则可以考虑使用交换机。

在某些情况下,交换机实际上可以节省成本。例如,我们有一个 SSL 页面,以前需要使用 6 个盒子,现在在交换机中使用 SSL 加速后只需要 2 个盒子就可以正常运行。


听起来非常聪明 - 但我想知道: 您如何处理状态? 当您将其全部取下时,所有状态显然必须在另一个资源上可用(DB,缓存,第二个应用程序?)。 其次,这样做效果如何?-根据我谦逊的Java框架经验(JSF,Seam,Wicket),我认为如果在集群中不使用“粘性会话”,您可能需要跳过很多障碍。 - stephanos
2
好问题。无状态服务器在这里已经是一个长期的要求,我习以为常了。如果服务器有状态,你需要在负载均衡器中进行一些技巧,比如基于源IP或cookie的粘性路由。 - ZZ Coder

1

你可以看一下JRebel,但我不会在生产环境中使用它。在生产环境中,我们基本上做的是相同的事情,尽管我们的老板一直梦想着热部署。不幸的是,热部署在大多数复杂应用程序中仅仅是纸上谈兵 - 在增量热部署中总会出现一些问题...


1

一些应用服务器确实支持重新部署而不中断服务。至少对于WebLogic来说是这样的,请参见使用生产重新部署更新应用程序。请注意,这不是热部署(我永远不会在生产服务器上使用热部署)。

如果没有应用服务器的支持,恐怕您将无法进行真正“平滑”的重新部署。如果您想要最小化停机时间,一种方法是在同一台服务器或另一台服务器上并行部署新应用程序,并在完成后更改路由规则。但是客户端将失去他们的会话。


1
通常可以优化启动时间。我们的Web应用程序在5-7秒内使用Jetty启动。其他Java Web服务器更糟糕,因为它们启动非常慢。
此外,据我所知(不是我做的),前端Web服务器(如Apache,我们使用Lighttpd)可以配置为在Jetty未准备好时保持请求一段时间(最多30秒)。因此,我们只需在部署时轻松重新启动Jetty,用户在最坏的情况下只需几秒钟的延迟,通常看起来就像是互联网连接故障。

0
通常情况下,可以使用命令mv old.war new.war,然后让应用服务器自动处理。但是对于24/7高负载服务来说,这可能不是一个可行的选择。

嗯,我曾经用Jetty尝试过一次,也许是我做错了什么,但几分钟后什么都没发生;可能每个应用服务器处理方式不同。你实际上在哪个应用服务器上做的? - stephanos
它是可配置的:您可以使Tomcat和JBoss以这种方式工作。如果Jetty不允许您以类似的方式设置它,我会感到惊讶。就术语而言,Tomcat和Jetty是Servlet容器,JBoss(以及Glassfish、JOnAS等)是应用程序服务器。 - Tomislav Nakic-Alfirevic

0
如ZZ Coder所提到的,负载均衡器是一个好的解决方案,特别是对于大型部署。对于我的项目,我使用nginx Web服务器的反向HTTP代理功能。它将来自指定Web上下文(从Internet上看到)的所有HTTP数据包重定向到我的网络内的服务器。配置非常容易: 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应用程序具有状态和/或包含一些正在运行或计划中的进程,则部署和卸载可能不会那么顺畅。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接