jvm-sandbox-repeater 实现以及思考
2021-11-07 18:36:29 0 举报
阿里开源流量回放录制框架的一些个人学习以及思考,有疑问留言交流~
作者其他创作
大纲/内容
插件
8. 通过找到repeater-module的http接口@Command(\"repeat\")模块,根据参数进行重构回放
1. 请求类被增强
配置管理 : 负责维护规则配置
模块启动流程
非Mock
repeater-module回放模块
2. 查找console中的服务配置
LifecycleManager插件的生命周期管理
关于类增强
微服务A
得到线上mock结果
repeater-console-start回放控制台
在线流量
6. 数据存储
http插件
5. 得到结果
repeater-module作用1. 应用启动时主动去寻找console应用,读取该应用的配置管理数据2. 基于console的配置来决定对微服务应用的哪些类做增强。3. 对增强的类进行流量的收集
1. 方法逻辑
List<Repeater> loadRepeaters(); 加载回放器,配置管理中的JSON的repeatIdentities属性
回放
9. 将回放结果以broadcaster.repeat.url配置发送
初始化逻辑: 1. 应用启动脚本中会涵盖agent的启动沙箱环境2. 回放模块会去cfg配置的repeater.properties中去找console中中该服务的增强配置3. 根据console返回的增强配置加载对应的插件,并增强对应的类。4. 同时开启定时任务主动上传心跳给console-------------至此类增强的工作完成------------
1. 集成沙箱环境启动
需要被增强的类的配置 : com.alibaba.jvm.sandbox.repeater.plugin.domain.RepeaterConfig稍微解释下这个配置- httpEntrancePatterns : 由于HTTP接口的量太大(前后端未分离的情况可能还有静态资源)因此必须走白名单匹配模式才录制- javaEntranceBehaviors : java入口插件动态增强的行为- javaSubInvokeBehaviors : java子调用插件动态增强的行为- pluginIdentities : 需要启动的插件- repeatIdentities : 回放器插件这里的javaEntranceBehaviors是主入口,就好比java方法的主入口。子调用可以理解为从主入口进去之后,调用的其他方法。
...
1. 回放模块增强类逻辑
流量存储层
jvm-sandbox 沙箱环境
配置模块
根据参数匹配线上存储的子调用
1.2. 设置缓存
3. 调用其他服务
在线模块
2. 录制回放逻辑
List<InvokePlugin> loadInvokePlugins() : 基于SPI加载插件列表,配置管理JSON的pluginIdentities属性
规则配置
微服务B
void release(); 释放资源
1.1 查找数据库
List<SubscribeSupporter> loadSubscribes(); 加载事件订阅支持SPI
sandbox-module自定义模块
cfg/repeater.properties : 记录的都是console相关的接口地址# 录制消息投递地址broadcaster.record.url=http://127.0.0.1:8001/facade/api/record/save# 回放结果投递地址broadcaster.repeat.url=http://127.0.0.1:8001/facade/api/repeat/save# 回放消息取数据地址repeat.record.url=http://127.0.0.1:8001/facade/api/record/%s/%s# 配置文件拉取地址repeat.config.url=http://127.0.0.1:8001/facade/api/config/%s/%s# 心跳上报配置repeat.heartbeat.url=http://127.0.0.1:8001/module/report.json# 是否开启脱机工作模式repeat.standalone.mode=false# 是否开启spring advice拦截repeat.spring.advice.switch=false;
Mysql
public void process() {
ElasticSearch
repeater-module回放模块2. 判断访问是否属于增强的请求或者方法主入口3. 收集方法信息、参数、返回值4. 发送到broadcaster.record.url的地址
流量列表
2. 拓展业务 , 持久层操作?
4. 发送消息队列
5. 发送数据
通过agent方式引入沙箱模块,并通过http感知配置
直接执行
4. 构建定时任务,定时服务心跳
思考 : 假设要把线上的流量进行录制,回放到测试环境,而测试环境这个包刚好对功能进行迭代升级过,也就是process的第二步。- 在回放过程中肯定参数匹配不上,所以得不到Mock的结果。- 如果第二步的操作直接影响后续的结果,那么这次对比是失败的。- 如果是操作持久层,会产生no matching invocation found异常。
7. 希望回放流量到微服务B环境
redis插件
通过agent方式引入沙箱模块
微服务应用
hbase
Myabtis插件
当前方法执行的结果和线上录制的方法结果匹配,来判定此次回放是否正确
3. 返回配置,并开始内部增强
消息队列插件
1. 通过沙箱的生命周期回调的自启动类来触发录制回放模块的初始化==com.alibaba.jvm.sandbox.repeater.module.RepeaterModule#loadCompleted()----1. 基于StandaloneSwitch来判断当前环境是单机还是集群,来构建配置模块----2. 加载cfg目录下repeater.properties的配置.【其实就是关于console相关地址,这里需要注意如果console地址不对,或者没有启动,会重试请求100次,才会失败。】----3. 定时拉取配置文件改动1.1 开始基于配置文件初始化插件模块: com.alibaba.jvm.sandbox.repeater.module.RepeaterModule#initialize--- 主要还是根据LifecycleManager的生命周期规则来完成1.2 构建HeartbeatHandler来定时发送心跳给console,告诉自己还存活。
Mock
0 条评论
下一页