一飛開源,介紹創意、新奇、有趣、實用的免費開源應用、系統、軟體、硬體及技術,一個探索、發現、分享、使用與互動交流的開源技術社群平台。緻力于打造活力開源社群,共建開源新生态!
一、開源項目簡介
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/