混沌工程工具:业务代码注入原理(4)

2023-10-10 15:12:45 浏览数 (1)

业务代码的混沌

可能是大规模企业级的应用,大都是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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞