Java HotFix框架

Java HotFix框架简介

框架作用

HotFix框架是一种用于动态修复和更新应用程序的框架,修改已经部署的应用程序,无需重新编译和部署整个应用。

Java HotFix框架原理

  1. ClassLoader 重新加载
    Java 作为一种静态语言,类一经加载到 JVM 中,便无法修改,而且同一个类加载器对于同一个类只能加载一次,因此热部署常用的一种解决方案是创建新的 ClassLoader 加载新的 class 文件,然后替换之前创建的对象。

  2. Java Agent
    另一种解决方案是使用 Java Agent,Java Agent 可以理解为 JVM 层面的 AOP,可以在类加载时将 class 文件的内容修改为自定义的内容,并且支持修改已加载到 JVM 的 class。

几种Java HotFix框架

Spring Loaded

  • Spring Loaded 是一个 JVM 代理,可以在 JVM 运行时重新加载类文件的更改。它会在加载时转换类,以便稍后重新加载。与“热代码替换”只允许在 JVM 运行时进行简单更改(例如更改方法体)不同,Spring Loaded 允许您添加/修改/删除方法/字段/构造函数。还可以修改类型/方法/字段/构造函数上的注解,并且可以添加/删除/更改枚举类型中的值。
  • 已停止更新
  • 使用方法
    1. 下载Agent插件:https://repo1.maven.org/maven2/org/springframework/springloaded/1.2.8.RELEASE/springloaded-1.2.8.RELEASE.jar
    2. 在jvm的启动命令添加如下参数:-javaagent:/Users/you/runtime/springloaded-1.2.8.RELEASE.jar -noverify
    3. 替换程序包。

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类的字节码来实现对应用程序的动态注入和增强。使用步骤如下:
  1. 规则定义:使用Byteman,定义要应用于目标应用程序的规则。规则是由特定的注入点和相应的操作组成的。注入点指示Byteman应该在目标类的哪个位置注入字节码。操作定义了要在注入点执行的操作。
  2. 字节码注入:Byteman在目标应用程序运行时,通过JVM TI(Java虚拟机工具接口)进行字节码注入。它会加载目标类,并在指定注入点处修改类的字节码,以插入定义的操作。这样,Byteman就能够在运行时动态修改目标应用程序的行为。
  3. 规则执行:当目标应用程序在运行时到达规则定义的注入点时,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
  • 使用方法:
    1. IntelliJ IDEA 安装插件“Arthas Hot Swap”,从 gitHub Releases 下载安装包;
    2. 使用“mvn compile”编译相关工程
    3. 选择需要热部署的 java 源文件或者 class 文件,在类名或方法名上单击右键,选择“Arthas Hot Swap”的“Swap this class”,插件后台执行成功后会把热部署需要的命令复制到粘贴板;
    4. 登录远程服务器,管理员权限,粘贴热部署命令并执行,热部署完成,该机器运行着最新的class。机器第一次执行热部署命令,可能失败,再执行一次试下。
  • 使用限制:由于需要阿里云OSS作为传输字节码文件的介质,故应用服务器需要能够访问阿里云服务器。

框架对比

框架名称是否开源热更新限制使用限制活跃度
Spring Loaded最新版本1.2.8,更新时间:2017-09-05
JRebel最新版本2023.3.1
HotSwapAgent无法修改类层次结构。github更新中
DCEVM依赖gcc、仅支持JDK7/8已停止更新
Bytemangithub更新中
Arthas Hot Swap无法修改类名、方法名,无法修改类属性名称,
无法新增类属性,无法新增非静态方法,不支持修改内部类
由于需要阿里云OSS作为传输字节码文件的介质,
故应用服务器需要能够访问阿里云服务器。
github更新中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值