Goreplay是一款做http请求录制回放的工具,go语言开发,基于验证在正常请求下,是否有报错;在倍数请求下,系统是否存在性能瓶颈
https://github.com/buger/goreplay/wiki
原理 - 使用pcap的go接口,使用bpf(伯克利包过滤)设置指定端口的过滤表达式,截取到tcp报文之后,根据网络五元组(<源IP,源端口,目标IP,目标端口,协议>)作为key露拼装message,因为HTTP基于TCP协议,根据TCP协议中的ACK以及SEQ识别一次调用包的完整性,把一次HTTP调用的一个或多个TCP报文拼装后,如果识别到HTTP协议报文已经结束,可以进入转发阶段,转发即把这些报文中的数据段拼装后,直接对命令行上指定的端口发送TCP报文,从而完成转发。
基本命令:
gor --input-raw :8080 --http-allow-url /allow/urlx --http-disallow-url /disallow/urlx --output-file test.gor --output-file-append gor --input-file 'test.gor|100%' --output-http 'http://xxx.xxx.xxx.xxx:8080' --output-http-workers-min 100 --output-http-workers 200
输入有raw、kafka、http、tcp、file
输出有raw、kafka、http、tcp、file、stdout
配置:
功能组 | 配置项 | 功能解释 | 代码潜析 |
进程通用配置 |
--exit-after 5s |
进程多久后退出 |
|
output-http
|
--output-http-stats --output-http-stats-ms 1000 |
按设定时间间隔打印统计信息,默认5s latest,mean,max,count,count/second,gcount |
https://www.cnblogs.com/it-worker365/p/15113743.html |
--output-http-workers-min 100 --output-http-workers 200 --output-http-worker-timeout |
http输出工作线程数 默认情况下,Gor创建一个动态工作池:它从10开始,并在HTTP输出队列长度大于10时创建更多的HTTP输出工作者。创建的工人数量(N)等于该工作时间的队列长度检查并发现其长度大于10.每次将消息写入HTTP输出队列时都检查队列长度。在产生N名工人的请求得到满足之前,不会再有工人产卵。如果动态工作人员当时不能处理消息,它将睡眠100毫秒。如果动态工作人员无法处理消息2秒钟,则会死亡。您可以使用--output-http-workers=20选项指定固定数量的工人 |
https://www.cnblogs.com/it-worker365/p/15113764.html | |
--output-http-timeout | http输出访问http客户端超时时间 | ||
--output-http-queue-len | http输出队列大小 | https://www.cnblogs.com/it-worker365/p/15114622.html | |
--output-http-response-buffer | 响应缓冲区 | ||
output-file |
--output-file-size-limit --output-file-queue-limit |
块队列的长度和每个块的大小。默认值分别是256和32mb。可以使用后缀“k”(KB),“m”(MB)和“g”(GB) |
https://www.cnblogs.com/it-worker365/p/15113819.html |
--output-file-append | 单独文件append存储 | ||
--output-file-flush-interval | 刷盘间隔默认100ms | https://www.cnblogs.com/it-worker365/p/15114667.html | |
--output-file-buffer | 临时文件地址,默认/tmp | ||
input-file | 变速回放 | test.gor|1 最大不超过1QPS; test.gor|100% 不超过原流量的100%; 变速回放支持 | https://www.cnblogs.com/it-worker365/p/15113961.html |
--input-file-loop | 文件循环使用 | ||
input-raw | --input-raw-buffer-size 10485760 |
goreplay基于libpcap和操作系统底层通讯数据包缓冲,组合协议请求 超过缓冲区大小的请求会被丢弃,故设置Buffer 录制数据丢失可以尝试调大该参数即可 |
https://github.com/buger/goreplay/wiki/ Dealing-with-missing-requests-and-responses https://www.cnblogs.com/it-worker365/p/15114596.html |
--copy-buffer-size |
每个请求的最大Buffer |
https://www.cnblogs.com/it-worker365/p/15114596.html |
|
--input-raw-track-response |
收集返回结果 |
||
--input-raw-realip-header |
保存来源真实ip --input-raw-realip-header "X-Real-IP" |
||
http其他配置 | --http-set-header |
为请求添加头部信息--http-set-header 'User-Agent: Gor' |
https://www.cnblogs.com/it-worker365/p/15113907.html |
--http-rewrite-header |
表达式修改头部信息 --http-rewrite-header Host: (.*).example.com,$1.beta.example.com |
||
--http-set-param | 修改头部信息--http-set-param api_key=1 | ||
--http-allow-method |
允许的请求方法 --http-allow-method GET --http-allow-method OPTIONS |
||
--http-allow-url | 允许的请求url表达式--http-allow-url ^www. | ||
--http-disallow-url | 不允许的请求表达式--http-disallow-url ^www. | ||
--http-rewrite-url |
表达式重写 --http-rewrite-url /v1/user/([^\/]+)/ping:/v2/user/$1/ping |
||
--http-allow-header | 允许的头部--http-allow-header api-version:^v1 | ||
--http-disallow-header |
不允许的头部 --http-disallow-header "User-Agent: Replayed by Gor" |
||
--http-header-limiter | 对头部信息进行百分比过滤--http-header-limiter user-id:25% | ||
--http-param-limiter | 对请求参数进行百分比过滤--http-param-limiter user_id:25% |
引用例子比较全的文档:https://blog.csdn.net/qq_40093255/article/details/117227229
辅助工具:
gor file-server :8000