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

  • 2019 年 11 月 4 日
  • 筆記

一. 引流測試產生背景

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

  • 用戶訪問行為比較複雜,模擬很難和用戶行為一致,模擬不夠真實;
  • 線下模擬場景有限,會出現業務覆蓋不全的情況。

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

二. 引流測試常見方案

目前不少公司對引流測試進行了實踐探索,常見的有以下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:[email protected]"

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的用法也遠不止上述提到的這些,更多的應用測試場景,還請讀者自行挖掘。

Tags: