文章目录
Java HotFix框架简介
框架作用
HotFix框架是一种用于动态修复和更新应用程序的框架,修改已经部署的应用程序,无需重新编译和部署整个应用。
Java HotFix框架原理
-
ClassLoader 重新加载
Java 作为一种静态语言,类一经加载到 JVM 中,便无法修改,而且同一个类加载器对于同一个类只能加载一次,因此热部署常用的一种解决方案是创建新的 ClassLoader 加载新的 class 文件,然后替换之前创建的对象。 -
Java Agent
另一种解决方案是使用 Java Agent,Java Agent 可以理解为 JVM 层面的 AOP,可以在类加载时将 class 文件的内容修改为自定义的内容,并且支持修改已加载到 JVM 的 class。
几种Java HotFix框架
Spring Loaded
- Spring Loaded 是一个 JVM 代理,可以在 JVM 运行时重新加载类文件的更改。它会在加载时转换类,以便稍后重新加载。与“热代码替换”只允许在 JVM 运行时进行简单更改(例如更改方法体)不同,Spring Loaded 允许您添加/修改/删除方法/字段/构造函数。还可以修改类型/方法/字段/构造函数上的注解,并且可以添加/删除/更改枚举类型中的值。
- 已停止更新
- 使用方法
- 下载Agent插件:https://repo1.maven.org/maven2/org/springframework/springloaded/1.2.8.RELEASE/springloaded-1.2.8.RELEASE.jar
- 在jvm的启动命令添加如下参数:-javaagent:/Users/you/runtime/springloaded-1.2.8.RELEASE.jar -noverify
- 替换程序包。
JRebel
- JRebel 主要在 ClassLoader 级别与 JVM 及应用集成,不会创建新的 ClassLoader,当监测到 class 文件发生变化时通过扩展类加载器更新后的应用。
- 官网:https://www.jrebel.com/products/jrebel
- 收费,可免费使用14天。价格未在官网查到。
- 下载地址:https://www.jrebel.com/products/jrebel/download/prev-releases
- 使用说明:https://manuals.jrebel.com/jrebel/standalone/config.html
HotSwapAgent和DCEVM
-
HotSwapAgent和DCEVM的功能类似,主要包括:
- 类重新加载:允许将修改后的类重新加载到正在运行的Java应用程序中,无需中断程序。
- 支持多种代码更改:包括修改方法体、字段,甚至是类层次结构。
- 与IDE集成:与流行的Java集成开发环境(IDE),如IntelliJ IDEA、Eclipse和NetBeans,无缝集成。
-
HotSwapAgent独有的功能:类远程重新加载。
-
https://github.com/HotswapProjects/HotswapAgent
-
http://hotswapagent.org/
-
https://github.com/dcevm/dcevm
Byteman
- Byteman是一个基于字节码注入的Java增强工具和框架。它通过在运行时修改Java类的字节码来实现对应用程序的动态注入和增强。使用步骤如下:
- 规则定义:使用Byteman,定义要应用于目标应用程序的规则。规则是由特定的注入点和相应的操作组成的。注入点指示Byteman应该在目标类的哪个位置注入字节码。操作定义了要在注入点执行的操作。
- 字节码注入:Byteman在目标应用程序运行时,通过JVM TI(Java虚拟机工具接口)进行字节码注入。它会加载目标类,并在指定注入点处修改类的字节码,以插入定义的操作。这样,Byteman就能够在运行时动态修改目标应用程序的行为。
- 规则执行:当目标应用程序在运行时到达规则定义的注入点时,Byteman会根据定义的操作执行相应的增强行为。可包括执行特定的代码块、调用其他方法或修改变量值等。通过规则执行,Byteman可以对应用程序进行实时的调试、诊断和修复。
- 官网:https://byteman.jboss.org/
- 参考帖子:https://cloud.tencent.com/developer/article/2031717
- github地址:https://github.com/bytemanproject/byteman
Arthas Hot Swap
- Arthas Hot Swap插件是基于 Arthas redefine 命令实现的,使用该插件进行远程热部署无需任何配置,无需使用 debug 端口,只需几个简单动作就能完成
- Arthas是 Alibaba 开源的 Java 诊断工具。文档地址:https://arthas.aliyun.com/doc/。 github地址:https://github.com/alibaba/arthas
- Arthas Hot Swap的github地址:https://github.com/xxxtai/ArthasHotSwap?spm=a2c6h.12873639.article-detail.8.1ae713b9jJwnAG
- 参与帖子:https://developer.aliyun.com/article/771105?spm=a2c6h.12873639.article-detail.68.14c1c660oj2UfN&scm=20140722.ID_community@@article@@771105._.ID_community@@article@@771105-OR_rec-V_1-RL_community@@article@@1093389
- 使用方法:
- IntelliJ IDEA 安装插件“Arthas Hot Swap”,从 gitHub Releases 下载安装包;
- 使用“mvn compile”编译相关工程
- 选择需要热部署的 java 源文件或者 class 文件,在类名或方法名上单击右键,选择“Arthas Hot Swap”的“Swap this class”,插件后台执行成功后会把热部署需要的命令复制到粘贴板;
- 登录远程服务器,管理员权限,粘贴热部署命令并执行,热部署完成,该机器运行着最新的class。机器第一次执行热部署命令,可能失败,再执行一次试下。
- 使用限制:由于需要阿里云OSS作为传输字节码文件的介质,故应用服务器需要能够访问阿里云服务器。
框架对比
框架名称 | 是否开源 | 热更新限制 | 使用限制 | 活跃度 |
---|---|---|---|---|
Spring Loaded | 是 | 无 | 否 | 最新版本1.2.8,更新时间:2017-09-05 |
JRebel | 否 | 无 | 无 | 最新版本2023.3.1 |
HotSwapAgent | 是 | 无法修改类层次结构。 | 无 | github更新中 |
DCEVM | 是 | 无 | 依赖gcc、仅支持JDK7/8 | 已停止更新 |
Byteman | 是 | 无 | 无 | github更新中 |
Arthas Hot Swap | 是 | 无法修改类名、方法名,无法修改类属性名称, 无法新增类属性,无法新增非静态方法,不支持修改内部类 | 由于需要阿里云OSS作为传输字节码文件的介质, 故应用服务器需要能够访问阿里云服务器。 | github更新中 |