一、前言
本次參考以下2篇文章,純粹只了解工具的原理和用法,尚未實踐。
https://cloud.tencent.com/developer/article/1491793
https://www.cnblogs.com/qmfsun/p/11598763.html#top(詳細)
二、GoReplay簡介
gor 是一款go語言實現的簡單的http流量復制工具,它的主要目的是使你的生產環境HTTP真實流量在測試環境和預發布環境重現。只需要在 代理例如nginx入口服務器上執行一個進程,就可以把生產環境的流量復制到任何地方,
完美解決了HTTP 層實時流量復制和壓力測試的問題。常見的HTTP流量copy工具還有另外一款tcpcopy。將機器A上的http請求復制轉發到指定機器B上去,
通過線上流量復制引流,通過將真實請求流量放大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
四、流量錄制驗證
執行下如下命令,錄制80端口的包,輸出到控制台,測試下是否可以錄制到流量
sudo ./gor --input-raw :3000 --output-stdout
打開瀏覽器訪問部署在該服務器的一個已部署好的80端口的web服務,或者通過curl訪問也可以,url如下http://www.testbang.cn/images/about.jpg
如果有如下是輸出說明可以成功錄制80端口的流量
五、流量回放驗證
流量實時復制引流(--input-raw 攔截端口配合--output-http輸出),將本機端口3000的HTTP流量復制到目標服務器9090端口,
步驟一,輸入如下命令:
sudo ./gor --input-raw :3000 --output-http "http://目標服務器ip:9090"
步驟二:在3000端口url執行請求操作
步驟三:查看ip:9090的請求日志,是可以看到在3000端口執行的請求會在9090被同步執行
注:因為我的端口沒地方可以看到請求日志,所以只能靠文字描述下。
六、其他場景命令
以下命令沒驗證過哈,先轉發過來:
1、 如果目標服務器使用的庫與線上機器一樣,需要只引流Get方法,不應該復制上行方法(POST等)
gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080"
2、 當需要對線上服務進行整體性能壓測時,可將線上請求擴大N倍,進行引流
gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080|200%" #將請求擴大1倍,也可縮小,調整"|"后面的百分比即可
3、 只復制某個URL請求,--http-allow-url參數
gor --input-raw :8080 --http-allow-method GET --output-http "http://target_server:8080" --http-allow-url mall.*hotword
#--http-allow-url參數可用正則表達式
#--output-http-url-regexp在gor 0.16已經過期,使用--http-allow-url代替
4、多目標服務器的流量復制引流,有點類似nginx的mirror
gor --input-raw :80 --output-http "http://target_server:8080" --output-http "http://target_server2:8080"
注:gor目前的只能使用較為簡單的無鑒權的操作,同時要求線下環境的數據要和線上的數據保持一致,不然會出現線上的請求參數,copy到測試環境出現空指針等異常