官网: https://goreplay.org
下载:https://github.com/buger/goreplay/releases
官网使用说明:https://github.com/buger/goreplay/wiki
使用说明:参考CSDN链接
tar -zxvf gor_1.3.3_mac.tar.gz
解压出出gor文件夹
参数解释
--input-raw :用来捕捉http流量,需要指定ip地址和端口
-–output-stdout:终端输出
-–output-file:指定保存流量的文件位置(必须以.gor后缀)
–-input-file :指定输入流量的文件
–-output-http:指定流量释放的对象server,需要指定IP地址和端口
–-input-tcp:将多个Goreplay实例获取的流量聚集到一个Goreplay实例
–-output-tcp:将获取的流量转移至另外的Goreplay实例
–-http-disallow-url :不允许正则匹配的URL
–-http-allow-header :允许的Header头
–-http-disallow-header:不允许的Header头
–-http-allow-method:允许的请求方法,传入值为GET,POST,OPTIONS等
–-input-file-loop:无限循环,而不是读完这个文件就停止了
–-output-http-workers:并发请求数
–-stats --out-http-stats 每5秒输出一次TPS数据(查看统计信息)
–-split-output true: 按照轮训方式分割流量
–-output-http-timeout 30s:http超时30秒时间设置,默认是5秒
模仿本地服务
./gor file-server :8000
sudo ./gor --input-raw :8000 --output-stdout
sudo ./gor --input-raw :8000 --output-file=requests.gor
上述命令将8000端口的流量,保存到requests.gor文件中(必须是.gor后缀,其它后缀经测释放时有问题)。
sudo ./gor --input-file requests_0.gor --output-http="http://localhost:8001"
释放所有保存在requests_0.gor中的请求通过相同的时间顺序释放到服务器http://localhost:8001。
./gor --input-raw :8000 --output-stdout --http-allow-url /api
./gor --input-raw :8000 --output-stdout --http-allow-url /api
./gor --input-raw :8000 --output-stdout --http-allow-method GET --http-allow-method POST
./gor --input-raw :8000 --output-stdout --http-disallow-url /api
sudo ./gor --input-file requests_0.gor --output-http="http://localhost:8001|10" (每秒请求数限制10个以内)
sudo ./gor --input-raw :8000 --output-http="http://localhost:8001|10%" (每秒请求数限制10%以内)
sudo ./goreplay --input-raw :80 --output-http "http://localhost:8001|10%" --http-header-limiter "X-API-KEY: 10%"
sudo ./goreplay --input-raw :80 --output-http "http://localhost:8001|10%" --http-param-limiter "api_key: 10%"
# --input-file 从文件中获取请求数据,重放的时候 100x 倍速
# --input-file-loop 无限循环,而不是读完这个文件就停止
# --output-http 发送请求到 http://host2.com
# --output-http-workers 并发 100 发请求
# --stats --output-http-stats 每 5 秒输出一次 TPS 数据
$ ./goreplay --input-file 'request.gor|10000%' --input-file-loop --output-http 'http://host2.com' --output-http-workers 100 --stats --output-http-stats
sudo ./gor --input-tcp :28020 --output-http "http://staging.com" --output-http "http://dev.com"
sudo ./gor --input-raw :80 --output-http "http://staging.com" --output-http "http://dev.com" --split-output true
./gor --input-tcp replay.local:28020 --output-http http://staging.com --output-http-timeout 30s
./gor --input-file "requests.gor|200%" --output-http "staging.com"
./gor --input-tcp :28020 --output-http "http://staging.com|10"
gor --input-raw :8080 --output-http staging.com --http-rewrite-url /v1/user/([^\\/]+)/ping:/v2/user/$1/ping
gor --input-raw :8080 --output-http staging.com --http-set-param api_key=1
gor --input-raw :80 --output-http "http://staging.server" --http-header "User-Agent: Replayed by Gor" --http-header "Enable-Feature-X: true"
./gor --input-raw :8000 --output-http http://staging.com --output-http-elasticsearch localhost:9200/gor
如果您在Header或URL中存储了唯一的用户ID(例如API密钥),则可以仅针对该用户的一部分持续转发指定的流量百分比。基本公式如下:FNV32-1A_hashing(value) % 100 >= chance。例子:
# Limit based on header value
sudo ./gor --input-raw :80 --output-tcp "replay.local:28020|10%" --http-header-limiter "X-API-KEY: 10%"
# Limit based on header value
sudo ./gor --input-raw :80 --output-tcp "replay.local:28020|10%" --http-param-limiter "api_key: 10%"
注意点
如果 HTTP 请求不符合规范,可能会抓不到包。遇到过 HTTP 请求头里面的 Content-Length 不等于实际的 Body 大小,goreplay 认为其请求未结束。
input-file 是单 goroutine 在跑,会有性能瓶颈。测试的时候,读取的 RPS 在 1.7w - 1.8w 左右,如果压测需求大于这个,需要开多个进程同时跑。
配置说明:https://github.com/buger/goreplay/wiki/Distributed-configuration