【问题标题】:Smooth redeployment of WAR in production?在生产中顺利重新部署 WAR?
【发布时间】:2011-02-26 00:33:24
【问题描述】:

我想知道是否有将 Java WAR 重新部署到生产服务器(无集群,无 OSGi)的“平稳方式”?

我能想到的就是停止服务器,更新文件,重新启动服务器。我需要提前 10 分钟在网站上显示维护警告。

你的方法是什么?

【问题讨论】:

  • 为什么要停止服务器、更新文件、重新启动服务器而不仅仅是取消部署/部署?我们的生产服务器上有几个 .war webapps,通常只取消部署/重新部署:不需要关闭所有 webapps 的整个服务器!?
  • @nooz:好吧,我只在服务器上运行 1 个应用程序。我找不到任何关于使用 Jetty 重新部署的教程/指南,我所找到的只是如何为快速开发做到这一点
  • 哦,我明白了...我不了解 Jetty(也许其他人会评论)。但是对于 Tomcat,有几种方法可以取消部署/重新部署单个 .war(我曾经从 Ant 任务中执行此操作,但现在我使用的是管理器应用程序)。这节省了关闭/重新启动 Tomcat 所需的时间。

标签: java deployment web-applications production


【解决方案1】:

首先,热部署并不总是有效。我们花了很多时间来确保每个新模块都已加载,并认为不值得麻烦。因此,您所做的可能听起来很糟糕,但它是部署新 WAR 的最可靠方法。

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

有些开关真的很便宜。如果您没有足够的负载来证明新盒子的合理性,并且您的 2 个实例可以在同一个盒子上运行。

在某些情况下,交换机实际上可以节省资金。例如,我们有一个 SSL 页面,以前使用 6 个盒子,现在它在 2 个盒子上运行良好,并在交换机中使用 SSL 加速。

【讨论】:

  • 听起来很聪明——但我想知道:你如何处理状态?当您取下一个时,所有状态显然必须在另一个资源(数据库、缓存、第二个应用程序?)上可用。其次,效果如何? - 基于我不起眼的 Java 框架经验(jsf、seam、wicket),我希望在集群中不使用“粘性会话”时,你必须跳很多圈。
  • 好问题。无状态服务器长期以来一直是这里的要求,以至于我认为这是理所当然的。如果您在服务器中有状态,则必须在负载平衡器中做一些技巧,例如基于源 IP 或 cookie 的粘性路由。
【解决方案2】:

你可以看看JRebel,虽然我不会在生产中使用它。在生产中,我们的做法基本相同,尽管我们的老板一直梦想着热重新部署。不幸的是,它们主要在纸面上得到支持——在大多数复杂的应用程序中,热重新部署总是会出错。增量热重新部署更是如此……

【讨论】:

    【解决方案3】:

    某些应用服务器确实支持在不中断服务的情况下重新部署。至少对于 WebLogic 来说是这样,请参阅 Using Production Redeployment to Update Applications。请注意,这不是热部署(我永远不会对生产服务器使用热部署)。

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

    【讨论】:

      【解决方案4】:

      通常可以优化启动时间。我们的 Web 应用程序在 5-7 秒内从 Jetty 启动。其他 Java Web 服务器更糟糕,因为它们启动速度很慢。

      另外,据我所知(不是我做的),前端 Web 服务器(例如 apache,我们使用 lighttpd)可以配置为在一段时间内保持请求(我们最多 30 秒)而码头还没有准备好。因此,我们只需在部署时轻松重启 Jetty,在最坏的情况下,用户只会有几秒钟的延迟,这通常看起来像是互联网连接故障。

      【讨论】:

        【解决方案5】:

        通常,mv old.war new.war 并让 AS 从那里取走它,尽管 24/7 服务非常繁忙,我想这不是一个选择。

        【讨论】:

        • 嗯,我在 Jetty 上试过一次,也许我做了什么。错了,但几分钟后什么也没发生;可能每个 AS 处理它的方式不同。您实际上是在哪个 AS 上执行此操作的?
        • 它是可配置的:您可以让 Tomcat 和 JBoss 以这种方式工作。得知 Jetty 不允许您以类似的方式进行设置,我会感到惊讶。顾名思义,Tomcat 和 Jetty 是 servlet 容器,JBoss(以及 Glassfish、JOnAS 等)是应用服务器。
        【解决方案6】:

        正如 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 应用程序是有状态的和/或包含一些正在运行或计划的进程,则部署和取消部署可能不会那么顺利。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-03
          • 1970-01-01
          • 2012-05-06
          • 1970-01-01
          • 2014-07-02
          • 1970-01-01
          • 2017-08-11
          相关资源
          最近更新 更多