gor實現線上HTTP流量複製壓測引流

1、使用背景

gor 是一款go語言實現的簡單的http流量複製工具,它的主要目的是使你的生產環境HTTP真實流量在測試環境和預發佈環境重現。只須要在 代理例如nginx入口服務器上執行一個進程,就能夠把生產環境的流量複製到任何地方,html

完美解決了HTTP 層實時流量複製和壓力測試的問題。常見的HTTP流量copy工具還有另一款tcpcopy。將機器A上的http請求複製轉發到指定機器B上去,nginx

經過線上流量複製引流,經過將真實請求流量放大N倍來進行壓測,能對服務有一個較爲全面的檢驗。 git

2、安裝

前往官方下載:https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gzgithub

例如,如今將測試環境的流量拷貝到個人性能測試環境中web

測試環境的:正則表達式

http://zichan-manage.xxxxx.com:8080後端

性能測試環境:tomcat

http://dh-manage.xxxx.com:8080服務器

環境結構說明:app

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、應用場景

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"

4、最後

經過案例發現,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

相關文章
相關標籤/搜索