Java - 热部署

5

最近,我在阅读一本关于Erlang的书籍,它有一个热部署(hot deployment)功能。这种部署可以在不关闭系统的情况下完成。所有现有的请求将由旧版本的代码处理,并且部署后的所有新请求将由新代码提供服务。在这种情况下,两个版本的代码都在运行时一段时间内可用,直到所有旧请求都得到满足。在Java中是否有任何方法可以保留两个版本的JAR文件?是否有任何应用程序/ Web服务器支持此功能?


我相信Tomcat可以支持这个功能,但我不确定在生产环境中是否建议使用。 - cdeszaq
您可以在大多数Java应用服务器(如Glassfish/Websphere/Weblogic)的集群环境中完成此操作。 - Jonathan S. Fisher
1
JBoss也支持这一点。然而,是否建议使用仍有争议。 - mcfinnigan
5个回答

5
如果你的意图是加速开发,那么JRebel就是一个专门用于此目的的工具。但我不建议在生产系统中使用它来修补问题。
JRebel会检测类文件何时被更改,并将其重新加载到正在运行的应用服务器中,而不会丢弃任何旧状态。这比大多数应用服务器重新部署整个war/ear时所做的初始化过程要快得多。

许可证禁止在生产系统上使用JRebel。 - Anton Arhipov
JRebel是一种开发工具。对于生产环境,有LiveRebel(http://liverebel.com)。 - Anton Arhipov

2
在Java世界中,有许多实现热部署的方法,因此您可能需要更具体地说明您的上下文和您想要实现的目标。以下是一些值得考虑的好方法/选项:
  • OSGi 是一个通用的模块系统,支持热部署。
  • Clojure 是一种动态 JVM 语言,可以实现很多运行时交互。Clojure 经常用于“实时编码”——几乎任何东西都可以在运行时进行热交换和重新定义。Clojure 是一种函数式语言,强调不可变性和并发性,在某些方面与 Erlang 有一些有趣的相似之处。Clojure 有一些非常好的 Web 框架,如Noir,适用于热交换 Web 服务器代码。
  • Play Framework 的设计旨在实现代码热交换以提高生产力(避免 Web 服务器重启)。如果您主要关注热交换 Web 应用程序,则可能与您相关。
  • 大多数 Java 应用服务器(如JBoss)都支持某种形式的 Web 应用程序热交换。

2
生产应用程序进行热更新的唯一原因是为了向用户提供零停机时间。 LiveRebel(基于JRebel)是可与Jenkins等工具配合使用的工具。它可以进行安全的热修补,并在排空生产集群上的会话时进行滚动重启。

1

从技术上讲,你可以自己做这件事。虽然我不建议这样做,因为很容易变得复杂。但是,你可以创建一个ClassLoader来加载你的类的新版本,然后确保执行代码知道这个新的ClassLoader。

我建议使用JBoss并重新部署你的jars和wars。对大多数人来说非常简单明了。

无论哪种情况,你都必须确保没有任何内存泄漏问题,否则在几次重新部署之后,你就会耗尽PermGen空间。


0
RelProxy添加到您的工具箱中,RelProxy是Java(和Groovy)的热类重新加载,可改善开发甚至用于生产,只有一个显著的限制,即仅在代码子集中才能重新加载。

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