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