goreplay使用

官网: https://goreplay.org 

安装

解压下载下来的压缩包
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
1、捕获网络流量并在终端输出–input-raw --output-stdout
sudo ./gor --input-raw :8000 --output-stdout
2、捕获网流量保存到文件中–output-file
sudo ./gor --input-raw :8000 --output-file=requests.gor

上述命令将8000端口的流量,保存到requests.gor文件中(必须是.gor后缀,其它后缀经测释放时有问题)。

3、捕获网流量保存到文件中然后回放–output-http
sudo ./gor --input-file requests_0.gor --output-http="http://localhost:8001"

释放所有保存在requests_0.gor中的请求通过相同的时间顺序释放到服务器http://localhost:8001。

4、捕获网流量过滤
4.1 过滤允许请求头 --http-allow-url
./gor --input-raw :8000 --output-stdout --http-allow-url /api
4.2 过滤不允许请求头 --http-disallow-url
./gor --input-raw :8000 --output-stdout --http-allow-url /api
4.3 过滤请求方法 --http-allow-method
./gor --input-raw :8000 --output-stdout --http-allow-method GET --http-allow-method POST
4.4 过滤不允许正则匹配的URL --http-disallow-url
./gor --input-raw :8000 --output-stdout --http-disallow-url /api
5、回放流量限速机制
5.1限制每秒的请求数
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%以内)
5.2基于Header或URL的参数限制一些请求,为指定的Header或者URL的请求设定限制的百分比
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%"
5、性能测试
5.1如果是性能测试,可以不考虑请求的顺序和速率,并且要求无限循环
# --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
5.2流量回放到多个站点(复制引流)
sudo ./gor --input-tcp :28020 --output-http "http://staging.com"  --output-http "http://dev.com"
5.3按照轮训方式分割流量(平分流量)
sudo ./gor --input-raw :80 --output-http "http://staging.com"  --output-http "http://dev.com" --split-output true
5.4HTTP超时设置
./gor --input-tcp replay.local:28020 --output-http http://staging.com --output-http-timeout 30s
5.5性能测试(表示放大2倍速度来回放)
./gor --input-file "requests.gor|200%" --output-http "staging.com"
5.6回放速率不超过10QPS(绝对值)
./gor --input-tcp :28020 --output-http "http://staging.com|10"
5.7重写请求
gor --input-raw :8080 --output-http staging.com --http-rewrite-url /v1/user/([^\\/]+)/ping:/v2/user/$1/ping
5.8设置URL参数
gor --input-raw :8080 --output-http staging.com --http-set-param api_key=1
5.9设置HEADER
gor --input-raw :80 --output-http "http://staging.server" --http-header "User-Agent: Replayed by Gor" --http-header "Enable-Feature-X: true"
5.10导出到ES
./gor --input-raw :8000 --output-http http://staging.com  --output-http-elasticsearch localhost:9200/gor
5.11基于Header或URL参数值的一致限制

如果您在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 左右,如果压测需求大于这个,需要开多个进程同时跑。

分布式配置