JVM-SANDBOX:從阿里精準測試走出的開源貢獻獎

阿里妹導讀:穩定性是歷年雙11的技術質量保障核心。從 2016 年開始淘寶技術質量部潛心修行,創新地研發了一套實時無侵入的字節碼加強框架,因而「JVM-SANDBOX」誕生了,而且順手在 MTSC 大會上拿了開源貢獻獎,今天,咱們來瞅瞅這個拿獎的項目。java

在近日舉行的中國移動互聯網測試開發大會(簡稱MTSC大會),來自淘系技術質量開源項目「JVM-SANDBOX」以及淘系同窗參與維護的「 ATX」 包攬了 MTSC 2019 年度開源貢獻獎,表彰過去一年在測試領域開源項目中的突出貢獻。其中,「JVM-SANDBOX」致力於爲服務端穩定性領域提供實時無侵入的字節碼加強框架。服務器

1、JVM-Sandbox的誕生

功能迴歸、業務/系統監控、問題排查定位、強弱依賴、故障演練等是阿里 10 年雙十一沉澱積累下來的穩定性專項,也是歷年雙十一質量保障的核心要素。要有效、輕量級地實現這些穩定性專項,都會觸及到一塊底層技術—— java 字節碼加強。若是每一個專項都能本身實現一套字節碼加強邏輯,實現的門檻高、投入和維護成本高,且不一樣專項間相互影響形成不可預知的風險。如何屏蔽字節碼加強技術的高門檻,下降成本,同時又能支持上層多個專項功能的快速實現和動態管理,成爲淘寶技術質量部的目標。從 2016 年開始咱們潛心修行,創新地研發了一套實時無侵入的字節碼加強框架,因而 「JVM-SANDBOX」 誕生了。架構

對上面提到的專項進行抽象分析:框架

  • 故障演練:在運行前,拋出異常或增長運行時間,即:干預方法的執行順序和改變返回值;
  • 強弱依賴梳理:系統運行時,實時記錄系統的對外調用狀況,即:感知方法的入參和返回值;
  • 錄製回放:運行時,記錄方法的入參和返回值,回放時,不真實對外調用,而是直接返回錄製時的返回值。即:感知方法入參和返回值,干預方法執行順序,改變返回值;
  • 精準迴歸:獲取每一個請求的行調用鏈路,根據行調用鏈路進行場景去重,根據代碼改動的狀況和行調用鏈路肯定須要迴歸範圍,即:運行時行鏈路感知。

不難發現,要解決這些問題本質就是如何完成 java 方法的環繞管控和運行時行鏈路的獲取,即 AOP 框架的解決方案。目前經常使用 AOP 框架的解決方案有兩種:proxy 和埋點。proxy 的優勢在於已實現了統一的 API,減小了重複投入,可是不能實時生效,須要系統編譯重啓。埋點的優勢在於動態生效靈活度高,可是沒有統一 API。測試

要快速解決上邊的三個問題,咱們須要的 AOP 解決方案必須具有兩個特性:編碼

  • 動態可插拔,即實現埋點方式的統一的 API;
  • 無侵入性,即解決 JVM 類隔離的問題。

基於以上需求,咱們研發了 JVM-Sandbox。spa

2、實現方式

JVM-Sandbox 由純 Java 編碼完成,基於 JVMTI 技術規範,爲觀察和改變代碼運行結果提供了即插即用模塊接口的容器,提供兩個核心功能:實時無侵入 AOP 框架和動態可插拔的模塊管理容器。code

2.1 JVM-Sandbox的核心功能中間件

  • 使用埋點技術提供統一的 API,來實現無需重啓的 AOP 解決方案;
  • 使用容器完成 JVM 類隔離,來解決侵入性問題;
  • 提供容器管理機制,來完成各類容器的管理。

2.2 JVM—Sandbox的核心事件模型接口

BEFORE、RETURN 和 THROWS 三個環節事件的正常流轉和干預流轉。

2.3 總體架構

沙箱一共由三大核心功能組件構成

  1. 代碼編織組件:負責完成預設代碼的重寫和生效;
  2. 事件處理分發組件:負責完成事件的分發和方法流控控制的執行;
  3. 模塊管理組件:負責控制和管理沙箱的各個模塊。

沙箱的底層提供了一個 HTTP-SERVER(Jetty),經過 HTTP 協議完成 sandbox.sh和沙箱的控制交互,同時也給各個模塊提供了基於 HttpServlet 和 WebSocket 規範的 API,各模塊能夠複用沙箱完成各自模塊的控制與交互。

3、業務的實踐效果

3.一、線上故障演練

17年故障演練平臺在 JVM-Sandbox 基礎上僅耗時1周即完成故障注入部分的系統重構。重構後的系統在掛載效率和掛載成功率方面有了明顯的提高,極大地縮短故障演練的時間,演練效率提高了數十倍。基於 JVM-Sandbox 改造後的故障演練平臺,通用性強,全部基於 JVM 啓動的系統均支持,極大地拓展了故障演練的範圍,故障演練已達到集團級部署。

與16年故障演練數據對比,17年的故障演練平臺,覆蓋 BU 提高了1.6倍,覆蓋應用提高了5倍,覆蓋場景提高了37倍。18年故障演練平臺覆蓋了阿里集團,並演化爲如今的攻防演練。

3.二、依賴檢測

17年強弱依賴自動化檢測平臺誕生。它提供了依賴檢測、強弱分析、依賴掃描、故障注入等多種能力,底層能力基於 JVM-Sandbox 在1周內完成功能開發。利用其模塊容器的特性,將前人開發的模塊與新增模塊一塊兒掛載共同工做,完成平臺功能。

強弱依賴梳理方面,承載了淘寶的系統強弱依賴梳理工做,260+個應用一鍵接入系統,並實現了0人工成本的自動化、智能化梳理。18年與 Mock 回放相結合,實現寫接口依賴自動檢測功能,目前正在不斷完善。

3.三、服務端錄製隔離回放機制

在 JVM-Sandbox 基礎上開發了一個 SS 模塊,至關於一個錄音機+回放機, 在調用中間件的時候, 順序錄制下了咱們的中間件請求,而且存儲這份‘磁帶’到服務器上。當咱們須要隔離回放的時候, 將這份‘磁帶’找到, 而且在須要的時候直接從‘磁帶’讀取, 並不須要真實地請求咱們的中間件, 這樣就保證了咱們的讀、寫接口也能作到可重複使用,從而實現服務端的隔離回放。線上錄製隔離回放不只極大地縮短業務迴歸的耗時,把業務測試同窗從繁瑣的數據準備和接口自動化腳本的編寫過程當中解放出來,並且極大地拓展了覆蓋範圍,使迴歸的範圍更貼近用戶,且場景更豐富。

3.四、精準迴歸

服務端錄製隔離回放機制誕生以後,雖然有效地提高了覆蓋範圍,下降了自動化腳本的人工投入,可是也帶來了新的問題。線上錄製的場景是海量的,單個系統均可以達到萬級、十萬級甚至百萬級別的錄製,這些錄製的場景中,存在大量的重複場景,如何識別重複場景,實現有效、精準的回放,成爲新的待解決問題。在 JVM-Sandbox的基礎上,利用 LineEvnet 實現了行鏈路識別和標記,有效地提高了回放的精準度和效率。

4、開源社區

目前基於 JVM-Sandbox,上層有阿里兩個開源的模塊:chaosblade——故障演練,Repeater——錄製回放,後續還會逐步開源其餘模塊功能,社區目前已經有900+的人羣參與討論共建,累計得到2000+的star支持,JVM-Sandbox的社區建設也期待您的加入。

5、結束語

咱們的每一步都是爲測試領域的標準化建設作努力,但願更多對測試技術發展感興趣的小夥伴能夠加入社區,一塊兒爲測試領域的發展作貢獻。

若是您有興趣加入淘系技術質量團隊,和咱們一塊兒投入到測試領域發展建設中,歡迎投遞簡歷至 taobaoqa2019@list.alibaba-inc.com。



本文做者: 何霜霜(謝萱)

閱讀原文

本文來自雲棲社區合做夥伴「阿里技術」,如需轉載請聯繫原做者。

相關文章
相關標籤/搜索