gor 是一款go語言實現的簡單的http流量複製工具,它的主要目的是使你的生產環境HTTP真實流量在測試環境和預發佈環境重現。只須要在 代理例如nginx入口服務器上執行一個進程,就能夠把生產環境的流量複製到任何地方,html
完美解決了HTTP 層實時流量複製和壓力測試的問題。常見的HTTP流量copy工具還有另一款tcpcopy。將機器A上的http請求複製轉發到指定機器B上去,nginx
經過線上流量複製引流,經過將真實請求流量放大N倍來進行壓測,能對服務有一個較爲全面的檢驗。 git
前往官方下載: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.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.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