阿里巴巴正式开源自研动态非侵入AOP解决方案:JVM-Sandbox

 徐冬晨 

写在前面

随着软件部署规模的扩大,系统的功能的细化,系统间耦合度和链路复杂度不断加强。若要继续保持现规模系统的稳定性,需要实现并完善监控体系、故障定位分析、流量录制回放、强弱依赖检测、故障演练等支撑工具平台。出于对服务器规模和业务稳定性的考量,这些配套工具平台要具备对目标应用具有无侵入、实时生效、动态可插拔的特点。

要实现这些,多少都会触及到一块底层技术——动态字节码增强。如果每个工具都自己实现一套字节码增强逻辑,前期实现的门槛与后期维护成本高,且不同工具间相互影响造成不可预知的风险。如何屏蔽字节码增强技术的高门槛,降低研发运维成本,同时又能支持上层多个工具平台功能的快速实现和动态管理,成为阿里集团的目标。从去年开始潜心修行,创新的研发了一套实时无侵入的字节码增强框架。

于是 JVM-Sandbox 诞生了!

应用场景 JVM-Sandbox 的目标群体
  • Btrace 好强大,也曾技痒想做一个更便捷、更适合自己的问题定位工具,既可支持线上链路监控排查,也可支持单机版问题定位。

  • 有时候突然一个问题反馈上来,需要入参才能完成定位,但恰恰没有任何日志,甚至出现在别人的代码里,好想开发一个工具可以根据需要动态添加日志,最好还能按照业务 ID 进行过滤。

  • 系统间的异常模拟可以使用的工具很多,可是系统内的异常模拟怎么办,加开关或是用 AOP 在开发系统中实现,好想开发一个更优雅的异常模拟工具,既能模拟系统间的异常,又能模拟系统内的异常。

  • 好想获取行调用链路数据,可以用它识别场景、覆盖率统计等等,覆盖率统计工具不能原生支持,统计链路数据不准确。想自己开发一个工具获取行链路数据。

  • 我想开发录制回放、故障模拟、动态日志、行链路获取等等工具,就算我开发完成了,这些工具底层实现原理相同,同时使用,要怎么消除这些工具之间的影响,怎么保证这些工具动态加载,怎么保证动态加载 / 卸载之后不会影响其他工具,怎么保证在工具有问题的时候,快速消除影响,代码还原。

如果你有以上诉求,那么你就是 JVM-Sandbox 的潜在客户。JVM-Sandbox 提供动态增强类你所指定的类,获取你想要的参数和行信息;提供动态可插拔容器,管理基于 JVM-Sandbox 的模块。

JVM-Sandbox 能做什么?

在 JVM-Sandbox(以下简称沙箱)的世界观中,任何一个 Java 方法的调用都可以分解为BEFORERETURNTHROWS三个环节,由此在三个环节上引申出对应环节的事件探测流程控制机制。不仅如此还有LINE事件,可以完成代码行的记录。

// BEFORE-EVENT
try {

   /*
    * do something...
    */
    //LINE-EVENT
    a();
    // RETURN-EVENT
    return;

} catch (Throwable cause) {
    // THROWS-EVENT
}


基于BEFORERETURNTHROWS三个环节事件以及LINE事件,可以完成很多类 AOP 的操作。

  1. 可以感知和改变方法调用的入参

  2. 可以感知和改变方法调用返回值和抛出的异常

  3. 可以感知一个请求按顺序执行了哪些行

  4. 可以改变方法执行的流程

    • 在方法体执行之前直接返回自定义结果对象,原有方法代码将不会被执行

    • 在方法体返回之前重新构造新的结果对象,甚至可以改变为抛出异常

    • 在方法体抛出异常之后重新抛出新的异常,甚至可以改变为正常返回

JVM-Sandbox 都有哪些可能的应用场景
  • 线上故障定位

  • 线上系统流控

  • 线上故障模拟

  • 方法请求录制和结果回放

  • 动态日志打印

  • 安全信息监测和脱敏

  • 行链路计算和覆盖率统计

JVM 沙箱还能帮助你做很多很多,取决于你的脑洞有多大了。

JVM-Sandbox 在阿里集团的应用  线上故障演练

17 年故障演练平台在 JVM-Sandbox 基础上仅耗时 1 周即完成故障注入部分的系统重构。重构后的系统在挂载效率和挂载成功率方面有了明显的提升,极大的缩短的故障演练的时间,演练效率提升了数十倍。基于 JVM-Sandbox 改造后的故障演练平台,通用性强,所有基于 JVM 启动的系统均支持,极大的拓展了故障演练的范围,故障演练已达到集团级部署。

与 16 年故障演练数据对比,17 年的故障演练平台,覆盖 BU 提升了 1.6 倍,覆盖应用提升了 5 倍,覆盖场景提升了 37 倍。

 依赖检测

17 年强弱依赖自动化检测平台诞生。它提供了依赖检测、强弱分析、依赖扫描、故障注入等多种能力,底层能力基于 JVM-Sandbox 在 1 周内完成功能开发。利用其模块容器的特性,将前人开发的模块与新增模块一起挂载共同工作,完成平台功能。

强弱依赖梳理方面,承载了淘宝的系统强弱依赖梳理工作,260+ 个应用一键接入系统,并实现了 0 人工成本的自动化、智能化梳理。

 服务端录制隔离回放机制

在 JVM-Sandbox 基础上开发了一个 SS 模块,相当于一个录音机 + 回放机, 在调用中间件的时候, 顺序录制下了我们的中间件请求, 并且存储这份‘磁带’到服务器上。当我们需要隔离回放的时候, 将这份‘磁带’找到, 并且在需要的时候直接从‘磁带’读取, 并不需要真实地请求我们的中间件, 这样就保证了我们的读、写接口也能做到可重复使用,从而实现服务端的隔离回放。

线上录制隔离回放不仅极大的缩短的业务回归的耗时,把业务测试同学从繁琐的数据准备和接口自动化脚本的编写过程中解放出来,而且极大的拓展了覆盖范围,使回归的范围更贴近用户,且场景更丰富。

 精准回归

服务端录制隔离回放机制诞生之后,虽然有效的提升了覆盖范围,降低了自动化脚本的人工投入,但是也带来了新的问题。线上录制的场景是海量的,单个系统都可以达到万级、十万级甚至百万级别的录制,这些录制的场景中,存在大量的重复场景,如何识别重复场景,实现有效、精准的回放,成为新的待解决问题。

17 年在 JVM-Sandbox 的基础上,利用 LineEvnet 实现了行链路识别和标记,有效的提升了回放的精准度和效率。

JVM-Sandbox 在阿里集团已经实现全网部署,在其上加载不同的模块实现了不同的功能,每个功能根据 BU 和应用的需要进行加载:

  • 强弱依赖检测功能:覆盖淘宝、天猫、业务平台、菜鸟、飞猪、ICBU、CBU 等 7 个 BU,240+ 个应用;

  • 线上故障演练功能:覆盖集团客户体验事业群、淘宝网、云零售事业部、天猫、业务平台、飞猪、菜鸟、钉钉、阿里健康、CBU、集团安全、支付宝等 16 个 BU,391 个应用;

  • 服务端录制回放:覆盖淘宝网、钉钉 2 个 BU;

  • 精准回归:覆盖淘宝网、业务平台、钉钉 3 个 BU。

通过上边的事例,想必大家对 JVM-Sandbox 是什么,核心功能是什么,还能做哪些事情,以及是否可以为阿里以外的同学提供服务等问题更感兴趣了,下面我们着重介绍这部分内容。

JVM-Sandbox 技术背景

故障演练、强弱依赖检测、录制回放、精准回归,要解决这些问题本质就是如何完成 java 方法的环绕管控和运行时行链路的获取,即 AOP 框架的解决方案。目前常用 AOP 框架的解决方案有两种:proxy 和埋点。proxy 的优点在于已实现了统一的 API,减少了重复投入,但是不能实时生效,需要系统编译重启。埋点的优点在于动态生效灵活度高,但是没有统一 API。

要快速解决上边的四个问题,我们需要的 AOP 解决方案必须具备两个特性:

  • 动态可插拔,即实现埋点方式的统一的 API

  • 无侵入性,即解决 JVM 类隔离的问题

基于以上需求,我们研发了 JVM-Sandbox。

JVM-Sandbox 的核心功能

JVM-Sandbox 由纯 Java 编码完成,基于 JVMTI 技术规范,为观察和改变代码运行结果提供了即插即用模块接口的容器,提供核心功能:

  • 使用埋点技术提供统一的 API,来实现无需重启的 AOP 解决方案

  • 使用容器完成 JVM 类隔离,来解决侵入性问题

  • 提供容器管理机制,来完成各种容器的管理

JVM—Sandbox 的核心事件模型

BEFORE、RETURN 和 THROWS 三个环节事件的正常流转和干预流转


隔离和通讯

隔离:

  • 沙箱通过自定义的SandboxClassLoader破坏了双亲委派的约定,实现了和观察应用的类隔离。所以不用担心加载沙箱会引起应用的类污染、冲突。

  • 沙箱各模块之间类通过ModuleClassLoader实现了各自的独立,达到模块之间、模块和沙箱之间、模块和应用之间互不干扰。

通讯

  • 通过向 Bootstrap ClassLoader 中注入 Spy 类,完成观察应用与 JVM-Sandbox 的通讯

  • JVM-Sandbox 会将事件分发给各个 Module,完成 JVM-Sandbox 与 Module 之间的通讯


模块动态管理
  • 事件监控表,完成模块的管理

  • trasform 方法形变原生字节码


代码编织

插入 Spy 类到字节码中,Spy 方法中反射调用 JVM-Sandbox 的方法。

以 BeforeEvent 为例,进行代码编织展示。


整体架构


沙箱一共由三大核心功能组件构成

  1. 代码编织组件

    负责完成预设代码的重写和生效

  2. 事件处理分发组件

    负责完成事件的分发和方法流控控制的执行

  3. 模块管理组件

    负责控制和管理沙箱的各个模块

沙箱的底层提供了一个 HTTP-SERVER(Jetty),通过 HTTP 协议完成sandbox.sh和沙箱的控制交互,同时也给各个模块提供了基于 HttpServlet 和 WebSocket 规范的 API,各模块可以复用沙箱完成各自模块的控制与交互。

开源和共建

1、已开源,寻求更多的同学一起完善 JVM-Sandbox 的功能。Github 地址:

https://github.com/alibaba/JVM-Sandbox

2、希望有同学和我们一起共同完善 JVM-Sandbox 的功能;

3、希望更多的同学想到跟多的应用场景,并能开源出来供大家使用。

综上,JVM-Sandbox 是一个纯 java 编写的 AOP 解决方案。它为研发人员提供了一个快速实现字节码增强工具的平台。他的模块管理功能可以最大限度的复用模块、协同合作,减少重复投入。

随着 JVM-Sandbox 的开源,我们期待更多的人加入到功能扩张和优化上,使其适配更多的开源中间件和 JVM。

希望有更多的同学,发挥其聪明才智,开发更多、更好的上层模块,提供给自己和其他人的人使用。也希望能够利用好已有的模块,组装出新的工具平台和应用场景。

JVM-Sandbox 建设和应用期待大家共同建设。

作者介绍

徐冬晨,花名鸾伽,阿里巴巴测试开发专家,2010年加入阿里巴巴,先后负责商品平台、交易平台、手机淘宝的测试开发工作,一直致力用技术解决业务测试中遇到的各种问题,提升测试效率和系统稳定性。连续参与6年天猫双十一,在服务端稳定性方面,经验丰富、见解独到。

原文 

转载仅为学习交流,如冒犯请联系删除~

<think>好的,我需要帮助用户决定是否使用Jvm-sandbox-repeater工具还是自己实现类似的功能。用户之前询问过关于Goreplay和Jvm-sandbox-repeater的信息,现在想进一步了解选择现成工具还是自的优缺点。 首先,我应该回顾Jvm-sandbox-repeater的核心功能。它主要用于Java应用的流量录制和回放,通过字节码增强技术侵入式地监控方法调用,适合漏洞检测、回归测试等场景。用户可能在做毕设,涉及Java应用的安全检测或测试,需要评估工具是否满足需求。 接下来,用户的问题关键在于比较使用现有工具和自的利弊。我需要列出两者的优缺点,考虑时间成本、技术难度、功能需求、维护成本等因素。例如,Jvm-sandbox-repeater已经提供了成熟的录制和回放机制,节省发时间,但可能不够灵活;而自可以定制功能,但发周期长,技术要求高。 然后,我需要考虑用户的毕设要求和资源。如果毕设时间紧迫,或者用户对Java字节码增强技术不熟悉,推荐使用现成工具更合适。如果毕设的核心创新点在于实现一个独特的录制回放机制,或者现有工具无法满足特定需求,自可能更好。 还要分析用户可能的需求场景。比如,如果用户需要深度监控Spring Boot应用内部的方法调用和上下文,Jvm-sandbox-repeater已经支持这些,自可能需要重复造轮子。但如果用户的需求常特殊,比如需要集成特定的安全检测算法,现有工具扩展性不足,可能需要自。 另外,需要提醒用户注意技术风险。比如,使用Jvm-sandbox-repeater可能存在性能销,而自可能遇到技术难点如字节码操作、稳定性问题等。同时,维护成本也是一个因素,现成工具有社区支持,自则需要自己维护。 最后,结合用户之前的提问,他们的毕设可能涉及流量录制、漏洞检测,可能结合了Goreplay和Jvm-sandbox-repeater。需要建议在现有工具基础上进行扩展,或者根据需求选择最合适的方案,并给出具体场景的例子,帮助用户做出决策。</think>以下是关于**使用Jvm-sandbox-repeater工具**与**自实现**的深度对比分析,结合技术实现成本、功能完备性、毕设适配性等维度给出建议: --- ### 一、核心能力对比 | **维度** | **Jvm-sandbox-repeater** | **自实现** | |-------------------------|---------------------------------------------|---------------------------------------| | **功能范围** | 完整支持方法级录制/回放、上下文关联、MOCK参数注入 | 需自行实现核心功能模块 | | **技术门槛** | 依赖Java Agent+ASM字节码增强技术(已有封装) | 需深入掌握JVM TI、类加载机制、字节码操控 | | **发周期** | 1-3天集成配置 | 至少1-2个月(含调试) | | **稳定性** | 经过阿里生产环境验证 | 需自行解决兼容性问题(如Spring AOP冲突)| | **扩展性** | 支持插件发,但受限于框架设计 | 完全自主可控,可定制核心逻辑 | --- ### 二、关键决策因素 #### 1. **选择Jvm-sandbox-repeater的条件** - **场景符合性高** 若你的毕设需求与以下场景高度匹配,优先使用现成工具: - 需要录制`Spring Boot/Dubbo`接口的**方法调用链**(如监控`$$ UserService.findById(Integer\ id) $$`的入参和返回值) - 要求侵入式集成(无需修改业务代码) - 需要快速验证漏洞检测算法(直接利用其回放能力) - **代码示例:快速集成** 在Spring Boot启动脚本中添加Agent参数即可: ```bash java -javaagent:/path/to/sandbox-core.jar \ -Drepeater.config.path=/config/vuln-detection.json \ -jar your-application.jar ``` #### 2. **需要自的典型场景** - **特殊需求无法满足** - 需监控JVM语言组件(如Python服务调用) - 要求毫秒级延迟的录制(Jvm-sandbox默认有`$5\sim15ms$`的方法拦截销) - 需要定制化数据存储格式(如直接对接毕设的**图数据库**存储调用链路) - **学术创新需求** 若毕设核心价值在于**新型录制技术**(例如: $$ \text{基于因果推理的智能流量采样算法} $$ 则必须自以体现创新性) --- ### 三、风险-收益分析 #### 1. **使用现成工具的风险** | 风险类型 | 具体表现 | 应对方案 | |----------------|-----------------------------------------|---------------------------------------| | 性能损耗 | 高频方法调用可能导致`QPS下降10%~20%` | 仅录制关键接口,通过`@Module`注解排除核心类 | | 上下文丢失 | 无法自动捕获ThreadLocal以外的自定义上下文 | 通过`repeater-config.xml`手动补充采集逻辑 | | 版本兼容性 | 对Java 17+或GraalVM支持有限 | 降级到Java 11运行环境 | #### 2. **自实现的挑战** ```mermaid graph TD A[启动自项目] --> B{技术难点} B --> C[字节码增强稳定性] B --> D[上下文序列化] B --> E[回放一致性保障] C --> F((需反复测试ClassLoader机制)) D --> G((需处理不可序列化对象)) E --> H((需实现参数模糊化)) ``` --- ### 四、决策树模型 通过以下问题快速判断方向: 1. 毕设核心是否聚焦**录制回放技术本身**? - 是 → 自 - 否 → 使用工具 2. 是否需要深度关联**Java方法调用链与漏洞检测**? - 是 → Jvm-sandbox-repeater - 否 → 评估其他工具 3. 是否有足够时间攻克**JVM底层技术**? - 是 → 自(可提升论文技术深度) - 否 → 使用工具 --- ### 五、折中方案建议 #### **"工具改造"模式** 在Jvm-sandbox-repeater基础上扩展功能: 1. 添加自定义插件: ```java @MetaInfServices(Plugin.class) public class SQLInjectionPlugin implements Plugin { @Override public void watch(RepeaterConfig config) { config.registerEventListener(SqlExecuteEvent.class, (event) -> { String sql = event.getSql(); if (checkSQLi(sql)) { // 你的检测算法 reportVulnerability(event); } }); } } ``` 2. 修改数据上报模块,对接毕设的**威胁情报平台** #### **"混合架构"模式** - 使用Jvm-sandbox做基础数据采集 -**智能分析层**(如用机器学习模型分析录制的调用链) --- ### 六、结论 - **推荐选择Jvm-sandbox-repeater**,如果: - 毕设重点在漏洞检测算法而底层采集 - 时间有限且需快速产出Demo - **建议自**,如果: - 现有工具与需求存在根本性冲突 - 课题组有JVM专家提供技术支持 - 学术创新需要完全自主的技术方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值