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

一. 引流測試產生背景

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

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

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

 

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

 

二. 引流測試常見方案

目前很多公司對引流測試進行了實踐探索,常見的有如下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支持的經常使用功能

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

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

三、Gor還能夠修改 HTTP 請求頭,好比替換 User-Agent, 或者增長某些 HTTP Header 。

四、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 經常使用實踐場景

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

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

 

二、若是目標服務器使用的庫與線上機器同樣,且只須要引流Get方法的請求。

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

 

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

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

 

四、只複製某個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

 

五、多目標服務器的流量複製引流,有點相似nginx的mirror。

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

  

六、將流量轉發到多個端點,默認狀況下,它會將相同的流量發送到全部輸出。

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

 

七、將相同的流量發送到多個站點,而且平分全部流量。

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

 

 

八、HTTP超時,默認狀況下,http請求和響應的超時時間爲5秒。你能夠像這樣覆蓋它:

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

 

九、基自己份驗證,若是您的開發或登臺環境受基自己份驗證保護,那麼能夠在重放期間注入這些憑據:

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

 

十、性能壓力測試

能夠將流量複製到文件,而後再對他們進行回放。回放的時候,流量會維持原始的時間間隔。若是你使用了百分比來進行速率限制,那麼回放的速率會相應的增長或減小。有了這種速率限制,gor就能夠用來進行壓力測試。

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

 

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

 

11 、錄製與回放

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

 

執行錄製命令後,將會建立新文件並不斷向其寫入全部捕獲的請求。

 

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

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

 

您應該看到全部記錄到http://localhost:8001的請求,而且它們將以相同的順序重播,而且與錄製的時間徹底相同。

 

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

 

 

往期精選:

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

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

測試應該如何處理跟開發之間的「敏感」關係?

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

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

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

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

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

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

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

 

新開了一個知識星球:【測試開發學苑】,在這裏不但能夠參與有趣且有意義的話題討論,還能夠獲得任何與測試和開發相關問題的解答,歡迎你們加入,共同窗習成長。

 

 

歡迎交流

若對測試開發技術感興趣或者對測試開發職業發展須要交流學習的,歡迎加Q羣交流:50316345,若有任何須要諮詢的問題,也可直接掃描添加博主微信。

 

相關文章
相關標籤/搜索