GoReplay流量錄製與回放
一、前言
本次參考以下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到測試環境出現空指標等異常