stripping some external object storage dependencies.
jvm-sandbox-repeater是JVM-Sandbox生态体系下的重要模块,它具备了JVM-Sandbox的所有特点,插件式设计便于快速适配各种中间件,封装请求录制/回放基础协议,也提供了通用可扩展的各种丰富API。
如果你有以上的想法或需求,jvm-sandbox-repeater 都将是你的不二选择方案;框架基于JVM-Sandbox,拥有JVM-Sandbox的一切特性,同时封装了以下能力:
对于Java调用,一次流量录制包括一次入口调用(entranceInvocation)(eg:HTTP/Dubbo/Java)和若干次子调用(subInvocations)。流量的录制过程就是把入口调用和子调用绑定成一次完整的记录,框架抽象了基础录制协议,调用的组装由调用插件(InvokePlugin)来完成,需要考虑解决的核心问题:
entranceInvocation
subInvocations
invocation
框架的核心逻辑录制协议基于JVM-Sandbox的BEFORE、RETRUN、THROW事件机制进行录制流程控制,详见DefaultEventListener:
BEFORE
RETRUN
THROW
基于TTL解决跨线程上下文传递问题,开启RepeaterConfig.useTtl之后支持多线程子调用录制 开放插件定义enhance埋点/自定义调用组装方式快速实现插件适配 Invocation抽象Identity统一定位由插件自己扩展实现 基于Tracer实现应用内链路追踪、采样;同时支持多种过滤方式,插件可自由扩展;
基于TTL解决跨线程上下文传递问题,开启RepeaterConfig.useTtl之后支持多线程子调用录制
RepeaterConfig.useTtl
开放插件定义enhance埋点/自定义调用组装方式快速实现插件适配
Invocation抽象Identity统一定位由插件自己扩展实现
基于Tracer实现应用内链路追踪、采样;同时支持多种过滤方式,插件可自由扩展;
public void onEvent(Event event) throws Throwable { try { /* * event过滤;针对单个listener,只处理top的事件 */ /** -------- **/ /* * 初始化Tracer开启上下文追踪[基于TTL,支持多线程上下文传递] */ /** -------- **/ /* * 执行基础过滤 */ /** -------- **/ /* * 执行采样计算 */ /** -------- **/ /* * processor filter */ /** -------- **/ /* * 分发事件处理 */ } catch (ProcessControlException pe) { /* * sandbox流程干预 */ } catch (Throwable throwable) { /* * 统计异常 */ } finally { /* * 清理上下文 */ } }
流量回放,获取录制流量的入口调用入参,再次发起调用。注意:读接口或者幂等写接口可以直接回放,否则在生产环境请谨慎使用,可能会造成脏数据;用户可自行选择mock回放或者非mock,回放过程要解决的核心问题:
回放过程通过异步EventBus方式订阅回放请求;基于FlowDispather进行回放流量分发,每个类型回放插件实现RepeaterSPI完成回放请求发起;每次回放请求可决定本地回放是否mock,插件也自由实现mock逻辑,mock流程代码
mock回放:回放流量子调用(eg:mybatis/dubbo)不发生真实调用,从录制子调用中根据 MockStrategy 搜索匹配的子调用,利用JVM-Sandbox的流程干预能力,有匹配结果,进行throwReturnImmediately返回,没有匹配结果则抛出异常阻断流程,避免重复调用污染数据
throwReturnImmediately
public void doMock(BeforeEvent event, Boolean entrance, InvokeType type) throws ProcessControlException { /* * 获取回放上下文 */ RepeatContext context = RepeatCache.getRepeatContext(Tracer.getTraceId()); /* * mock执行条件 */ if (!skipMock(event, entrance, context) && context != null && context.getMeta().isMock()) { try { /* * 构建mock请求 */ final MockRequest request = MockRequest.builder() ... .build(); /* * 执行mock动作 */ final MockResponse mr = StrategyProvider.instance().provide(context.getMeta().getStrategyType()).execute(request); /* * 处理策略推荐结果 */ switch (mr.action) { ... } } catch (ProcessControlException pce) { throw pce; } catch (Throwable throwable) { ProcessControlException.throwThrowsImmediately(new RepeatException("unexpected code snippet here.", throwable)); } } }
Java生态中间件及各种框架众多,各公司技术选型差异较大没办法统一适配,目前适配了几款常用插件作为示例,如有需求可以通过issue方式提交,同时也欢迎大家来贡献开发插件
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802032778号
基于JVM-Sandbox的录制/回放通用解决方案
目标人群 - 面向测试开发工程师
如果你有以上的想法或需求,jvm-sandbox-repeater 都将是你的不二选择方案;框架基于JVM-Sandbox,拥有JVM-Sandbox的一切特性,同时封装了以下能力:
项目简介
repeater的核心能力是什么?
1. 通用录制/回放能力
2. 快速可扩展API实现
3. standalone工作模式
repeater的可以应用到哪些场景?
1. 业务快速回归
2. 线上问题排查
3. 压测流量准备
4. 实时业务监控
核心原理
流量录制
对于Java调用,一次流量录制包括一次入口调用(
entranceInvocation)(eg:HTTP/Dubbo/Java)和若干次子调用(subInvocations)。流量的录制过程就是把入口调用和子调用绑定成一次完整的记录,框架抽象了基础录制协议,调用的组装由调用插件(InvokePlugin)来完成,需要考虑解决的核心问题:invocation唯一定位,保障回放时精确匹配框架的核心逻辑录制协议基于JVM-Sandbox的
BEFORE、RETRUN、THROW事件机制进行录制流程控制,详见DefaultEventListener:流量回放
流量回放,获取录制流量的入口调用入参,再次发起调用。注意:读接口或者幂等写接口可以直接回放,否则在生产环境请谨慎使用,可能会造成脏数据;用户可自行选择mock回放或者非mock,回放过程要解决的核心问题:
回放过程通过异步EventBus方式订阅回放请求;基于FlowDispather进行回放流量分发,每个类型回放插件实现RepeaterSPI完成回放请求发起;每次回放请求可决定本地回放是否mock,插件也自由实现mock逻辑,mock流程代码
合作共建的公司团队
已支持的插件列表
相关文档
钉钉交流群