推薦一款簡單易用線上引流測試工具:GoReplay


一. 引流測試產生背景

日常大部分的測試工作都是在測試環境下,通過模擬用戶的行為來對系統進行驗證,包括功能以及性能。在這個過程中,你可能會遇到以下問題: 

  • 用戶訪問行為比較復雜,模擬很難和用戶行為一致,模擬不夠真實;

  • 線下模擬場景有限,會出現業務覆蓋不全的情況。

 

引流測試的出現就是為了解決以上問題,它的本質是:通過把線上的真實流量復制到線下環境,解決測試環境模擬不夠真實,或覆蓋不夠全面的問題。

 

二. 引流測試常見方案

目前不少公司對引流測試進行了實踐探索,常見的有以下4種引流方式(不限):

 

引流方式 實現方式 優點 缺點
Nginx層流量復制 安裝lua-nginx-module、ngxdevelkit、headers-more-nginx-module模塊,通過lua腳本實現把請求復制給測試環境。 安裝和部署還較為簡單。 需要開發lua腳本,且對資源有一定占用。
基於業務代碼層的引流 將業務代碼的調用封裝成請求對象,異步的寫入緩存中。引流工具通過讀緩存中的請求,向測試環境發起請求。 擴展性好,可定制化高。 需要開發流量復制工具,工作量較大,且對工作本身的性能要求較高。
基於訪問日志回放 線上系統記錄訪問日志,引流工具通過解析日志,向測試環境發起請求。 離線方式,對線上影響小。 需要開發日志解析工具,且解析的開銷會較大。
基於TCP/IP層的引流 目前已開源的工具有TcpCopy 安裝、部署使用都較為簡單。 僅適合無狀態的業務,且對業務請求需要進行過濾。

 上述的幾種引流方式各有利弊,有的是需要自己開發相應的工具來支持。而今天給大家介紹的是另外一款簡單易用,學習成本低的引流工具Gor。

三. 推薦一款引流工具:Gor

Gor,又稱為GoReplay,是采用Golang 編寫的一個開源的 HTTP 實時流量復制工具。它只需要在 LB 或者 Varnish 入口服務器上執行一個進程,就可以把生產環境的流量復制到任何地方,比如 Staging 環境、Dev 環境。常用於壓測及線上問題復現。

 

注:Golang 是采用Gor 實現且開源的,意味着可以方便的集成到自己的架構中,可以用在壓力測試平台、實時流量分析、應用層防火牆等方面。

 

四. Gor工作流程

  

監聽服務器捕獲http流量並將其發送到重放服務器或保存到文件,重播服務器將流量轉發給給定的地址。

 

注:Gor不是代理人,不需要將第三方工具放到關鍵路徑上。相反,Gor只是默默地分析你的應用程序的流量,並不影響本身程序。

 

 

五. Gor支持的常用功能

1、Gor 支持流量的放大和縮小、頻率限制,這樣不需要搭建和生產環境一致的服務器集群也可以正確測試。

2、Gor 還支持根據正則表達式過濾流量,這意味着可以單獨測試某個 API 服務。

3、Gor還可以修改 HTTP 請求頭,比如替換 User-Agent, 或者增加某些 HTTP Header 。

4、Gor 還可以把請求記錄到文件,以備回放和分析。Gor 支持和 ElasticSearch 集成,將流量存入 ES 進行實時分析。

 

六. Gor 下載安裝

官網下載地址:https://github.com/buger/goreplay/releases 下載最新的Gor二進制文件(支持Windows,Linux x64和Mac OS提供預編譯的二進制文件),或者可以自行編譯。

 

獲取gor版本:https://github.com/buger/goreplay/releases

源碼地址:https://github.com/buger/goreplay

官方使用文檔:https://github.com/buger/gor/wiki

 

 

 

七. Gor 常用命令用法

可用輸入:

  • --input-raw - 用於捕獲HTTP流量,您應該指定IP地址或接口和應用程序端口。有關捕獲和重放流量的更多信息。

  • --input-file- 接受之前使用的文件--output-file。更多關於保存和從文件重播

  • --input-tcp - 如果您決定將來自多個轉發器Gor實例的流量轉發給它,則由Gor聚合實例使用。閱讀關於使用Aggregator-forwarder設置

可用輸出:

  • --output-http - 重放HTTP流量到給定的端點,接受基礎URL。閱讀[關於它的更多信息](重播HTTP流量)

  • --output-file - 記錄傳入的流量到文件。更多關於保存和從文件重播

  • --output-tcp- 將傳入數據轉發給另一個Gor實例,並與其一起使用--input-tcp。閱讀關於Aggregator-forwarder設置的更多信息。

  • --output-stdout - 用於調試,輸出所有數據到stdout。

 

更多參數,可查閱官網文檔。

 

八. Gor 常用實踐場景

1、流量實時復制引流(--input-raw 攔截端口配合--output-http輸出),例如將本機80端口的HTTP流量實時復制到targer_server:8080。

gor --input-raw :80 --output-http "http://target_server:8080

 

2、如果目標服務器使用的庫與線上機器一樣,且只需要引流Get方法的請求。

gor --input-raw :80  --http-allow-method GET --output-http "http://target_server:8080"

 

3、當需要對線上服務進行整體性能壓測時,可將線上請求擴大N倍,進行引流,將請求擴大1倍,也可縮小,調整"|"后面的百分比即可。

gor --input-raw :80  --http-allow-method GET --output-http "http://target_server:8080|200%"

 

4、只復制某個URL請求,--http-allow-url參數,-http-allow-url參數可用正則表達式(--output-http-url-regexp在gor 0.16已經過期,使用--http-allow-url代替)。

gor --input-raw :8080 --http-allow-method GET --output-http "http://target_server:8080" --http-allow-url mall.*hotword

 

5、多目標服務器的流量復制引流,有點類似nginx的mirror。

gor --input-raw :80 --output-http "http://target_server:8080" --output-http "http://target_server2:8080"

  

6、將流量轉發到多個端點,默認情況下,它會將相同的流量發送到所有輸出。

gor --input-tcp :28020 --output-http "http://staging.com"  --output-http "http://dev.com"
 

 

7、將相同的流量發送到多個站點,並且平分所有流量。

gor --input-raw :80 --output-http "http://staging.com"  --output-http "http://dev.com" --split-output true

 

 

8、HTTP超時,默認情況下,http請求和響應的超時時間為5秒。你可以像這樣覆蓋它:

gor --input-tcp replay.local:28020 --output-http http://staging.com --output-http-timeout 30s

 

9、基本身份驗證,如果您的開發或登台環境受基本身份驗證保護,那么可以在重放期間注入這些憑據:

gor --input-raw :80 --output-http "http://user:pass@staging.com"

 

10、性能壓力測試

可以將流量復制到文件,然后再對他們進行回放。回放的時候,流量會維持原始的時間間隔。如果你使用了百分比來進行速率限制,那么回放的速率會相應的增加或減少。有了這種速率限制,gor就可以用來進行壓力測試。

gor --input-file "requests.gor|200%" --output-http "staging.com"

 

目前,input-file僅在使用基於百分比的限制器時才支持此功能。與默認限制器不同input-file,它不會降低請求速度,而會減慢速度或加速請求發射。

 

11 、錄制與回放

./gor --input-raw :8000 --output-file=requests.gor

 

執行錄制命令后,將會創建新文件並不斷向其寫入所有捕獲的請求。

 

12、流量回放,重播來自文件的請求。

./gor --input-file requests.gor --output-http="http://localhost:8001"

 

您應該看到所有記錄到http://localhost:8001的請求,並且它們將以相同的順序重播,並且與錄制的時間完全相同。

 

gor的用法也遠不止上述提到的這些,更多的應用測試場景,還請讀者自行挖掘。

 

往期精選:

TesterHome創始人思寒:如何從手工測試進階自動化測試?十余年經驗分享

月薪30K+,高薪?一文搞懂什么是測試開發!

測試應該如何處理跟開發之間的“敏感”關系?

人生苦短,我用Python,助力成為世界上最好的語言!

軟件測試工程師又一大挑戰:大數據測試

作為一名Tester,我是如何做到工作一年薪資Double的

一文搞定SonarQube接入C#(.NET)代碼質量分析

你所需要掌握的問題排查知識

RobotFrameWork編寫接口測試及如何斷言

微服務下的契約測試(CDC)解讀

 

 
 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM