月光寶盒(vivo流量錄制回放平臺(tái))正式對(duì)外開源
作者:vivo 互聯(lián)網(wǎng)服務(wù)器團(tuán)隊(duì)- Liu Yanjiang
月光寶盒是一個(gè)基于流量錄制回放的自動(dòng)化測(cè)試平臺(tái),通過(guò)錄制回放取代編寫腳本進(jìn)行自動(dòng)化回歸,提升測(cè)試效率和覆蓋率。因?yàn)槠浣鉀Q方案具有很強(qiáng)的通用性,所以我們把這它開源出來(lái),希望能幫助到有需要的用戶。
一、月光寶盒 是什么?
Moonbox(月光寶盒)是?JVM-Sandbox?生態(tài)下的一款流量錄制回放產(chǎn)品。所謂流量錄制回放是服務(wù)端通過(guò)掛載agent探針自動(dòng)注冊(cè)到服務(wù)端,攔截服務(wù)端調(diào)用,將所有外部調(diào)用依賴的內(nèi)容(如數(shù)據(jù)庫(kù)、分布式緩存、外部服務(wù)響應(yīng)等)進(jìn)行完整記錄形成錄制流量。其核心價(jià)值是通過(guò)錄制流量數(shù)據(jù),將流量數(shù)據(jù)轉(zhuǎn)化成可復(fù)用、可執(zhí)行的自動(dòng)化用例,快速在測(cè)試環(huán)境中進(jìn)行回放比對(duì)接口返回值和外部調(diào)用依參數(shù)(見下圖)。Moonbox(月光寶盒)提供了大量的常用插件,能夠?qū)ΤR姷闹虚g調(diào)用進(jìn)行錄制回放,同時(shí)也提供了非常可靠、高性能的數(shù)據(jù)存儲(chǔ)、計(jì)算能力。

二、月光寶盒 有哪些優(yōu)勢(shì)?
正如開頭所說(shuō)月光寶盒是一款面向測(cè)試、研發(fā)工程師使用的低門檻、高性能、更易于使用的自動(dòng)化測(cè)試工具。這款產(chǎn)品已經(jīng)在vivo運(yùn)行了2年多了,經(jīng)過(guò)我們持續(xù)優(yōu)化、打磨擁有很多實(shí)用、易用功能。它的優(yōu)點(diǎn)主要體現(xiàn)在下面幾方面:
2.1 全面可視化視操作(部分功能)
(1)基于任務(wù)、接口維度的流量管理能力

(2)詳細(xì)的流量展示細(xì)節(jié)(請(qǐng)求、響應(yīng)、子調(diào)用)

(3)基于任務(wù)、接口維度的回放數(shù)據(jù)管理,疊加各種維度統(tǒng)計(jì)、查詢能力

(4)易于人工分析的回放比對(duì)結(jié)果和差異展示

2.2 豐富的插件支持
月光寶盒支持非常多組件錄制和回放能力,基本上能滿足絕大多數(shù)人訴求。

2.3?多種部署方式
Docker:這種方式簡(jiǎn)單、可靠,讓您可以摒棄復(fù)雜的環(huán)境配置和安裝,快速在本地體驗(yàn)我們項(xiàng)目。
常規(guī)方式:這種方式復(fù)雜、步驟繁瑣,需要按照步驟創(chuàng)建ES和MySQL數(shù)據(jù)庫(kù),初始化數(shù)據(jù)表,更新好應(yīng)用配置,安裝好前端node服務(wù)。
此外月光寶盒是前后端分離項(xiàng)目,當(dāng)您使用該項(xiàng)目需要分別部署前端、后端,非常有助于您后續(xù)將項(xiàng)目部署到生產(chǎn)環(huán)境。
2.4 性能安全可靠
平臺(tái)對(duì)性能進(jìn)行了長(zhǎng)期優(yōu)化,在vivo內(nèi)部歷經(jīng)多個(gè)高并發(fā)系統(tǒng)驗(yàn)證。我們對(duì)agent端錄制流量進(jìn)行了一系列安全防護(hù),例如對(duì)相同接口同時(shí)只能有一個(gè)進(jìn)入采樣中,限制并行錄制接口數(shù)量。服務(wù)端使用了ES儲(chǔ)存流量,有效提升了數(shù)據(jù)儲(chǔ)存規(guī)模。
三、月光寶盒實(shí)現(xiàn)原理
3.1 整體架構(gòu)
月光寶盒平臺(tái)分為2個(gè)部分,分別為moonbox-agent 和 moonbox-server(整體架構(gòu)如下圖所示)
moonbox-agent
使用Java-attach技術(shù)(實(shí)際的動(dòng)態(tài)字節(jié)碼增強(qiáng)由JVM-Sandbox實(shí)現(xiàn))動(dòng)態(tài)代理到目標(biāo)進(jìn)程上,提供流量錄制和回放的增強(qiáng)。
moonbox-server
Agent端使用接口,提供配置查詢、錄制流量保存、流量查詢、回放結(jié)果保存等服務(wù)
錄制任務(wù)/回放任務(wù)的配置,agent任務(wù)遠(yuǎn)程管理能力和管理后臺(tái)操作界面(前后端分離部署)

3.2 流量錄制&回放
流量錄制
核心邏輯是將agent分發(fā)到用戶填寫的機(jī)器上(本地、遠(yuǎn)程機(jī)器),然后將agent attach到用戶填寫應(yīng)用所對(duì)應(yīng)的正確進(jìn)程上去。然后通過(guò)JVM-Sandbox的BEFORE、RETRUN、THROW事件機(jī)制攔截關(guān)鍵調(diào)用位置獲取流量入?yún)?、出參。整體流程見下圖整體流程見下圖:

流量回放
核心邏輯是將agent分發(fā)到用戶填寫的機(jī)器上(本地、遠(yuǎn)程機(jī)器),然后將agent attach到用戶填寫應(yīng)用所對(duì)應(yīng)的正確進(jìn)程上去,agent啟動(dòng)后從服務(wù)端不斷拉取流量去分發(fā)到對(duì)應(yīng)接口做回放,整體流程見下圖:

心跳管理
Agent啟動(dòng)后會(huì)單獨(dú)開啟線程固定間隔時(shí)間通過(guò)http請(qǐng)求給服務(wù)端上報(bào)心跳

3.3 Agent啟動(dòng)過(guò)程
執(zhí)行腳本將sandbox agent attach到目標(biāo)java進(jìn)程上,sandbox 啟動(dòng)jetty服務(wù),加載moonbox module,然后從服務(wù)端拉取moonbox配置,加載流量錄制和回放插件。

四、 和 jvm-sandbox-repeater 關(guān)系?
Moonbox是基于jvm-sandbox-repeater重新開發(fā)的一款流量回放平臺(tái)產(chǎn)品。在jvm-sandbox-repeater基礎(chǔ)上重寫了很多模塊,并提供了更加豐富功能,同時(shí)便于線上部署和使用,和jvm-sandbox-repeater差異如下:

五、為什么要開源?
流量錄制回放技術(shù)復(fù)雜,挑戰(zhàn)較高,開源社區(qū)雖然有很多類似產(chǎn)品但是在易用性方面都有一些欠缺,我們希望通過(guò)開源月光寶盒幫助對(duì)該方向有興趣的開發(fā)者快速構(gòu)建自己的自動(dòng)化工具,同時(shí)可以基于我們這款產(chǎn)品制定個(gè)性化訴求。此外,月光寶盒本身也借鑒了jvm-sandbox-repeater設(shè)計(jì)和方案,是開源的受益方,現(xiàn)在我們將自己思考和探索回饋給開源社區(qū),豐富流量回放開源技術(shù)生態(tài)。除此之外通過(guò)社區(qū)中開發(fā)者的使用,也可以幫助我們更好的改進(jìn)我們的工具,獲得更多的需求場(chǎng)景輸入,也能讓該工具獲得更加長(zhǎng)遠(yuǎn)的發(fā)展。
六、Roadmap
月光寶盒已經(jīng)完成V1.0.0版本開源,初步完成了各項(xiàng)重要功能開源,后續(xù)我們會(huì)持續(xù)性的完成平臺(tái)性能、體驗(yàn)優(yōu)化工作,同時(shí)積極收集社區(qū)使用反饋的功能需求,將一些好的需求納入我們版本計(jì)劃里面。2023年我們規(guī)劃了一些迭代版本,如下圖所示:

七、寫在最后
今天月光寶盒的開源只是我們邁出的一小步,后續(xù)我們會(huì)持續(xù)按照計(jì)劃向社區(qū)貢獻(xiàn)版本和特性。如果您對(duì)月光寶盒有興趣,歡迎體驗(yàn)我們開源產(chǎn)品。如果您有問(wèn)題或者更好的方案,歡迎向我們開源項(xiàng)目貢獻(xiàn)反饋ISSUE和貢獻(xiàn)PR,這將是我們莫大的榮幸。
GItHub項(xiàng)目地址:https://github.com/vivo/MoonBox