easy-byte-coder 一款字节码注入框架,在 JVM 平台非侵入式字节码注入的解决方案,帮助java应用开发者,快速开发字节码注入程序,无需关心底层instrument原理以及实现细节,用户使用plugin的形式快速提供aop能力,并且可以选择使用静态编织(agent)与动态编织(attach)两种方案,plugin编写起来非常简单,并且提供http接口方便随时卸载。
Attach(动态注入)模式时,此工具依赖被注入应用的jvm运行时的环境变量,请确认JAVA_HOME是否存在,Agent(静态注入)模式无需此配置
attach模式启动:
java -Xbootclasspath/a:$JAVA_HOME/lib/tools.jar -jar bootstrap.jar
选择注入进程:
如果输出:
Attaching to target JVM with PID: 91420
Attached to target JVM and loaded Java agent successfully
则表示注入成功
卸载:
打开游览器,输入以下url
http://127.0.0.1:8089/server?uninstall
console输出:
Remove Instrumentation className:xxxx
xxx为被修改的类名,此时卸载成功
在一些情况下,如修改jdk源码,对jdk的方法进行注入,或是启动时就需要进行大量的修改,此时可以使用agent模式
agent通过增加jvm参数启动plugins=后的jar包名是 easy-byte-coder编译后生成的jar包
agent模式启动:
-javaagent:/Users/xujie/work/ymm/jar/agent.jar=plugins=systemtime.jar
用户根据框架要求,继承接口,指定需要修改字节码的class中的method的切点进行注入,目前允许用户使用的切点范围:
- LocalVariables 在方法中加入局部变量
- Before 在方法运行之前修改
- After 在方法返回之前修改
- Catch 自定义捕获方法异常
- Body 替换整个方法体
通过不同的classLoade实现类隔离,使应用类与easy-byte-coder类不会相互干扰,并且实现了资源管理器ResourceObjectPool,使得用户可以方便的切换获取应用空间运行时类加载器与easy-byte-coder类加载器,方便用户调用应用空间的类对象,复用原有应用提供的一些基础功能,无需重新在easy-byte-coder中编写,加速开发效率。
类资源的统一管理工具,使用户方便的获取“应用空间”运行时加载的类与获取Zodiac空间加载的类
采用java spi机制加载plugin,方便用户编写plugin,只需继承接口,编写接口中需要实现的方法,即可完成对应用的字节码注入,无需关心底层原理
需要快速开发字节码注入应用的场景如:
- 无侵入的打点上报
- 无侵入的线上故障模拟
- 无侵入的线上错误代码的临时修复
- 本地调试代码时无感知的mock数据返回
- 线上流量录制回放结果对比
- Virgo 微服务本地mock调试工具
- Gemini 微服务流量录制回放工具