GoReplay流量录制与回放

一、前言

本次参考以下2篇文章,纯粹只了解工具的原理和用法,尚未实践。

https://cloud.tencent.com/developer/article/1491793

https://www.cnblogs.com/qmfsun/p/11598763.html#top(详细)

二、GoReplay简介

gor 是一款go语言实现的简单的http流量复制工具,它的主要目的是使你的生产环境HTTP真实流量在测试环境和预发布环境重现。只需要在 代理例如nginx入口服务器上执行一个进程,就可以把生产环境的流量复制到任何地方,

完美解决了HTTP 层实时流量复制和压力测试的问题。常见的HTTP流量copy工具还有另外一款tcpcopy。将机器A上的http请求复制转发到指定机器B上去,

通过线上流量复制引流,通过将真实请求流量放大N倍来进行压测,能对服务有一个较为全面的检验。 

 

三、GoReplay安装

#下载包
 wget https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz
 
 #解压
 tar xvf gor_1.0.0_x64.tar.gz

 

四、流量录制验证

执行下如下命令,录制80端口的包,输出到控制台,测试下是否可以录制到流量

sudo ./gor --input-raw :3000 --output-stdout

打开浏览器访问部署在该服务器的一个已部署好的80端口的web服务,或者通过curl访问也可以,url如下http://www.testbang.cn/images/about.jpg

如果有如下是输出说明可以成功录制80端口的流量

五、流量回放验证

流量实时复制引流(--input-raw 拦截端口配合--output-http输出),将本机端口3000的HTTP流量复制到目标服务器9090端口,

步骤一,输入如下命令:

sudo ./gor --input-raw :3000 --output-http "http://目标服务器ip:9090"

步骤二:在3000端口url执行请求操作

步骤三:查看ip:9090的请求日志,是可以看到在3000端口执行的请求会在9090被同步执行

注:因为我的端口没地方可以看到请求日志,所以只能靠文字描述下。

六、其他场景命令

以下命令没验证过哈,先转发过来:

1、 如果目标服务器使用的库与线上机器一样,需要只引流Get方法,不应该复制上行方法(POST等)

gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080"

2、 当需要对线上服务进行整体性能压测时,可将线上请求扩大N倍,进行引流

gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080|200%" #将请求扩大1倍,也可缩小,调整"|"后面的百分比即可

3、 只复制某个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代替

4、多目标服务器的流量复制引流,有点类似nginx的mirror

gor --input-raw :80 --output-http "http://target_server:8080" --output-http "http://target_server2:8080"

 

 

 注:gor目前的只能使用较为简单的无鉴权的操作,同时要求线下环境的数据要和线上的数据保持一致,不然会出现线上的请求参数,copy到测试环境出现空指针等异常

posted @ 2022-04-06 12:27  一加一  阅读(1343)  评论(0编辑  收藏  举报