首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >混沌工程工具:业务代码注入原理(4)

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

原创
作者头像
AIOPS
修改2023-10-10 15:12:45
5561
修改2023-10-10 15:12:45
举报
文章被收录于专栏:高可用高可用

业务代码的混沌

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 业务代码的混沌
    • 混沌工程工具系列传送门:
    • Java基础知识
      • Java程序运行概述
      • Byteman与jvm-sandbox对比
        • Byteman
          • jvm-sandbox
            • 对比
            • 总结
            相关产品与服务
            混沌演练平台
            混沌演练平台(Chaotic Fault Generator)提供高效便捷、安全可靠的故障演习服务,除可视化故障注入服务外,还提供行业经验模板,监控护栏等核心功能,致力于帮助用户及时发现业务容灾隐患、验证高可用预案的有效性,从而提高系统的可用性和韧性。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档