业务代码的混沌
可能是大规模企业级的应用,大都是Java编写、并且Java提供了方便的API,可以在不修改Java代码的情况下,直接运行时编辑Java字节码,实现运行时改变程序的默认行为,达到在具体的Java函数上实现延迟、错误等效果。
Chaosblade、Chaos-mesh这两个工具,都提供了Java程序的应用注入。Chaosblade使用的是阿里自研的Jvm-sandbox;chaos-mesh使用的是Jboss开源的Byteman。他们本质上都是通过修改字节码来实现了故障注入。下面我们来简单梳理下Java的基础知识,方便理解他们具体是怎么实现的。
混沌工程工具系列传送门:
1、 混沌工程工具:Chaos-mesh与Chaosblade技术实现与原理分析(1)-腾讯云开发者社区-腾讯云
2、 混沌工程工具:chaos-mesh注入项原理分析(2)-腾讯云开发者社区-腾讯云
3、 混沌工程工具:chaosblade在服务器上注入项原理分析(3)-腾讯云开发者社区-腾讯云
4、 混沌工程工具:业务代码注入原理(4)-腾讯云开发者社区-腾讯云
5、 混沌工程工具:Chaosblade Java业务代码注入原理(5)-腾讯云开发者社区-腾讯云
6、 混沌工程工具:混沌工程实施过程及持久价值(7)-腾讯云开发者社区-腾讯云
7、 混沌工程工具:混沌工程定位及原则梳理(8)-腾讯云开发者社区-腾讯云
8、 混沌工程工具:一个混沌工程设计的例子(9)-腾讯云开发者社区-腾讯云
Java基础知识
Java程序运行概述
如下图,Java程序从编写到执行,大概经历几个步骤:
1、 我们编写的文本源代码(.Java结尾文件)
2、 通过编译,Java源代码被编译成字节码(Bytecode)。这个编译过程由Java编译器完成,生成的字节码文件以.class扩展名保存。此时这些代码就可以被JVM解释了
3、 即时编译(Just-In-Time Compilation,JIT):在运行时,JVM可以使用JIT编译器将字节码转换为本机机器码。这个过程是动态的,针对特定的硬件和操作系统进行优化。
总结来说,Java程序通过JVM运行,JIT编译器将字节码转换为本机代码,这使得Java具有跨平台性,因为JVM提供了一个抽象层,使Java程序能够在不同的操作系统和硬件上运行。本机代码生成和执行是在程序运行时动态发生的,以提高性能。
Jvm字节码注入原理
Java从1.5开始提供java.lang.instrument包,为检测Java程序提供API,用于监控、收集性能数据、诊断故障等。主要接口有ClassFileTransformer、Instrumentation。
ClassFileTransformer用于实现类文件的字节码级别转换,Instrumentation用于将ClassFileTransformer接口的具体实现注册JVM,以便ClassFileTransformer生效。Instrumentation是在premain()函数中实现,以在Java主程序启动前启动。
Byteman与jvm-sandbox对比
Byteman
Byteman官网:https://downloads.jboss.org/byteman/4.0.18/byteman-programmers-guide.html
Byteman是一款强大的Java字节码注入工具,用于在运行时修改Java应用程序的字节码。它允许开发人员在不修改源代码的情况下,动态地插入、修改和删除代码,以进行调试、性能分析和故障排除。Byteman广泛用于Java应用程序的测试和调试,它能够帮助开发人员快速定位和解决问题,同时也支持在生产环境中进行故障注入和监控。这使得Byteman成为Java开发中强大的工具,用于提高应用程序的可维护性和可靠性。
jvm-sandbox
JVM-busybox官网:https://github.com/alibaba/jvm-sandbox
JVM-Sandbox是一个用于Java虚拟机(JVM)的安全沙盒环境,用于隔离和限制Java应用程序的权限和资源访问。它通过运行Java应用程序在受控的环境中,实现了安全性和隔离性,以防止恶意代码或不受信任的代码对系统造成损害。JVM-Sandbox可用于保护系统免受潜在的恶意攻击,同时允许运行不受信任的代码,提供了一种可控的方式来管理Java应用程序的权限和资源使用。
对比
对比维度 | Byteman | jvm-sandbox |
---|---|---|
开源企业 | Jboss | alibaba |
底层原理 | 基于Java attach API修改ByteCode | 基于Java attach API修改ByteCode |
设计理念 | 原生字节码操作 | JVM层的AOP |
支持事件 | ENTRY/EXIT/LINE/READ/WRITE/INVOKE/NEW/SYNCHRONIZE/THROW/EXCEPTION等更细粒度的事件 | 支持BEFORE、RETURN、THROW三类事件 |
上手难度 | 支持ECA规则文件,无需编程即可实现注入 | 需编写Java插件以获取注入对象的class、method及注入位置 |
文档 | 十分丰富 | 几乎没有 |
总结
如果自研工具,推荐使用Byteman,因为是Jboss开源,权威度有保证,上手难度低,支持丰富的注入事件。借助这些字节码篡改技术,原来的PaaS产品在平台侧无法注入故障的时代一去不复返了;可以借助应用层注入延迟、失败等工具,模拟PaaS产品本身的性能、底层硬件故障造成的影响。
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表