推薦一款技術(shù)人必備:線上引流神器GoReplay
點擊上方“測試開發(fā)技術(shù)”,選擇“加為星標(biāo)”
優(yōu)質(zhì)文章,第一時間送達(dá)!

一. 線上引流產(chǎn)生背景
日常大部分的測試工作都是在測試環(huán)境下,通過模擬用戶的行為來對系統(tǒng)進(jìn)行驗證,包括功能以及性能。在這個過程中,你可能會遇到以下問題:
用戶訪問行為比較復(fù)雜,模擬很難和用戶行為一致,模擬不夠真實。 線下模擬場景有限,會出現(xiàn)業(yè)務(wù)覆蓋不全的情況。
線上引流方案的出現(xiàn)為上述問題提供了很好的解題思路,線上引流本質(zhì)是:通過把線上的真實流量復(fù)制到線下環(huán)境,解決測試環(huán)境模擬不夠真實,或覆蓋不夠全面的問題。
二. 線上引流常見方案
目前不少公司都對線上引流方案進(jìn)行了許多實踐探索,常見的有以下4種引流方式(不限):
| 引流方式 | 實現(xiàn)方式 | 優(yōu)點 | 缺點 |
|---|---|---|---|
| Nginx層流量復(fù)制 | 安裝lua-nginx-module、ngxdevelkit、headers-more-nginx-module模塊,通過lua腳本實現(xiàn)把請求復(fù)制給測試環(huán)境。 | 安裝和部署還較為簡單。 | 需要開發(fā)lua腳本,且對資源有一定占用。 |
| 基于業(yè)務(wù)代碼層的引流 | 將業(yè)務(wù)代碼的調(diào)用封裝成請求對象,異步的寫入緩存中。引流工具通過讀緩存中的請求,向測試環(huán)境發(fā)起請求。 | 擴(kuò)展性好,可定制化高。 | 需要開發(fā)流量復(fù)制工具,工作量較大,且對工作本身的性能要求較高。 |
| 基于訪問日志回放 | 線上系統(tǒng)記錄訪問日志,引流工具通過解析日志,向測試環(huán)境發(fā)起請求。 | 離線方式,對線上影響小。 | 需要開發(fā)日志解析工具,且解析的開銷會較大。 |
| 基于TCP/IP層的引流 | 目前已開源的工具有TcpCopy | 安裝、部署使用都較為簡單。 | 安裝、部署使用都較為簡單。 |
上述的幾種引流方式各有利弊,有的是需要自己開發(fā)相應(yīng)的工具來支持。而今天給大家介紹的是另外一款簡單易用,學(xué)習(xí)成本低的引流工具GoReplay。
三. 推薦一款引流工具:GoReplay
Gor,又稱為GoReplay,是采用Golang 編寫的一個開源的 HTTP 實時流量復(fù)制工具。它只需要在 LB 或者 入口服務(wù)器上執(zhí)行一個進(jìn)程,就可以把生產(chǎn)環(huán)境的流量復(fù)制到任何地方,比如 Staging 環(huán)境、Dev 環(huán)境。常用于壓測及線上問題復(fù)現(xiàn)。
注:Golang 是采用Gor 實現(xiàn)且開源的,意味著可以方便的集成到自己的架構(gòu)中,可以用在壓力測試平臺、實時流量分析、應(yīng)用層防火墻等方面。
四. GoReplay工作流程
下面是goreplay官方之前公布的工作流程圖,簡單來講就是goreplay捕捉線上流量,并將捕捉到的釋放到指定測試服務(wù)器上。

最新GoReplay 官網(wǎng)上更新了一張更高逼規(guī)格的圖解說明,如下圖所示:

上述流程圖展示的已經(jīng)很詳細(xì)了,我就不過多解釋。
注:Gor不是代理人,不需要將第三方工具放到關(guān)鍵路徑上。相反,Gor只是默默地分析你的應(yīng)用程序的流量,并不影響本身程序。
五. GoReplay支持的常用功能
1、Gor 支持流量的放大和縮小、頻率限制,這樣不需要搭建和生產(chǎn)環(huán)境一致的服務(wù)器集群也可以正確測試。
2、Gor 還支持根據(jù)正則表達(dá)式過濾流量,這意味著可以單獨(dú)測試某個 API 服務(wù)。
3、Gor還可以修改 HTTP 請求頭,比如替換 User-Agent, 或者增加某些 HTTP Header 。
4、Gor 還可以把請求記錄到文件,以備回放和分析。Gor 支持和 ElasticSearch 集成,將流量存入 ES 進(jìn)行實時分析。
5、上線前在預(yù)發(fā)布環(huán)境,使用線上真實的請求,檢查是否準(zhǔn)備發(fā)布的版本,是否具備發(fā)布標(biāo)準(zhǔn)。
6?壓力測試完成后,用線上真實的請求,加速后回放至測試環(huán)境,檢查是否有報錯等問題。
7?用線上的流量轉(zhuǎn)發(fā)到預(yù)發(fā)布或測試環(huán)境,檢查相同流量下一些指標(biāo)的反饋情況,檢查核心數(shù)據(jù)是否需要改善。
8、等等。
六. 下載安裝GoReplay
顧名思義,GoReplay是基于go語言實現(xiàn)的,要在目標(biāo)服務(wù)器上安裝go環(huán)境。安裝參考可見 :https://golang.org/doc/install,準(zhǔn)備好go語言環(huán)境后,GoReplay直接提供了編譯好的版本,十分方便,直接解壓即可,可參考以下步驟:
?#下載包
?wget?https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz
?
?#解壓
?tar?xvf?gor_1.0.0_x64.tar.gz
也可以進(jìn)入到官網(wǎng)下載地址:https://github.com/buger/goreplay/releases下載最新的Gor二進(jìn)制文件(支持Windows,Linux x64和Mac OS提供預(yù)編譯的二進(jìn)制文件),或者可以自行編譯。
獲取gor版本:
https://github.com/buger/goreplay/releases
源碼地址:
https://github.com/buger/goreplay
官方使用文檔:
https://github.com/buger/gor/wiki

七. GoReplay 常用命令用法
輸入?yún)?shù):
--input-raw?用于捕獲HTTP流量,需要指定IP地址或接口和應(yīng)用程序端口。--input-file? 接收通過--output-file保存流量的文件--input-tcp?將多個 Goreplay 實例獲取的流量聚集到一個 Goreplay 實例。
輸出參數(shù):
--output-http?重放HTTP流量到給定的端點,接受基礎(chǔ)URL。--output-file?錄制流量時指定的存儲文件--output-tcp將獲取的流量轉(zhuǎn)移至另外的 Goreplay 實例,并與其一起使用--input-tcp。--output-stdout?用于調(diào)試,輸出所有數(shù)據(jù)到stdout。
其它參數(shù):
--http-allow-method根據(jù)請求方式過濾。--http-allow-urlurl白名單,其他請求將會被丟棄。--http-disallow-url遇上一個url相反,黑名單,其他的請求會被捕獲到。
八. GoReplay 常用實踐場景
1、流量實時復(fù)制引流(--input-raw 攔截端口配合--output-http輸出),例如將本機(jī)80端口的HTTP流量實時復(fù)制到targer_server:8080。
gor?--input-raw?:80?--output-http?"http://target_server:8080"
2?控制臺輸出,獲取經(jīng)過本地8080端口的請求流量,然后打印到控制臺。
gor?--input-raw?:8080?--output-stdout
上述命令將監(jiān)控8080端口上所有的流量,并通過終端stdout輸出。你可以通過瀏覽器或者curl訪問8080端口,然后在終端查看gor輸出所有的http請求。
3?先錄制后回放,將捕捉流量保存到文件中,然后釋放到其它機(jī)器,有時候?qū)崟r同步流量是很難做到的, 所以Goreplay提供了這種先保存后回放的模式:
第一步, 通過--output-file保存流量:
gor?--input-raw?:8080?--output-file=requests.gor
上述命令將8080端口的流量,保存到requests.gor文件中(必須是.gor后綴,其它后綴經(jīng)測釋放時有問題)。
第二步,回放保存的流量:
gor?--input-file?requests.gor?--output-http="http://localhost:8081"
上述命令將釋放所有保存在requests.gor中的請求通過相同的時間順序釋放到服務(wù)器[http://localhost:8081](http://localhost:8081
4、過濾指定請求方法,如果目標(biāo)服務(wù)器使用的庫與線上機(jī)器一樣,且只需要引流Get方法的請求。
gor?--input-raw?:80??--http-allow-method?GET?--output-http?"http://target_server:8080"
5?請求過濾,當(dāng)你需要捕捉指定路徑的請求流量時,可以使用該機(jī)制, 如只同步/api路徑下的請求
gor?--input-raw?:8080?--output-http?staging.com?--http-allow-url?/api
只收集請求頭中符合 api-version 為 1.0x 的請求
gor?--input-raw?:8080?--output-http?staging.com?--http-allow-header?api-version:^1\.0\d
6?限速機(jī)制,由于生產(chǎn)服務(wù)器配置一般遠(yuǎn)高于測試服務(wù)器配置,所以直接將生產(chǎn)服務(wù)器全部流量同步到測試服務(wù)器是不可行的,goreplay提供了兩種策略:
a. 限制每秒的請求數(shù)
gor??--input-tcp?:28020?--output-http?"http://staging.com|10"#?(每秒請求數(shù)限制10個以內(nèi))
gor??--input-raw?:80?--output-tcp?"replay.local:28020|10%"??#?(每秒請求數(shù)限制10%以內(nèi))
b. 基于Header或Url的參數(shù)限制一些請求,為指定的header或者url的請求設(shè)定限制的百分比。
gor??--input-raw?:80?--output-tcp?"replay.local:28020|10%"?--http-header-limiter?"X-API-KEY:?10%"
gor??--input-raw?:80?--output-tcp?"replay.local:28020|10%"?--http-param-limiter?"api_key:?10%"
7、流量加壓,當(dāng)需要對線上服務(wù)進(jìn)行整體性能壓測時,可將線上請求擴(kuò)大N倍,進(jìn)行引流,將請求擴(kuò)大1倍,也可縮小,調(diào)整"|"后面的百分比即可。
gor?--input-raw?:80??--http-allow-method?GET?--output-http?"http://target_server:8080|200%"
8、只復(fù)制某個URL請求,--http-allow-url參數(shù),-http-allow-url參數(shù)可用正則表達(dá)式(--output-http-url-regexp在gor 0.16已經(jīng)過期,使用--http-allow-url代替)。
gor?--input-raw?:8080?--http-allow-method?GET?--output-http?"http://target_server:8080"?--http-allow-url?mall.*hotword
9、多目標(biāo)服務(wù)器的流量復(fù)制引流,有點類似nginx的mirror。
gor?--input-raw?:80?--output-http?"http://target_server:8080"?--output-http?"http://target_server2:8080"
10、將流量轉(zhuǎn)發(fā)到多個端點,默認(rèn)情況下,它會將相同的流量發(fā)送到所有輸出。
gor?--input-tcp?:28020?--output-http?"http://staging.com"??--output-http?"http://dev.com"
11、將相同的流量發(fā)送到多個站點,并且平分所有流量。
gor?--input-raw?:80?--output-http?"http://staging.com"??--output-http?"http://dev.com"?--split-output?true
12、HTTP超時,默認(rèn)情況下,http請求和響應(yīng)的超時時間為5秒。你可以像這樣覆蓋它:
gor?--input-tcp?replay.local:28020?--output-http?http://staging.com?--output-http-timeout?30s
13、基本身份驗證,如果您的開發(fā)或登臺環(huán)境受基本身份驗證保護(hù),那么可以在重放期間注入這些憑據(jù):
gor?--input-raw?:80?--output-http?"http://user:[email protected]"
14、性能壓力測試,可以將流量復(fù)制到文件,然后再對他們進(jìn)行回放。回放的時候,流量會維持原始的時間間隔。如果你使用了百分比來進(jìn)行速率限制,那么回放的速率會相應(yīng)的增加或減少。有了這種速率限制,gor就可以用來進(jìn)行壓力測試。
gor?--input-file?"requests.gor|200%"?--output-http?"staging.com"
目前,input-file僅在使用基于百分比的限制器時才支持此功能。與默認(rèn)限制器不同input-file,它不會降低請求速度,而會減慢速度或加速請求發(fā)射。
15 、錄制與回放
./gor?--input-raw?:8000?--output-file=requests.gor
執(zhí)行錄制命令后,將會創(chuàng)建新文件并不斷向其寫入所有捕獲的請求。
16、流量回放,重播來自文件的請求。
./gor?--input-file?requests.gor?--output-http="http://localhost:8001"
您應(yīng)該看到所有記錄到http://localhost:8001的請求,并且它們將以相同的順序重播,并且與錄制的時間完全相同。
GoReplay更多用法可參考官方文檔:https://github.com/buger/goreplay/wiki/Getting-Started
更多實用功能,讀者們可自行探索,如果覺得有用,幫忙點個好看或朋友圈轉(zhuǎn)發(fā)分享一下就行。
END

長按二維碼/微信掃碼 ?關(guān)注
