【问题标题】:Java - Hot deploymentJava - 热部署
【发布时间】:2015-02-02 20:20:42
【问题描述】:

最近,我正在阅读有关具有热部署功能的 Erlang 的书。无需关闭系统即可完成部署。所有现有请求将由旧版本代码处理,部署后的所有新请求将由新代码处理。在这种情况下,两个版本的代码都可以在运行时使用一段时间,直到所有旧请求都得到处理。 Java中有什么方法可以保留2个版本的jar文件吗?是否有任何应用程序/网络服务器支持此功能?

【问题讨论】:

  • 我相信Tomcat,for 1,支持这个,虽然我不知道是否建议在生产环境中使用。
  • 您可以在集群环境中使用大多数 Java 应用服务器,例如 Glassfish/Websphere/Weblogic。
  • JBoss 也支持这个。然而,这是否可取还有待商榷。

标签: java erlang hotdeploy


【解决方案1】:

如果您的目的是加快开发速度,那么JRebel 就是用于此目的的工具。但是,我不建议使用它来修补生产系统。

JRebel 检测类文件何时发生更改并将其重新加载到正在运行的应用服务器中,而不会丢弃任何旧状态。与大多数应用服务器在重新部署整个初始化过程必须重新运行的整个战争/耳朵时所做的相比,这要快得多。

【讨论】:

  • 许可证禁止在生产系统上使用 JRebel
  • JRebel 是一个开发工具。对于生产,有 LiveRebel (liverebel.com)
【解决方案2】:

在 Java 世界中实现热部署的方法有很多,因此您可能需要更具体地了解您的上下文以及您想要实现的目标。

以下是一些值得考虑的好线索/选项:

  • OSGi是一个通用的模块系统,支持热部署
  • Clojure 是一种动态 JVM 语言,可实现大量运行时交互。 Clojure 通常用于“实时编码”——几乎任何东西都可以在运行时进行热交换和重新定义。 Clojure 是一种非常强调不变性和并发性的函数式语言,因此在某些方面与 Erlang 有一些有趣的相似之处。 Clojure 有一些非常不错的 Web 框架,例如 Noir,它们适用于热交换 Web 服务器代码。
  • Play Framework 旨在为提高生产力(避免 Web 服务器重新启动)启用热交换代码。如果您主要关注的是热插拔 Web 应用程序,可能与此相关。
  • 大多数 Java 应用程序服务器(例如 JBoss)支持某种形式的 Web 应用程序热交换。

【讨论】:

    【解决方案3】:

    对生产应用程序进行热更新的唯一原因是旨在为用户提供零停机时间。

    LiveRebel(基于JRebel)是可以与 Jenkins 结合使用的工具,例如。它可以在耗尽生产集群上的会话时进行安全的热补丁以及滚动重启。

    【讨论】:

      【解决方案4】:

      从技术上讲,您可以自己执行此操作。虽然,我不会推荐它,因为它会很快变得复杂。但想法是您可以创建一个 ClassLoader 并加载您的新版本的类。然后确保您的执行代码知道新的 ClassLoader。

      我建议只使用 JBoss 并重新部署你的 jars 和 war。大多数情况下都很好而且很简单。

      在任何一种情况下,您都必须确保没有任何内存泄漏,因为在几次重新部署后您将用完 PermGen 空间。

      【讨论】:

        【解决方案5】:

        RelProxy 添加到您的工具箱中,RelProxy 是一个用于 Java(和 Groovy)的热类重载,用于改进甚至生产环境的开发,只有一个显着的限制,只能在您的代码子集中重载。

        【讨论】:

          猜你喜欢
          • 2018-07-24
          • 1970-01-01
          • 2011-12-06
          • 1970-01-01
          • 1970-01-01
          • 2010-11-26
          • 2015-04-02
          • 2011-09-29
          • 2018-10-15
          相关资源
          最近更新 更多