推薦一款流量錄制回放工具:jvm-sandbox-repeater
在軟件開發和測試過程中,我們經常會遇到需要對網絡請求進行錄制和回放的需求,以便進行調試、測試和分析。為了模擬真實的用戶請求,我們通常會使用各種流量錄制回放工具來記錄并重放網絡請求。
其中,jvm-sandbox-repeater 是一款功能強大的流量錄制回放工具,可以幫助我們輕松實現對網絡請求的錄制和回放。
1、介紹
jvm-sandbox-repeater 是一個基于 JVM-Sandbox 采用Java來實現的流量錄制回放工具,或者可以理解為它是一個基于Java虛擬機的插件,可以直接運行中JVM中,無需對目標應用程序進行任何修改。

它可以在運行時自動攔截和記錄 Java 應用程序的網絡請求和響應。它是利用JVM Sandbox的字節碼增強技術,對Java應用進行無侵入式的流量錄制和回放。這意味著通過使用jvm-sandbox-repeater,我們可以在不修改源代碼的情況下,即可輕松實現流量的錄制和回放功能。
2、功能特性
jvm-sandbox-repeater 的主要功能特性包括有:
-
無侵入式錄制:jvm-sandbox-repeater 通過 JVM-Sandbox字節碼增強技術,在運行時對Java應用進行錄制,在運行時自動攔截和記錄網絡請求,無需對源代碼進行任何修改。
-
支持多種協議:jvm-sandbox-repeater 支持多種網絡協議,包括HTTP/HTTPS、gRPC、Dubbo、TCP 等多種協議的攔截和記錄。
-
靈活的配置:jvm-sandbox-repeater 提供了豐富的配置選項,可以根據需要對錄制和回放的行為進行定制。
-
高性能:jvm-sandbox-repeater 基于 JVM-Sandbox 技術,具有較低的性能損耗,對應用程序的影響較小。
-
高精度錄制:該工具能夠精確記錄請求和響應的詳細信息,包括請求頭、請求體、響應狀態碼、響應體等,確?;胤诺臏蚀_性。
-
靈活的回放策略:支持多種回放策略,如按照時間順序回放、并發回放等,滿足不同的測試需求。
-
可視化界面:提供易于使用的可視化界面,方便用戶進行流量的錄制、管理和回放操作,降低使用門檻。
-
高擴展性:基于JVM Sandbox平臺,易于與其他工具進行集成和擴展。
3、應用場景
在工作中使用jvm-sandbox-repeater工具,主要就是借用其中的三類基本能力:
-
流量錄制:jvm-sandbox-repeater 可以實時捕獲目標應用程序的網絡請求,并將其記錄下來。通過錄制功能,獲取目標應用程序的實際網絡請求數據,用于后續的分析和調試。 -
流量回放:jvm-sandbox-repeater 支持對錄制的網絡請求進行回放。通過回放功能,模擬目標應用程序的網絡請求,以驗證其正確性和穩定性。 -
請求修改:jvm-sandbox-repeater 允許開發人員對錄制的網絡請求進行修改。通過修改功能,調整網絡請求的參數和頭部信息,以模擬不同的場景和測試用例。
借助上述這三類基本能力,在測試開發工作中,常用于如下場景應用:
- 接口測試:通過錄制生產環境的真實接口流量,在測試環境中進行回放,可以模擬各種復雜場景,驗證接口的穩定性和性能。
- 性能測試:利用錄制的流量數據進行性能測試,能夠更真實地反映系統的性能表現,幫助發現和解決性能瓶頸。
- 兼容性測試:通過在不同版本的Java應用或不同環境下回放錄制的流量,可以驗證系統的兼容性。
4、原理一:JVM-Sandbox技術是如何工作的?
jvm-sandbox-repeater 是一個基于 JVM-Sandbox 實現的流量回放工具,但估計很多讀者,對于JVM-Sandbox是什么,以及它是如何工作的還不太清楚,這里擴展一下。
JVM-Sandbox簡單來說,它是一款Java應用沙箱,旨在為Java應用程序提供一個隔離、安全的運行環境。沙箱(Sandbox)技術的主要目的是保護系統安全和穩定性,同時提供更好的應用程序開發和測試環境。通過隔離程序運行的環境,沙箱技術可以防止程序訪問到不應訪問的資源和數據,從而降低安全風險。
JVM-Sandbox的工作原理可以概括為以下幾個關鍵步驟:
1、類加載:在JVM沙箱中,所有的類都由Java虛擬機的類加載器加載。類加載器負責從文件系統、網絡或其他來源加載Java類,并將其轉換為可執行代碼。
2、字節碼驗證:加載過程中,JVM會對字節碼進行驗證,以確保其符合Java語言規范。這一步驟的目的是檢測潛在的安全漏洞,如類型轉換錯誤、數組越界訪問等。
3、安全檢查:經過字節碼驗證后,JVM會進一步進行安全檢查,限制應用程序的行為,防止對系統造成危害。這包括對應用程序的訪問權限和資源使用進行限制,例如文件系統訪問、網絡訪問、系統調用等。
4、沙箱執行:一旦通過了字節碼驗證和安全檢查,JVM會將應用程序放入一個受控的沙箱環境中執行。這個沙箱環境限制了應用程序對系統資源的訪問,確保它只能在限定的范圍內執行。

此外,JVM-Sandbox還利用虛擬化技術創建隔離環境,并通過字節碼增強將被mock(模擬)的方法添加到隔離環境中。當這些方法被調用時,JVM-Sandbox通過反射機制查找它們,并使用代理對象將其轉發給沙箱中的虛擬機執行。執行完畢后,結果會返回給主程序。
5、原理二:字節碼增強技術又是啥?
字節碼增強技術是一種對Java字節碼進行修改以增強其功能的技術。它主要是在Java字節碼生成之后,通過讀取和修改字節碼文件,實現對類、方法、字段等元素進行增強。這種技術相當于對應用程序的二進制文件進行修改,主要目的是減少冗余代碼,提高性能等。
字節碼增強的主要步驟包括:
- 修改字節碼:在內存中獲取到原來的字節碼,然后通過一些工具(如ASM、Javassist)來修改它的byte[]數組,得到一個新的byte數組。
- 使修改后的字節碼生效:這可以通過兩種方法實現:一是自定義ClassLoader來加載修改后的字節碼;二是在JVM加載用戶的Class時,攔截并返回修改后的字節碼,或者在運行時,使用Instrumentation.redefineClasses方法來替換掉原來的字節碼。

字節碼增強技術的應用非常廣泛,例如可以用于APM(應用性能管理)工具,監控和管理應用軟件性能和可用性,保證軟件應用程序的正常運行;還可以用于Java問題定位工具,如BTrace
6、安裝、使用
1. 下載或引入依賴
首先,你需要從 jvm-sandbox-repeater 的官方網站或 GitHub 倉庫下載最新版本的插件 jar 文件。
或者直接在項目的 pom.xml 文件中添加 jvm-sandbox-repeater 的依賴:
<dependency>
<groupId>com.github.jvm-sandbox-repeater</groupId>
<artifactId>jvm-sandbox-repeater</artifactId>
<version>最新版本</version>
</dependency>
2. 配置 Sandbox
將 jvm-sandbox-repeater 插件添加到 JVM 中,將下載的 jvm-sandbox-repeater 插件 jar 文件添加到目標應用程序的類路徑中,或者通過 Javaagent 參數將其添加到 JVM 中。
在項目的啟動參數中添加以下配置,啟用 JVM-Sandbox 和 jvm-sandbox-repeater:
java -javaagent:path/to/jvm-sandbox-repeater.jar=config.yaml -jar your-application.jar
其中,config.yaml 是 jvm-sandbox-repeater 的配置文件,配置 jvm-sandbox-repeater 的相關參數,比如錄制文件保存路徑、回放速度等可以根據實際情況進行修改。
3. 編寫配置文件
創建一個名為 config.yaml 的文件,用于配置 jvm-sandbox-repeater。以下是一個簡單的示例:
repeater:
enabled: true
recordDir: /path/to/record/dir
replayDir: /path/to/replay/dir
filter:
classes:
- com.example.service.*
methods:
- com.example.service.UserService.getUserInfo
在這個示例中,我們啟用了 jvm-sandbox-repeater,并指定了錄制和回放的目錄。同時,我們還定義了一個過濾器,只對 com.example.service 包下的 UserService 類的 getUserInfo 方法進行錄制和回放。
4. 錄制和回放
在目標應用程序運行時,jvm-sandbox-repeater 會實時捕獲網絡請求,并將其記錄到指定的錄制文件夾中。當需要回放請求時,可以使用 jvm-sandbox-repeater 提供的命令行工具或 API 進行操作。
# 錄制請求
java -jar jvm-sandbox-repeater.jar record -c config.yaml
# 回放請求
java -jar jvm-sandbox-repeater.jar replay -c config.yaml
或者,你也可以在代碼中使用 jvm-sandbox-repeater 提供的 API 進行錄制和回放。以下是一個簡單的示例:
import com.github.jvm.sandbox.repeater.Repeater;
import com.github.jvm.sandbox.repeater.Recorder;
import com.github.jvm.sandbox.repeater.Replayer;
public class MyApp {
public static void main(String[] args) {
// 初始化 Repeater
Repeater repeater = new Repeater();
repeater.init();
// 開始錄制請求
Recorder recorder = repeater.startRecording();
recorder.record("http://example.com/api/user", "GET");
// 停止錄制請求
recorder.stopRecording();
// 開始回放請求
Replayer replayer = repeater.startReplaying();
replayer.replay("http://example.com/api/user", "GET");
// 停止回放請求
replayer.stopReplaying();
}
}
通過以上步驟,你可以使用 jvm-sandbox-repeater 對 Java 應用程序進行流量錄制和回放。
5. 查看與分析結果
在回放過程中或回放結束后,可以通過jvm-sandbox-repeater提供的可視化界面查看回放的狀態、結果以及性能數據等,進行結果分析。
7、總結
總的來說,jvm-sandbox-repeater 是一款功能強大、易于使用的流量錄制回放工具,可以幫助開發人員或測試人員輕松地實現對網絡請求的錄制和回放。通過 jvm-sandbox-repeater,我們可以更加高效地進行調試、測試和分析,提高軟件開發測試的效率和質量。如果你正在尋找一款優秀的流量錄制回放工具,不妨試試 jvm-sandbox-repeater,相信它會給你帶來意想不到的驚喜!
jvm-sandbox-repeater的項目源碼:
git clone https://github.com/alibaba/jvm-sandbox-repeater.git

浙公網安備 33010602011771號