gor實現線上HTTP流量復制壓測引流


一、使用背景

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM