目录
一、GoReplay环境搭建
1、Mac、Linux安装GoReplay环境
1,项目下载地址:
https://github.com/buger/goreplay/releases/tag/1.3.3
2,mac、Linux可以直接在终端输入
curl -L -O https://github..com/buger/goreplay/releases/download/1.3.3/gor_1.3.3_mac.tar.gz
3,解压压缩包
tar -zxvf gor_1.3.3_mac.tar.gz
4,配置环境变量,mac、Linux修改/ect/profile文件,在末尾添加
配置goreplay环境变量
GOR_HOME="yourPath/goreplay"
export PATH="GOR_HOME:PATH"
5,验证环境,显示版本号就安装完成
gor version
二、GoReplay录制与重播
1、搭建练习接口
你可以通过调用快速启动服务器gor file-server :8000
,这将在端口上启动当前目录的简单文件服务器8000
gor file-server :8000
2、录制命令
1,录制所有http请求,以下命令是录制5000端口全部的http请求,接受之前的录制文件./log/logrequests_0.gor,并且把新的录制文件输出到./log/logrequests.gor文件,
请注意,默认情况下 GoReplay 不跟踪响应,您可以使用--output-http-track-response
选项启用它们,在文件名中使用日期变量:%Y-%m-%d-%H
sudo gor --input-raw 127.0.0.1:5000 --output-stdout --output-file='./log/logrequests.gor' -output-file-append --output-file-max-size-limit "4294967296"
--input-raw
- 用于捕获HTTP流量,您应该指定IP地址或接口和应用程序端口。有关捕获和重放流量的更多信息。--input-file
- 接受之前使用 录制的文件--output-file
。有关从文件保存和重播的更多信息
3、重播命令
1,下列这行命令展示了使用录制的文件重播请求,所有记录的请求都到达第二个服务器,并且它们将以与记录时相同的顺 序和完全相同的时间重播。--input-file参数接受录制的文件,--output-http参数接受需要重播的服务器,出现FileInput: end of file 提示,说明重播完成
gor --input-file='./log/logrequests_0.gor' --output-http='http://127.0.0.1:5000'
三、GoReplay单个命令
1、常用命令
当您需要仅捕获流量的特定部分(例如 API 请求)时,匹配非常有用。可以按 URL、HTTP 标头或 HTTP 方法进行匹配,匹配方式使用正则表达式。
-http-allow-header value 根据请求头匹配,其他内容将被排除
-http-allow-method value 根据请求方式匹配,其他内容将被排除
-http-allow-url value 根据请求url匹配,其他内容将被排除
-http-disallow-header value 根据请求头匹配,其他内容将被记录
-http-disallow-url value 根据请求url匹配,其他内容将被记录
-http-header-limiter value 根据请求头,接受一部分请求
-http-param-limiter value 根据url,接受一部分请求
-http-original-host 保留原始请求头,默认gor会用--output http提供的主机替换Host http头
-http-rewrite-header value 根据匹配的内容重写请求头
-http-rewrite-url value 根据匹配的内容重写请求url
-http-set-header value 向请求中添加额外的请求头
-http-set-param value 设置请求中的param参数,如果已经存在,将会被覆盖
-input-file value 从文件读取请求
-input-file-loop 循环读取文件,一般用于性能测试
-input-raw value 从给定端口捕获流量,需要root权限
-input-tcp-secure 启用TLS证书,需要指定证书跟密钥
-input-tcp-certificate string TLS开启时,指定的证书路
-input-tcp-certificate-key string TLS开启时,指定的密钥路径
-output-file value 将请求写入文件
-output-file-queue-limit int 区块队列的长度。默认值:256
-output-file-size-limit value 每个区块的大小。默认值:32mb
-output-http value 将传入请求转发到给定的http地址
--output-http-track-response 默认情况下 GoReplay 不跟踪响应,加上这个参数跟踪响应
--input-raw-track-response 默认情况下input-raw
不拦截响应,仅拦截请求。您可以加这个参数开启响应跟踪。启用后,您将能够访问中间件和output-file
--input-file-dry-run 试运行模式,来预览需要多长时间以及给定文件输入中有多少个请求。它还会告诉您有用的信息,例如请求之间的最短和最长时间,以及第一次请求的时间。
--input-raw-max-wait 跳过大的延迟,选项(以秒为单位),该选项允许跳过录制文件中的长时间停顿。
--input-raw-allow-incomplete 如果打开,Gor将记录丢失数据包的HTTP消息
2、其他命令
-input-raw-engine libpcap 选择libpcap(默认)或者`raw_socket`拦截流量
-output-http-debug 启用http调试输出。
-input-raw-realip-header string 如果不为空,默认在请求头加上实际ip,X-Real-IP
-input-raw-track-response 如果启用,Gor将跟踪请求之外的响应,并且它们将可用于中间件和文件输出
-input-kafka-host string 向Kafka发送请求和响应统计信息
-input-kafka-json-format 启动表示消息是json格式而不是GoReplay格式
-input-kafka-topic string 向Kafka发送请求和响应统计信息
-output-kafka-host string 从Kafka读取请求和响应统计信息
-output-kafka-json-format 如果启用,它将把消息从GoReplay文本格式序列化为JSON
-output-kafka-topic string 从Kafka读取请求和响应统计信息
-input-dummy value 用于测试输出。每1s发出'get /'请求
-output-file-append 刷新的块是否附加到存在文件,只保留一个流量文件
-output-file-flush-interval duration 强制刷新文件缓冲区的时间间隔,默认为1s,一般不需要改动
-output-http-elasticsearch string 向ElasticSearch发送请求和响应统计信息
-output-http-redirects int 启用重定向的频率
-output-http-response-buffer int HTTP响应缓冲区大小,此大小之后的所有数据都将被丢弃
-output-http-stats 每5秒向控制台报告一次http输出队列统计信息
-output-http-timeout duration 指定HTTP请求/响应超时。默认情况下为5s
-output-http-track-response 如果启用,HTTP输出响应将设置为所有输出,如stdout、file等
-output-http-workers int 以多少个协程同时产生http请求,默认是动态,官方文档显示无限制,实际代码中设置了10,这块有争议
-output-null 用于测试输入。删除所有请求
-output-stdout 用于测试输入。只是将来自输入的数据打印到控制台。
-output-tcp value 用于Gor实例之间的内部通信sh
-output-tcp-secure 使用TLS安全连接--另一端的输入文件也应该打开TLS
-output-tcp-stats 每5秒向控制台报告一次TCP输出队列统计信息
-verbose 启用更详细的输出
3、命令示例
命令区分大小写,参数后面的精准匹配的时候不区分大小写,用正则表达式区分大小写
1,提示-bash: !': event not found,输入echo $-显示himBH,原因是确认是由于 H - histexpand 模式打开了导致。命令行下,双引号里面用了 ! 的话,Shell 会以为要执行历史展开,从而导致报错,解决方法:关闭 histexpand,输入set +H,再输入echo $-显示himB就可以了。
2,把双引号替换成单引号
从perf文件读取请求,添加param参数goreplay=1,添加header信息'perf':'yes',保留原始请求头,匹配url为^/user/authgetUserInfo$,输出到perf.log文件
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url ^/user/authgetUserInfo?.+
试运行模式,您无需执行实际重播即可获取有关文件内容的信息。仅支持goreplay1.3版本以上
例如,它可以告诉您文件中有多少个请求,以及重播这些请求需要多长时间。
报告示例:
gor --input-file=流量文件 --output-stdout --input-file-dry-run
找到的记录:192
格式错误的记录:<nil>
已处理的文件:1
处理的字节数:88512
最大等待时间:71.369ms
最短等待时间:15.884ms
首次等待:55.401ms
以目前的速度重放需要7.82033秒。
找到0条时间戳不正常的记录
添加请求头,goreplay:1
goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-set-header 'goreplay:1'
添加param参数,perf=1
goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-set-param 'goreplay=1'
goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-allow-header '^Host: .*.baidu.com.*'
匹配url为/user开头的所有接口,后面路径包含空用*,不包含空用+,[^\/]表示除了匹配/所有的字符
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user.+'
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user/[^\/]'
匹配以getUserInfo结尾的所有接口
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^.*getUserInfo?.+'
匹配url为/user开头,排除结尾是/getUserInfo的所有接口,输出到perf.log文件
以下是用--http-allow-url搭配--http-disallow-url参数组合匹配的结果,同时满足a跟b两个条件,可以正常匹配
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user.*' --http-disallow-url '.\*getUserInfo'
更新头部信息跟param参数,如果参数存在,则更新,如果不存在,则添加,不能删除
goreplay --input-file='perf_0.log' --http-set-param 'goreplay=0' --http-set-header 'perf':'no' --http-original-host --output-file='perf.log'
重写请求url,匹配/user开头的url重写为/api/user开头,当重写跟匹配url一起时,先匹配url再重写url,需要匹配的url是重写之前的url
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-rewrite-url '/user/([^\/]+):/api/user/1' --http-allow-url '\^\\/user.\*'
重写版本号,user重写为userv2
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-rewrite-url '^/user/([^/]):/userv2/$1' --http-allow-url '^/user/[^/]'
匹配/user/orders/detail开头,结尾是大写字母+数字,8到18位的字符串
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^/user/orders/detail/[A-Z0-9]{8,15}'
可以同时匹配到,/user/orders/detail/LBL67047,/user/orders/detail/GSHN7W61400M120,用^/user/orders/detail/[a-z0-9]{8,15},不能匹配大写字母
4、性能测试
- 以50%的速度回放
- goreplay --input-file='perf' --http-original-host --output-tcp '127.0.0.1:5000:50%'
- 以秒50的速度回放
- goreplay --input-file='perf' --http-original-host --output-tcp '127.0.0.1:5000|50'
- 文件回放完继续循环
- goreplay --input-file='perf' --http-original-host --output-tcp '127.0.0.1:5000' --input-file-loop
- 从文件读取输出到http
- goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout
- 从文件读取,输出到http,同时指定python中间件处理
- goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'
5、正则表达式
- 注意:goreplay无论哪个版本都不支持正反向正向预查和负向预查
- 匹配以/user开头,^/user
- 匹配以/user结尾,/user$
- 匹配1个或1个以上,+
- 匹配0,1或1个以上的,*
- 匹配0或者1个,最多一个多,?
- 匹配否定字符,[^]表示匹配任何字符集包括\n,[^abc]表示匹配非a或者b或者c的字符集,匹配u/s/e/r中的任一字符,[user]
- 匹配a-z区间所有的大小写字母,[a-z][A-Z]
- 匹配所有的字母下划线,/\w\g
- 精准匹配以/abt开头/userinfo结尾,^/abt/userinfo$,可以匹配到/abt/userinfo,不能匹配到/abt/userinfo/a, /a/abt/userinfo,/abt/a/userinfo
- 匹配以/abt开头/userinfo结尾,中间至少一个路径,^/abt/\w+/userinfo,匹配/abt/aaa/userinfo,不能匹配/abt/userinfo,匹配以/abt开头/userinfo结尾,中间0-1一个路径,\^/abt/\\w\*/userinfo,匹配abt/aaa/userinfo,abt/userinfo
- 匹配/user/orders/detail接口结尾是大写字母跟数字16位组合,^/user/orders/detail/[A-Z0-9]+$,/user/orders/detail/GSHN7Q02C002006
- 匹配以'/user'开头并且不以'/auth/getUserInfo'结尾的任意字符串,
^\/user(?!\/auth\/getUserInfo).*$ (不能在gor使用)
- 匹配,/user/orders/track/GSHN7B38R00NGA4,/user/auth/mc/getKey,/user/auth,排除,/user/auth/getUserInfo
四、gorepaly组合命令
1、组合命令实例
- 这里用到了改变速率命令,以500%的速度输出用|500%,以每秒500个请求输出用:500
如果输出的文件名称跟时间相关,输出的文件名优先级高,比如14跟15点都是同一个快内,但是文件名会拆分成两个
用--output-file-queue-limit 0设置队列为0
gor --input-file 'perf|500%' --output-file '%Y-%m-%d-%H.log' --http-disallow-url '^/user/orders/detail/[A-Z0-9]{8,15}' --http-disallow-url '\^/\\w.\*.html' --output-file-queue-limit 0 - 用命令匹配url同时允许多个url,允许a-url,同时允许b-url,匹配的结果会包括aurl或者b-url的所有url,url=a+b
gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+' --http-allow-url '\^/\[a-zA-Z\]+/auth/\[a-zA-Z\]+?.+' --output-file-queue-limit 0 - 用命令匹配url同时不允许多个url,不允许a-url,不同时允许b-url,匹配的结果会包括除了满足a-url或者b-url的所有url,url=url-(a+b)
- gor --input-file 'perf|2000%' --output-file 'perf.log' --http-disallow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+' --http-disallow-url '\^/\[a-zA-Z\]+/auth/\[a-zA-Z\]+?.+' --output-file-queue-limit 0
- 用命令匹配url一个允许一个不允许,允许a-url,不同时允许b-url,匹配的结果会包括满足a-url减去b-url的所有url,url=a-b
- gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+' --http-disallow-url '\^/\[a-zA-Z\]+/auth/\[a-zA-Z\]+?.+' --output-file-queue-limit 0
- 用命令匹配允许url并且重写url跟header,允许a-url,允许b条件,重写a-url为/api/a-url,重写header为User-Agent: gor,允许处理原始数据,然后处理重写url跟header,输出后的内容,url=/api/a+b,header=重写后的a+重写后的b
- gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+' --http-allow-url '\^/pdsearch/\[0-9a-zA-Z\]+/.+' --http-rewrite-url '(^/user/[a-zA-Z]+/[a-zA-Z]+?.+$):/api$1' --http-set-header 'User-Agent':'gor' --output-file-queue-limit 0
- 从url录制所有的请求,需要root权限
- sudo gor -input-raw '127.0.0.1:5000' --output-file 'test.gor' --output-stdout --output-file-queue-limit 0
- gor命令搭配中间件处理
- gor --input-file 'test.gor|800%' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'
2、gorepaly注意事项
1,gor录制的时候,流量会存在不完整的情况,如果直接使用中间件处理,容易报错或者出现异常,如果出现异常后,没有日志返回结束或者nohup.txt没有返回,但是gor进程已经结束了,这种情况需要手动关闭node中间件进程
2,出现异常流量的时候,建议更换流量文件或者先用gor回放到文件,然后在使用回放后的文件用中间件处理
3,回放时直接使用中间件&gor命令回放到服务器时,会消耗部分性能,比直接从流量文件回放效率低,建议流量文件先使用中间件或者命令回放一次到文件,然后直接使用文件回放到服务器,这样效率较高
4,录制的流量包体过大,需要加参数,--input-raw-override-snaplen
5、 回放流量的时候,有时候会流量波动大,偶尔流量比较小,需要加上参数--input-file-max-wait=200ms,允许跳过录制文件中的超过200ms的延迟