Java – 热部署

最近,我正在阅读有关具有热部署function的Erlang的书。 可以在不降低系统的情况下完成部署。 所有现有请求都将由旧版本的代码处理,部署后的所有新请求将由新代码提供。 在这些情况下,两个版本的代码在运行时都可用,直到所有旧请求都被提供。 在Java中有什么方法可以保留2个版本的jar文件吗? 是否有任何应用程序/ Web服务器支持此function?

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

以下是一些需要考虑的良好线索/选项:

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

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

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

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

例如,LiveRebel (基于JRebel )是可以与Jenkins一起使用的工具。 它可以在生产集群中耗尽会话时执行安全的热修补以及滚动重新启动。

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

我建议只使用JBoss并重新部署你的jar子和战争。 大部分都很好,很简单。

在任何一种情况下,您都要确保没有任何内存泄漏,因为在重新部署后,您将耗尽PermGen空间。

将RelProxy添加到您的工具箱中,RelProxy是Java(和Groovy)的热类重新加载,即使对于生产也可以改进开发,只有一个显着的限制,只能在代码的子集中重新加载。