GoReplay简介
GoReplay是一个开源的网络监控工具,它可以记录你的实时流量,并用于跟踪、负载测试、监控和详细分析。录制的流量可以在测试服务器上回放,并支持请求放大,用于性能测试。
github主页: https://github.com/buger/goreplay
GoReplay安装—linux
1 2 3 4
| wget https://github.com/buger/goreplay/releases/download/v1.1.0/gor_1.1.0_x64.tar.gz
tar -zxvf gor_1.1.0_x64.tar.gz
|
GoReplay安装—windows
文档地址: https://github.com/buger/goreplay/wiki/Running-on-Windows
安装nmap工具,进行流量的抓取,地址nmap或者technet,直接下载nmap,安装时勾选带有WinPcap的选项
win版二进制文件goreplay.zip
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| ./gor file-server :8000
sudo ./gor --input-raw :8000 --output-stdout
sudo ./gor --input-raw :8080 --output-file=request.gor
sudo ./gor --input-raw :8000 --output-http http://staging.env
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
sudo gor --input-raw :80 --input-raw-engine "raw_socket" --output-http "http://staging.com"
sudo gor --input-raw :80 --input-raw-realip-header "X-Real-IP" ...
|
从文件保存和回放
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| gor --input-raw :80 --output-file requests.log
gor --input-file requests.gor --output-http "http://staging.com"
gor ... --output-file %Y%m%d.log
20140608_0.log 20140608_1.log 20140609_0.log 20140609_1.log
gor ... --output-file %Y%m%d.log --output-file-append
20140608.log 20140609.log
gor --input-raw :80 --output-file %Y-%m-%d.gz --output-file-size-limit 256m --output-file-queue-limit 0
%Y:年 %m:月 %d:日 %H:时 %M:分 %S:秒
...--output-file log.gz
gor --input-file "requests.gor|200%" --output-http "staging.com"
|
记录response
1 2
| ./gor --input-raw :8081 --input-raw-track-response --output-file uat-request%Y%m%d%H.log --output-file-append --http-disallow-url .*order.* .*aliPay.* .*wxPay.* .*refund.*
|
远程转发
1 2 3 4
| ./gor --input-raw :8081 --output-tcp 127.0.0.1:2020 --http-allow-url /admin
./gor --input-tcp :2020 --output-file admin-%Y%m%d%H.log --output-file-append
|
速度限制
输入和输出都支持速度限制,在上一个已经介绍了读取文件速度限制。
1 2 3 4 5
| gor --input-tcp :28020 --output-http "http://staging.com|10"
gor --input-raw :80 --output-tcp "replay.local:28020|10%"
|
可以根据请求头或地址参数设置回放速度限制,只按照这部分进行限速,只支持百分比
1 2 3 4 5
| gor --input-raw :80 --output-tcp "replay.local:28020|10%" --http-header-limiter "X-API-KEY: 10%"
gor --input-raw :80 --output-tcp "replay.local:28020|10%" --http-param-limiter "api_key: 10%"
|
请求过滤
如果只想抓取特定的请求,可以进行过滤,支持URL地址,HTTP header或者HTTP method
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| gor --input-raw :8080 --output-http staging.com --http-allow-url /api
./gor --input-raw :8081 --output-file uat-request%Y%m%d%H.log --output-file-append --http-disallow-url .*order.* .*aliPay.* .*wxPay.* .*refund.*
gor --input-raw :8080 --output-http staging.com --http-disallow-url /api
gor --input-raw :8080 --output-http staging.com --http-allow-header api-version:^1\.0\d
gor --input-raw :8080 --output-http staging.com --http-disallow-header "User-Agent: Replayed by Gor"
gor --input-raw :80 --output-http "http://staging.server" \ --http-allow-method GET \ --http-allow-method OPTIONS
|
请求重写
gor支持对URL、URL参数和header的重写。可以用于将token进行重写,完成测试。
1 2 3 4 5 6 7 8 9 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对每天服务器进行请求转发,将集群的请求集中一起。
1 2 3 4 5
| sudo gor --input-raw :80 --output-tcp replay.local:28020
gor --input-tcp replay.local:28020 --output-http http://staging.com
|
如果要转发至多个服务中,可以使用–split-output,它可以轮询将入口流量回放到多个服务中
1 2
| gor --input-raw :80 --split-output --output-tcp replay1.local:28020 --output-tcp replay2.local:28020
|
它还可以更智能的将同一个会话传递到同一个服务中,控制流量的从属。
1 2 3 4 5
| gor --input-file logs_from_multiple_machines.*|1000% --input-file-loop --exit-after 30s --recognize-tcp-sessions --split-output --output-tcp worker1.local --output-tcp worker2.local:27017 --output-tcp worker3.local:27017 ... --output-tcp workerN.local:27017
gor --input-tcp :27017 --ouput-http load_test.target
|
和Kafka配合使用
1 2 3 4 5
| gor --input-raw :8080 --output-kafka-host '192.168.0.1:9092,192.168.0.2:9092' --output-kafka-topic 'kafka-log'
gor --input-kafka-host '192.168.0.1:9092,192.168.0.2:9092' --input-kafka-topic 'kafka-log' --output-stdout
|
通过–output-kafka-json-format和–input-kafka-json-format可以使用json格式进行读取和推送,但是会影响性能
参数解释
1 2 3 4 5 6 7
| --input-raw -用户捕获HTTP流量,应指定IP(接口)以及端口 --input-file - 读取记录的文件,通过其他方式回放 --input-tcp - 将流量从多个转发gor转发到该实例 --output-http - 回放HTTP请求到指定站点,接受基本url --output-file - 将HTTP请求流量到文件 --output-tcp - 将流量转发到另一个gor实例,使用--input-tcp接受 --output-stdout - 将THHP请求打印到控制台,在调试时使用
|
不使用root用户运行
1 2 3 4 5 6 7 8 9
|
groupadd gor useradd -g gor gor
chgrp gor /usr/local/gor chmod 0750 /usr/lcoa/gor
setcap "cap_net_raw,cap_net_admin+eip" /usr/local/bin/gor
|
至此,可以直接使用gor命令运行