平常大部分的測試工做都是在測試環境下,經過模擬用戶的行爲來對系統進行驗證,包括功能以及性能。在這個過程當中,你可能會遇到如下問題: javascript
用戶訪問行爲比較複雜,模擬很難和用戶行爲一致,模擬不夠真實;java
線下模擬場景有限,會出現業務覆蓋不全的狀況。nginx
引流測試的出現就是爲了解決以上問題,它的本質是:經過把線上的真實流量複製到線下環境,解決測試環境模擬不夠真實,或覆蓋不夠全面的問題。git
目前很多公司對引流測試進行了實踐探索,常見的有如下4種引流方式(不限):github
引流方式 | 實現方式 | 優勢 | 缺點 |
Nginx層流量複製 | 安裝lua-nginx-module、ngxdevelkit、headers-more-nginx-module模塊,經過lua腳本實現把請求複製給測試環境。 | 安裝和部署還較爲簡單。 | 須要開發lua腳本,且對資源有必定佔用。 |
基於業務代碼層的引流 | 將業務代碼的調用封裝成請求對象,異步的寫入緩存中。引流工具經過讀緩存中的請求,向測試環境發起請求。 | 擴展性好,可定製化高。 | 須要開發流量複製工具,工做量較大,且對工做自己的性能要求較高。 |
基於訪問日誌回放 | 線上系統記錄訪問日誌,引流工具經過解析日誌,向測試環境發起請求。 | 離線方式,對線上影響小。 | 須要開發日誌解析工具,且解析的開銷會較大。 |
基於TCP/IP層的引流 | 目前已開源的工具備TcpCopy | 安裝、部署使用都較爲簡單。 | 僅適合無狀態的業務,且對業務請求須要進行過濾。 |
上述的幾種引流方式各有利弊,有的是須要本身開發相應的工具來支持。而今天給你們介紹的是另一款簡單易用,學習成本低的引流工具Gor。正則表達式
Gor,又稱爲GoReplay,是採用Golang 編寫的一個開源的 HTTP 實時流量複製工具。它只須要在 LB 或者 Varnish 入口服務器上執行一個進程,就能夠把生產環境的流量複製到任何地方,好比 Staging 環境、Dev 環境。經常使用於壓測及線上問題復現。sql
注:Golang 是採用Gor 實現且開源的,意味着能夠方便的集成到本身的架構中,能夠用在壓力測試平臺、實時流量分析、應用層防火牆等方面。緩存
監聽服務器捕獲http流量並將其發送到重放服務器或保存到文件,重播服務器將流量轉發給給定的地址。服務器
注:Gor不是代理人,不須要將第三方工具放到關鍵路徑上。相反,Gor只是默默地分析你的應用程序的流量,並不影響自己程序。架構
一、Gor 支持流量的放大和縮小、頻率限制,這樣不須要搭建和生產環境一致的服務器集羣也能夠正確測試。
二、Gor 還支持根據正則表達式過濾流量,這意味着能夠單獨測試某個 API 服務。
三、Gor還能夠修改 HTTP 請求頭,好比替換 User-Agent, 或者增長某些 HTTP Header 。
四、Gor 還能夠把請求記錄到文件,以備回放和分析。Gor 支持和 ElasticSearch 集成,將流量存入 ES 進行實時分析。
官網下載地址: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
可用輸入:
--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。
更多參數,可查閱官網文檔。
一、流量實時複製引流(--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
,它不會下降請求速度,而會減慢速度或加速請求發射。
./gor --input-raw :8000 --output-file=requests.gor
執行錄製命令後,將會建立新文件並不斷向其寫入全部捕獲的請求。
十二、流量回放,重播來自文件的請求。
./gor --input-file requests.gor --output-http="http://localhost:8001"
您應該看到全部記錄到http://localhost:8001的請求,而且它們將以相同的順序重播,而且與錄製的時間徹底相同。
gor的用法也遠不止上述提到的這些,更多的應用測試場景,還請讀者自行挖掘。