Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

Moonbox(月光宝盒)是JVM-Sandbox生态下的,基于jvm-sandbox-repeater重新开发的一款流量回放平台产品。在jvm-sandbox-repeater基础上提供了更加丰富功能,同时便于线上部署和使用,更多对比参考。

使用场景

Moonbox(月光宝盒)是一个无侵入的线上流量录制流量回放平台,沿用了jvm-sandbox-repeater的SPI设计,并提供了大量的常用插件,同时也提供数据统计和存储能力。通过Moonbox可以实现自动化测试、线上问题追踪、和业务监控等能力

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

名词解释

  • 录制:把一次请求的入参、出参、下游RPC、DB、缓存等序列化并存储的过程
  • 回放:把录制数据还原,重新发起一次或N次请求,对特定的下游节点进行MOCK的过程
  • 入口调用:入口调用一般是应用的流量来源,比如http/dubbo,在调用过程中录制调用入参,返回值。回放时作为流量发起和执行结果对比依据
  • 子调用:区别于入口调用,子调用是调用执行过程中某次方法调用。子调用在录制时会记录该方法的入参、返回值;回放时用该返回值进行MOCK
  • MOCK:在回放时,被拦截的子调用不会发生真实调用,利用字节码动态干预能力,将录制时的返回值直接返回
  • 降噪:在回放时,部分回放子调用入参或者回放流量响应结果和原始流量对比不一致字段,对这些非必要字段进行排除对比过程

功能介绍

  • 流量录制:流量录制模板管理,录制任务下发和录制流量查看
  • 流量回放:流量回放任务管理,回放数据查看成功率统计
  • 回放mock:流量录制和回放特殊mock(作为子调用mock)
  • 对比配置:流量回放字段忽略配置

系统架构图

月光宝盒平台分为2个部分,分别为moonbox-agent 和 moonbox-server

moonbox-agent

  • 使用java-attach技术(实际的动态字节码增强由JVM-Sandbox实现)动态代理到目标进程上,提供流量录制和回放的增强

moonbox-server

  • agent端使用接口,提供配置查询、录制流量保存、流量查询、回放结果保存等服务
  • 录制任务/回放任务的配置,agent任务远程管理能力和管理后台操作界面(前后端分离部署)

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

系统流程图

流量录制

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

流量录制的路径为【管理后台-流量录制】,此图描述了大致的流程。其中左侧为月光宝盒后台执行,右侧部分为目标JVM机器执行部分

流量回放

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

流量回放的路径有两个:【管理后台-流量录制-录制任务-流量回放】和【流量回放-失败回放/重新回放】。

sandbox-agent和moonbo-agent的下载流程,和上一节 流量录制 部分相同

心跳请求

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

流量录制和回放任务启动时,会同时启动心跳线程,通过对此心跳线程 管理目标JVM上装载的 agent。当录制任务和回放任务执行完毕(或状态异常)时,agent上心跳线程调用sandbox-jetty容器接口,进行sandbox和moonbox的agent卸载操作,此过程不影响目标JVM正常功能

agent加载

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

本图描述了Sandbox agent和Moonbox agent 启动的流程,包括 目标java进程attach操作,jetty服务启动和流量回放插件加载示意

核心原理

录制回放原理

录制和回放流程沿用 jvm-sandbox-repeater设计,舍弃了一些非主流程功能。

流量录制 核心逻辑录制协议基于JVM-Sandbox的BEFORE、RETRUN、THROW事件机制进行录制流程控制,详见DefaultEventListener

流量回放 基于 FlowDispather 进行回放流量分发,每个类型回放插件实现RepeaterSPI完成回放请求发起;每次回放请求可决定本地回放是否mock,插件也自由实现mock逻辑,mock流程代码

mock回放:回放流量子调用(eg:mybatis/dubbo)不发生真实调用,从录制子调用中根据 MockStrategy 搜索匹配的子调用,利用JVM-Sandbox的流程干预能力,有匹配结果,进行throwReturnImmediately返回,没有匹配结果则抛出异常阻断流程,避免重复调用污染数据

示意图

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

流量录制

新增/编辑模板

操作路径为:【流量录制-新增模板/编辑】。下面按照页面区域讲解配置项

基础信息配置

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

应用名称: server端接口 /api/app/appNameList 返回,server部署前需修改为用户自身应用标识。需要注意的是,jvm参数需包含该应用标识,否则”远程录制“方式无法启动

单接口采集量:单个接口的最大采集量

任务运行时长:录制任务运行时长,超过该时长后,录制任务为自动关闭

流量采集配置

录制的流量类型,目前平台支持 http接口,dubbo接口和java方法的录制。

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

http接口

http uri: 填写http接口相对地址,支持path variable方配置,如/api/thread/{}

采样率: 流量录制采样比率,最大值为 10000,最小值为1

dubbo接口

接口名称: 支持正则表达式。采集某个具体接口:com.vivo.test.query.TestRecordApi、采集所有接口:.*

接口方法: 支持正则表达式。采集某个具体方法名:testRecord、采集所有方法:.*

java方法录制

java方法录制比较特殊,由于是依托于spring实现,因此有如下限制:

  1. 被录制的方法必须在被Spring容器托管的 bean 中
  2. 录制的Java方法必须是 无入参、无返回值 的方法,例如被 @Scheduled 注解修饰定时任务方法
  3. 必须提供一个 获取Spring上下文的静态方法 ,如下所示
  4. @Component public class ApplicationContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextUtils.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } }

如下图所示,在java方法采集配置时,需要在此处填写上下文方法

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

高级选项

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

插件类型:展示所有支持的插件(即子调用)类型,点击选择本次使用插件。若录制的接口包含该类型子调用但 未选择该插件,则 录制时不会记录该子调用数据;回访时无法对子调用进行mock

运行录制任务

step1:运行录制任务

选择上一步创建的录制模板,点击运行按钮,填写 目标 java进程 所在机器的ip、ssh端口、用户名 和密码。点击执行

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

step2:运行成功

执行成功后,在流量录制功能页会 展示启动成功的任务。在此界面进行任务的停止、查看任务日志、查看录制流量详情等功能

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

录制与查看

step1:运行接口执行录制

若配置的录制接口有访问流量,且被采样成功,则会在下图出显示。采集的流量数据会在列表分页展示

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

step2:流量详情

点击“详情”按钮可以查看该条录制的流量详情。包括请求的参数、响应参数 和 该请求的 子调用列表

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

step3:子调用详情

点击某个子调用,可以查看子调用的详情。包括子调用的入参和响应结果。下图以mybatis子调用举例

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

流量回放

流量回放操作有两个入口:一个为【流量录制-录制模板-执行任务-流量回放】,另一个为【流量录制-流量回放-回放任务列表-(失败回放/重新回放)】

录制处回放

录制处回放入口如下图所示:

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

基础信息配置

需要进行回放的数据可以手动选择配置;执行机器处填写 需要回放的 JVM进程 ip、端口、用户名和密码。

Moonbox:基于JVM-Sandbox无侵入的线上流量录制和流量回放平台

项目地址:https://github.com/vivo/MoonBox/


友情提醒: 请添加客服微信进行免费领取流量卡!
QQ交流群:226333560 站长微信:qgzmt2

原创文章,作者:sunyaqun,如若转载,请注明出处:https://www.dallk.cn/2344.html

(0)
sunyaqunsunyaqun
上一篇 2023年9月25日
下一篇 2023年9月25日

相关推荐

发表回复

登录后才能评论