最近,我正在阅读有关具有热部署功能的 Erlang 的书。无需关闭系统即可完成部署。所有现有请求将由旧版本代码处理,部署后的所有新请求将由新代码处理。在这种情况下,两个版本的代码都可以在运行时使用一段时间,直到所有旧请求都得到处理。Java中有什么方法可以保留2个版本的jar文件吗?是否有任何应用程序/网络服务器支持此功能?
5 回答
如果您的目的是加快开发速度,那么JRebel就是用于此目的的工具。但是,我不建议使用它来修补生产系统。
JRebel 检测类文件何时发生更改并将其重新加载到正在运行的应用服务器中,而不会丢弃任何旧状态。与大多数应用服务器在重新部署整个初始化过程必须重新运行的整个战争/耳朵时所做的相比,这要快得多。
在 Java 世界中实现热部署的方法有很多,因此您可能需要更具体地了解您的上下文以及您想要实现的目标。
以下是一些值得考虑的好线索/选项:
- OSGi是支持热部署的通用模块系统
- Clojure是一种动态 JVM 语言,它支持大量运行时交互。Clojure 通常用于“实时编码”——几乎任何东西都可以在运行时进行热交换和重新定义。Clojure 是一种非常强调不变性和并发性的函数式语言,因此在某些方面与 Erlang 有一些有趣的相似之处。Clojure 有一些非常好的 Web 框架,例如Noir,它们适用于热交换 Web 服务器代码。
- Play 框架旨在为提高生产力(避免 Web 服务器重新启动)启用热交换代码。如果您主要关注的是热插拔 Web 应用程序,则可能是相关的。
- 大多数 Java 应用程序服务器(例如JBoss)都支持某种形式的 Web 应用程序热交换。
对生产应用程序进行热更新的唯一原因是旨在为用户提供零停机时间。
例如, LiveRebel(基于JRebel)是可以与 Jenkins 结合使用的工具。它可以在耗尽生产集群上的会话时进行安全的热补丁以及滚动重启。
从技术上讲,您可以自己执行此操作。虽然,我不会推荐它,因为它会很快变得复杂。但想法是您可以创建一个 ClassLoader 并加载您的新版本的类。然后确保您的执行代码知道新的 ClassLoader。
我建议只使用 JBoss 并重新部署你的 jars 和 war。大多数情况下都很好而且很简单。
无论哪种情况,您都必须确保没有任何内存泄漏,因为在几次重新部署后您将用完 PermGen 空间。
将RelProxy添加到您的工具箱中,RelProxy 是 Java(和 Groovy)的一个热类重载,以改进甚至用于生产的开发,只有一个重要的限制,重载只能在您的代码子集中进行。