JVM-Sandbox-Repeater简介

引言

书接上回,JVM-Sandbox态拦截与录制,支持 HTTP、Dubbo、Java 方法调用等多种协议。录制内容包括请求参数、返回

核心概念

  1. 非侵入式流量录制与回放
    基于 JVM-Sandbox 的字节码增强技术,无需修改应用代码即可实现流量的动态拦截与录制,支持 HTTP、Dubbo、Java 方法调用等多种协议。录制内容包括请求参数、返回值、异常及下游调用(如数据库、RPC)的完整链路信息,回放时通过 Mock 机制还原子调用行为。

  2. 插件化架构与扩展性
    采用插件化设计,支持快速适配不同中间件(如 MyBatis、Redis),开发者可通过少量代码扩展自定义插件。例如,通过实现 Plugin 接口定义新的协议拦截逻辑。

  3. 多租户与动态配置
    支持多应用、多环境隔离管理,通过控制台(如 repeater-console)动态下发配置,实时调整采样率、Mock 策略等参数。例如,配置文件中可指定需要录制的入口方法(如 hello.GreetingController#greeting)。

  4. 事件驱动与上下文追踪
    基于 TTL(Transmittable ThreadLocal)实现多线程调用链追踪,确保异步场景下录制数据的完整性。例如,Dubbo 异步调用时仍能关联上下游请求。

工作原理

  1. 字节码增强与事件触发
    通过 Java Agent 机制挂载到目标 JVM,利用 ASM 动态修改目标类字节码,在方法调用前(BEFORE)、返回后(RETURN)、异常时(THROWS)插入埋点逻辑,触发事件通知。例如,拦截 Spring 的 InvocableHandlerMethod#doInvoke 方法进行 HTTP 请求录制。

  2. 流量录制流程

    • 入口调用拦截:如 HTTP 请求或 Dubbo 服务调用,记录入参和返回值。
    • 子调用 Mock 标记:对下游的数据库查询或 RPC 调用生成唯一标识,回放时直接返回录制结果。
    • 数据存储:将序列化的录制数据上报到控制台或本地存储(如 MySQL、ES)。
  3. 流量回放机制

    • 请求构造:根据录制的入参重新发起请求,通过 Repeat-TraceId 标识回放任务。
    • Mock 替换:拦截子调用(如 Redis 查询),根据录制数据返回预设结果,避免真实调用依赖。
    • 结果对比:自动比对实际响应与录制值,生成差异报告(如字段缺失或数值偏差)。

使用示例

示例 1:HTTP 接口录制与回放
  1. 启动示例应用与控制台

    # 启动 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
    
  2. 注入 Repeater 到目标 JVM

    # 查找应用 PID
    ps -ef | grep gs-rest-service
    
    # 挂载 Sandbox
    ~/sandbox/bin/sandbox.sh -p <PID> -P 8000
    
  3. 通过控制台配置录制规则
    repeater-console 界面添加配置:

    {
      "httpEntrancePatterns": ["^/greeting.*$"],
      "javaEntranceBehaviors": [{
        "classPattern": "hello.GreetingController",
        "methodPatterns": ["greeting"]
      }]
    }
    
  4. 触发录制与回放

    # 录制请求(携带 TraceId)
    curl 'http://localhost:8080/greeting?name=Test&Repeat-TraceId=test123'
    
    # 回放请求(添加 -X 后缀)
    curl 'http://localhost:8080/greeting?Repeat-TraceId-X=test123'
    
示例 2:Dubbo 接口录制
  1. 配置 Dubbo 插件
    repeater.properties 中启用 Dubbo 插件:

    pluginIdentities=http,dubbo-provider,dubbo-consumer
    
  2. 录制与回放验证
    调用 Dubbo 服务后,控制台会自动记录服务提供者与消费者的入参和响应,回放时 Mock 下游服务调用。

关键注意事项

  1. 性能影响:线上建议控制采样率(如 1%),避免高频录制对 CPU 和内存的额外开销。
  2. 协议兼容性:需按需配置插件,例如 gRPC 需自定义拦截器。
  3. 环境隔离:回放时需确保测试环境与录制环境的依赖服务状态一致,避免因数据差异导致回放失败。

总结

JVM-Sandbox-Repeater 通过 非侵入式拦截动态插件机制,解决了传统流量回放工具对代码侵入性强、协议支持有限的问题。其核心价值在于提供 全链路可观测性快速问题复现能力,适用于线上故障排查、压测流量构造等场景。开发者可通过扩展插件(如支持 Kafka 消息录制)进一步适配企业级需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值