一、使用背景
gor 是一款go語言實現的簡單的http流量復制工具,它的主要目的是使你的生產環境HTTP真實流量在測試環境和預發布環境重現。只需要在 代理例如nginx入口服務器上執行一個進程,就可以把生產環境的流量復制到任何地方,
完美解決了HTTP 層實時流量復制和壓力測試的問題。常見的HTTP流量copy工具還有另外一款tcpcopy。將機器A上的http請求復制轉發到指定機器B上去,
通過線上流量復制引流,通過將真實請求流量放大N倍來進行壓測,能對服務有一個較為全面的檢驗。
二、安裝
前往官方下載:https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz
例如,現在將測試環境的流量拷貝到我的性能測試環境中
測試環境的:
http://zichan-manage.xxxxx.com:8080
性能測試環境:
http://dh-manage.xxxx.com:8080
環境結構說明:
172.20.20.111為性能測試環境的nginx服務器
172.20.20.114為性能測試環境的tomcat網關服務器
172.20.20.115為性能測試環境的app后端服務
在Linux服務器上直接執行以下命令即可:
安裝方法很簡單:
wget https://github.com/buger/goreplay/releases/download/v0.16.1/gor_0.16.1_x64.tar.gz tar -xf gor_0.16.1_x64.tar.gz cp gor /usr/bin/ #將解壓后的gor文件復制到/usr/bin下,就可以開始使用了 gor -h
gor --input-raw :80 --output-stdout
三、應用場景
3.1 流量實時復制引流(--input-raw 攔截端口配合--output-http輸出)
3.1.1 當對服務功能進行了改造,不能直接上線,需要真實請求來做驗證,可以用流量復制引流
gor --input-raw :8080 --output-http "http://target_server:8080" #將本機8080端口的HTTP流量復制到targer_server:8080
在測試環境執行登錄操作:
在性能測試環境172.20.20.111環境的nginx中日志查看請求日志:
說明171上的數據已經被copy過來
同時查看111環境后的web tomcat環境的日志:
說明請求也copy到tomcat層
為了驗證的問題更加簡明扼要,我只抓取其中一個登錄的接口:
首先在功能測試環境開啟gor監控
--http-allow-method POST --http-allow-url /debtoauth2/user/login
然后在tail一下172.20.20.111環境的日志,查看從171上copy過來的日志,是否copy過來
查看111:
尾號是0006的手機號
114環境:
115后端處理成功了
監控app端登錄接口的處理入參和出參:
com.xxx.xxx.debtoauth2.web.controller.UserController.userLogin
到這里,請求從功能測試環境直接copy到了我的性能測試環境
如果在線上環境開啟gor的監控,那么是不是也可以將線上的流量導入到壓測環境,這樣就可以起到類似壓測線上的,對線上的流量預估更加准確
3.1.2 如果目標服務器使用的庫與線上機器一樣,需要只引流Get方法,不應該復制上行方法(POST等)
gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080"
3.1.3 當需要對線上服務進行整體性能壓測時,可將線上請求擴大N倍,進行引流
gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080|200%" #將請求擴大1倍,也可縮小,調整"|"后面的百分比即可
3.1.4 只復制某個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代替
3.1.5 多目標服務器的流量復制引流,有點類似nginx的mirror
gor --input-raw :80 --output-http "http://target_server:8080" --output-http "http://target_server2:8080"
其他參數:
gor --input-raw :80 --output-http 'http://192.168.0.100:8080' --http-rewrite-url /v1/user/([^\\/]+)/ping:/v2/user/$1/ping
3.2 錄制與回放
適合在夜深人靜的時候,偷摸干一些和諧的事(≧∀≦)
3.2.1 錄制,只是gor輸出目標改為本地文件,使用--output-file參數
gor --input-raw :80 --output-file gor_request.log
3.2.2 回放
gor --input-file "gor_request.log|200%" --output-http "http://target_server:8080"
四、最后
通過案例發現,gor目前的只能使用較為簡單的無鑒權的操作,同時要求線下環境的數據要和線上的數據保持一致,不然會出現線上的請求參數,copy到測試環境出現空指針等異常
2。對於類似APP端的接口,基本都存在API鑒權操作,即請求頭都會攜帶唯一標識
如果從從線上環境的請求,header中的token是123456,那么這個token的值也會被copy到線下測試環境,但是這個用戶沒有做登錄操作,所以也沒有token,這個時候拿線上的token肯定操作失敗:
其實這些登錄已失效,都是因為copy過來的請求,都是帶的線上的token,肯定在測試環境不行
如果將這個token替換到測試環境的toekn:
gor --input-raw :8080 --http-allow-method POST --output-http "http://172.20.20.111:8080" --input-raw-realip-header "X-Real-IP" --http-set-header "Host: dh-manage.xiaoniu88.com:8080" --http-set-header "Origin: dh-manage.xiaoniu88.com:8080" --http-set-header "accessToken: c7d7646b45194c34982d4de2a7bc505f"
所以,gor適用於沒有任何token鑒權驗證的,同時要求線上和線下數據一致的環境
參考文檔:
https://cloud.tencent.com/developer/article/1491793
https://www.cnblogs.com/playboysnow/articles/9759366.html
https://www.cnblogs.com/mithrandirw/p/8468910.html
https://blog.csdn.net/weixin_33825683/article/details/92585462
https://blog.csdn.net/weixin_34345560/article/details/87986675
https://www.houyang.org/detail/292465674.html