一. 引流測試產生背景
日常大部分的測試工作都是在測試環境下,通過模擬用戶的行為來對系統進行驗證,包括功能以及性能。在這個過程中,你可能會遇到以下問題:
-
用戶訪問行為比較復雜,模擬很難和用戶行為一致,模擬不夠真實;
-
線下模擬場景有限,會出現業務覆蓋不全的情況。
引流測試的出現就是為了解決以上問題,它的本質是:通過把線上的真實流量復制到線下環境,解決測試環境模擬不夠真實,或覆蓋不夠全面的問題。
二. 引流測試常見方案
目前不少公司對引流測試進行了實踐探索,常見的有以下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創始人思寒:如何從手工測試進階自動化測試?十余年經驗分享
作為一名Tester,我是如何做到工作一年薪資Double的