无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

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

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

差异对比

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

使用场景

你是否遇到过以下的问题?

  • 线上有个用户请求一直不成功,我想在测试环境 Debug 一下,能帮我复现一下吗?
  • 压测流量不知道怎么构造,数据结构太复杂,压测模型也难以评估,有什么好的办法吗?
  • 不想写接口测试脚本了,我想做一个流量录制系统,把线上用户场景做业务回归,可能会接入很多服务系统,不想让每个系统都进行改造,有好的框架选择吗?
  • 我想做一个业务监控系统,对线上核心接口采样之后做一些业务校验,实时监控业务正确性

名词解释

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

技术原理

系统架构

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

「moonbox-agent」

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

「moonbox-server」

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


无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

系统流程图

「流量录制」

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

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

「流量回放」

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

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

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

「心跳请求」

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

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

「agent 加载」

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

本图描述了 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

功能介绍

  • 「流量录制」:流量录制模板管理,录制任务下发和录制流量查看

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

  • 「流量回放」:流量回放任务管理,回放数据查看成功率统计

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox


无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

  • 「回放 mock」:流量录制和回放特殊 mock(作为子调用 mock)

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

  • 「对比配置」:流量回放字段忽略配置

无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

传送门

开源协议:Apache2.0

开源地址:https://github.com/vivo/MoonBox

项目合集:https://github.com/OpenTechCol/OpenTechCol

「回复【加群】加入开源技术交流群,干货很多!」

-END-



原文始发于微信公众号(开源技术专栏):无侵入的线上 流量录制 和 流量回放 平台​ Moonbox

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/135557.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!