一飞开源,介绍创意、新奇、有趣、实用的免费开源应用、系统、软件、硬件及技术,一个探索、发现、分享、使用与互动交流的开源技术社区平台。致力于打造活力开源社区,共建开源新生态!
一、开源项目简介
Moonbox:月光宝盒
Moonbox(月光宝盒)是JVM-Sandbox生态下的,基于jvm-sandbox-repeater重新开发的一款流量回放平台产品。在jvm-sandbox-repeater基础上提供了更加丰富功能,同时便于线上部署和使用。
二、开源协议
使用Apache-2.0开源协议
三、界面展示
四、功能概述
使用场景
你是否遇到过以下的问题?
线上有个用户请求一直不成功,我想在测试环境Debug一下,能帮我复现一下吗?压测流量不知道怎么构造,数据结构太复杂,压测模型也难以评估,有什么好的办法吗?不想写接口测试脚本了,我想做一个流量录制系统,把线上用户场景做业务回归,可能会接入很多服务系统,不想让每个系统都进行改造,有好的框架选择吗?我想做一个业务监控系统,对线上核心接口采样之后做一些业务校验,实时监控业务正确性
Moonbox(月光宝盒)是一个无侵入的线上流量录制 和流量回放平台,沿用了jvm-sandbox-repeater的SPI设计,并提供了大量的常用插件,同时也提供数据统计和存储能力。通过Moonbox可以实现自动化测试、线上问题追踪、和业务监控等能力。
名词解释
-
录制:把一次请求的入参、出参、下游RPC、DB、缓存等序列化并存储的过程
-
回放:把录制数据还原,重新发起一次或N次请求,对特定的下游节点进行MOCK的过程
-
入口调用:入口调用一般是应用的流量来源,比如http/dubbo,在调用过程中录制调用入参,返回值。回放时作为流量发起和执行结果对比依据
-
子调用:区别于入口调用,子调用是调用执行过程中某次方法调用。子调用在录制时会记录该方法的入参、返回值;回放时用该返回值进行MOCK
-
MOCK:在回放时,被拦截的子调用不会发生真实调用,利用字节码动态干预能力,将录制时的返回值直接返回
-
降噪:在回放时,部分回放子调用入参或者回放流量响应结果和原始流量对比不一致字段,对这些非必要字段进行排除对比过程
功能介绍
-
流量录制:流量录制模板管理,录制任务下发和录制流量查看
-
流量回放:流量回放任务管理,回放数据查看成功率统计
-
回放mock:流量录制和回放特殊mock(作为子调用mock)
-
对比配置:流量回放字段忽略配置
MoonBox和Jvm-Sandbox-Repeater对比差异点
Moonbox(月光宝盒)是JVM-Sandbox生态下的,基于jvm-sandbox-repeater开发的一款流量回放平台产品,和jvm-sandbox-repeater差异如下:
差异对比
功能点 |
jvm-sandbox-repeater |
moonbox(月光宝盒) |
部署方式 |
前后端不分离,支持本地部署 |
前后端分离,支持本地和远程部署 |
插件数量 |
数量较少 |
数量多,基本覆盖常见中间件 |
agent稳定性 |
有部分bug待修复 |
经过vivo内部大量线上系统使用考验 |
数据储存 |
基于本地和mysql储存 |
使用ES储存,支持较大规模储存 |
平台易用性 |
功能较少 |
基于任务、接口维度管理录制、回放数据,拥有各种配置功能,易用性好 |
功能完备性 |
更多功能待支持 |
支持agent文件管理、任务管理、Mock管理、回放对比配置等各项能力 |
五、技术选型
Moonbox平台部署
资源准备
资源类型 |
资源版本 |
说明 |
jdk |
1.8 |
工程使用jdk版本 |
mysql |
5.x |
存储配置数据建表语句参考 |
elasticsearch |
7.x(推荐7.16.2) |
存储录制和回放 json数据 (es安装文档参考) |
虚拟机/容器 |
无 |
2台分别部署moonbox-server和VUE前端资源(server和vue也可以部署在一台机器) |
技术原理
系统架构图
月光宝盒平台分为2个部分,分别为moonbox-agent 和 moonbox-server
moonbox-agent
-
使用java-attach技术(实际的动态字节码增强由JVM-Sandbox实现)动态代理到目标进程上,提供流量录制和回放的增强
moonbox-server
-
agent端使用接口,提供配置查询、录制流量保存、流量查询、回放结果保存等服务
-
录制任务/回放任务的配置,agent任务远程管理能力和管理后台操作界面(前后端分离部署)
系统流程图
流量录制
流量录制的路径为【管理后台-流量录制】,此图描述了大致的流程。其中左侧为月光宝盒后台执行,右侧部分为目标JVM机器执行部分
流量回放
流量回放的路径有两个:【管理后台-流量录制-录制任务-流量回放】和【流量回放-失败回放/重新回放】。
sandbox-agent和moonbo-agent的下载流程,和上一节 流量录制 部分相同
心跳请求
流量录制和回放任务启动时,会同时启动心跳线程,通过对此心跳线程 管理目标JVM上装载的 agent。当录制任务和回放任务执行完毕(或状态异常)时,agent上心跳线程调用sandbox-jetty容器接口,进行sandbox和moonbox的agent卸载操作,此过程不影响目标JVM正常功能
agent加载
本图描述了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返回,没有匹配结果则抛出异常阻断流程,避免重复调用污染数据
示意图
六、源码地址
访问一飞开源:https://code.exmay.com/
原文始发于微信公众号(一飞开源):[开源]一款流量回放平台产品,无侵入线上流量录制和流量回放平台