引言
书接上回,JVM-Sandbox态拦截与录制,支持 HTTP、Dubbo、Java 方法调用等多种协议。录制内容包括请求参数、返回
核心概念
-
非侵入式流量录制与回放
基于 JVM-Sandbox 的字节码增强技术,无需修改应用代码即可实现流量的动态拦截与录制,支持 HTTP、Dubbo、Java 方法调用等多种协议。录制内容包括请求参数、返回值、异常及下游调用(如数据库、RPC)的完整链路信息,回放时通过 Mock 机制还原子调用行为。 -
插件化架构与扩展性
采用插件化设计,支持快速适配不同中间件(如 MyBatis、Redis),开发者可通过少量代码扩展自定义插件。例如,通过实现Plugin
接口定义新的协议拦截逻辑。 -
多租户与动态配置
支持多应用、多环境隔离管理,通过控制台(如repeater-console
)动态下发配置,实时调整采样率、Mock 策略等参数。例如,配置文件中可指定需要录制的入口方法(如hello.GreetingController#greeting
)。 -
事件驱动与上下文追踪
基于 TTL(Transmittable ThreadLocal)实现多线程调用链追踪,确保异步场景下录制数据的完整性。例如,Dubbo 异步调用时仍能关联上下游请求。
工作原理
-
字节码增强与事件触发
通过 Java Agent 机制挂载到目标 JVM,利用 ASM 动态修改目标类字节码,在方法调用前(BEFORE)、返回后(RETURN)、异常时(THROWS)插入埋点逻辑,触发事件通知。例如,拦截 Spring 的InvocableHandlerMethod#doInvoke
方法进行 HTTP 请求录制。 -
流量录制流程
- 入口调用拦截:如 HTTP 请求或 Dubbo 服务调用,记录入参和返回值。
- 子调用 Mock 标记:对下游的数据库查询或 RPC 调用生成唯一标识,回放时直接返回录制结果。
- 数据存储:将序列化的录制数据上报到控制台或本地存储(如 MySQL、ES)。
-
流量回放机制
- 请求构造:根据录制的入参重新发起请求,通过
Repeat-TraceId
标识回放任务。 - Mock 替换:拦截子调用(如 Redis 查询),根据录制数据返回预设结果,避免真实调用依赖。
- 结果对比:自动比对实际响应与录制值,生成差异报告(如字段缺失或数值偏差)。
- 请求构造:根据录制的入参重新发起请求,通过
使用示例
示例 1:HTTP 接口录制与回放
-
启动示例应用与控制台
# 启动 Spring Boot 示例服务 java -jar gs-rest-service-0.1.0.jar # 部署 repeater-console(需配置 MySQL) mvn install && java -jar repeater-console-start/target/repeater-console.jar
-
注入 Repeater 到目标 JVM
# 查找应用 PID ps -ef | grep gs-rest-service # 挂载 Sandbox ~/sandbox/bin/sandbox.sh -p <PID> -P 8000
-
通过控制台配置录制规则
在repeater-console
界面添加配置:{ "httpEntrancePatterns": ["^/greeting.*$"], "javaEntranceBehaviors": [{ "classPattern": "hello.GreetingController", "methodPatterns": ["greeting"] }] }
-
触发录制与回放
# 录制请求(携带 TraceId) curl 'http://localhost:8080/greeting?name=Test&Repeat-TraceId=test123' # 回放请求(添加 -X 后缀) curl 'http://localhost:8080/greeting?Repeat-TraceId-X=test123'
示例 2:Dubbo 接口录制
-
配置 Dubbo 插件
在repeater.properties
中启用 Dubbo 插件:pluginIdentities=http,dubbo-provider,dubbo-consumer
-
录制与回放验证
调用 Dubbo 服务后,控制台会自动记录服务提供者与消费者的入参和响应,回放时 Mock 下游服务调用。
关键注意事项
- 性能影响:线上建议控制采样率(如 1%),避免高频录制对 CPU 和内存的额外开销。
- 协议兼容性:需按需配置插件,例如 gRPC 需自定义拦截器。
- 环境隔离:回放时需确保测试环境与录制环境的依赖服务状态一致,避免因数据差异导致回放失败。
总结
JVM-Sandbox-Repeater 通过 非侵入式拦截 和 动态插件机制,解决了传统流量回放工具对代码侵入性强、协议支持有限的问题。其核心价值在于提供 全链路可观测性 和 快速问题复现能力,适用于线上故障排查、压测流量构造等场景。开发者可通过扩展插件(如支持 Kafka 消息录制)进一步适配企业级需求。