流量复制技术-gor
# 一、简单介绍
- Gor 是一个开源工具,用于捕获实时 HTTP 流量并将其回放到测试环境中,以便使用真实数据持续测试系统的可靠性与稳定性,可以提高开发人员对代码部署、配置更改和基础结构更改的信心。
- Gor 架构试图遵循 UNIX 哲学:一切都由管道组成,各种输入将数据多路复用到输出。
- 用户可以对请求进行速率限制、过滤、重写,甚至可以使用自己的中间件来实现自定义逻辑,还可以以更高的速率重播请求以进行负载测试。
# 二、基本用法
- 用法:gor 输入选项 输出选项
# 1,基础选项
# 指定单个请求的缓冲区大小,默认 5 MB
--copy-buffer-size value
# 指定 CPU 采样数据的写入文件
--cpuprofile string
# 指定多长时间后退出
--exit-after duration
# 设置详细级别,大于 0 时打开 debug 输出模式
-verbose int
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 2,头部选项
# 2.1 正向过滤
# 以正则表达式限定请求体的头部,未匹配上的请求将会被丢弃
# eg:gor --input-raw :8080 --output-http staging.com --http-allow-header api-version:^v1
--http-allow-header value
# 限定允许的请求方法,未匹配上的请求将会被丢弃
# eg:gor --input-raw :8080 --output-http staging.com --http-allow-method GET
--http-allow-method value
# 以正则表达式限定请求的url,未匹配上的请求将会被丢弃
# eg:gor --input-raw :8080 --output-http staging.com --http-allow-url ^www.
--http-allow-url value
# 以正则表达式限定解码之后的基本认证信息,未匹配上的请求将会被丢弃
# gor --input-raw :8080 --output-http staging.com --http-basic-auth-filter "^customer[0-9].*"
--http-basic-auth-filter value
# 接收请求的一小部分,根据特定报头的FNV32-1A哈希一致接受或拒绝请求:
# gor --input-raw :8080 --output-http staging.com --http-header-limiter user-id:25%
--http-header-limiter value
# 通常,gor用 --output-http 提供的主机替换主机http报头,此选项禁用该行为,保留原始主机头。
--http-original-host
# 接收一小部分请求,根据特定GET参数的FNV32-1A散列一致地接受或拒绝请求
# eg:gor --input-raw :8080 --output-http staging.com --http-param-limiter user_id:25%
--http-param-limiter value
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
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
# 2.2 反向过滤
# 以正则表达式限定不允许的请求体的头部,匹配上的请求将会被丢弃
# eg:gor --input-raw :8080 --output-http staging.com --http-disallow-header "User-Agent: Replayed by Gor"
--http-disallow-header value
# 以正则表达式限定不允许的请求的url,匹配上的请求将会被丢弃
# eg:gor --input-raw :8080 --output-http staging.com --http-disallow-url ^www.
--http-disallow-url value
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2.3 修改选项
# 基于映射关系重写请求头部,逗号隔开
# eg:gor --input-raw :8080 --output-http staging.com --http-rewrite-header Host: (.*).example.com,$1.beta.example.com
--http-rewrite-header value
# 基于映射关系重写请求URL,分号隔开
# eg:gor --input-raw :8080 --output-http staging.com --http-rewrite-url /v1/user/([^\/]+)/ping:/v2/user/$1/ping
--http-rewrite-url value
# 向请求中注入额外的头部字段值
# eg:gor --input-raw :8080 --output-http staging.com --http-set-header 'User-Agent: Gor'
--http-set-header value
# 设置请求参数,如果已存在则覆盖
# eg:gor --input-raw :8080 --output-http staging.com --http-set-param api_key=1
--http-set-param value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.4 其他
# 指定端口开启采样,暴露路径 /debug/pprof
--http-pprof :8181
1
2
2
# 3,输入选项
# 3.1 文件输入
# 从文件中读取请求,可能是以前录制的文件
# eg:gor --input-file ./requests.gor --output-http staging.com
--input-file value
# 模拟从数据源读取数据,但不重播,将获得有关预期重放时间,发现记录的数量等信息。
--input-file-dry-run
# 循环从文件中读取,用于性能测试
--input-file-loop
# 设置请求之间的最大时间间隔,当请求间隔时间过长,可以跳过该次请求
--input-file-max-wait duration
# 尝试提前读取和缓存多个记录,与此同时,如果它们无序的话它还执行请求排序。由于它需要在内存中保存这个缓冲区,较大的值可能会导致性能变差(默认值为100)。
--input-file-read-depth int
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 3.2 原始输入
# 从给定的端口捕获流量
# gor --input-raw :8080 --output-http staging.com
--input-raw value
# 如果打开,gor将记录丢失数据包的 HTTP 消息
--input-raw-allow-incomplete
# BPF过滤器编写自定义表达式,可用于非标准网络接口,如隧道或SPAN端口
# eg:--input-raw-bpf-filter 'dst port 80'
--input-raw-bpf-filter string
# 控制操作系统缓冲区的大小,该缓冲区保存数据包直到它们被调度。默认值取决于系统:在Linux中大约为2MB。如果你看到大的包被丢弃,可以增加这个值。
--input-raw-buffer-size value
# 设置pcap超时时间,对于立即模式,不要设置此标志
--input-raw-buffer-timeout duration
# 使用 'libpcap(默认)'、'raw_socket' 或 'pcap_file'拦截流量
--input-raw-engine libpcap
# 等待最后一个TCP数据包的时间,直到认为TCP消息完成(默认2 s)
--input-raw-expire duration
# 指定拦截流量的应用协议,取值范围:http、binary
--input-raw-protocol value
# 如果不为空,则向请求负载注入具有给定名称和真实IP值的 header,通常这个报头应该命名为:X-Real-IP
--input-raw-realip-header string
# 在原始TCP消息上启用统计信息生成器
--input-raw-stats
# 可能的值: PCAP_TSTAMP_HOST, PCAP_TSTAMP_HOST_LOWPREC, PCAP_TSTAMP_HOST_HIPREC, PCAP_TSTAMP_ADAPTER, PCAP_TSTAMP_ADAPTER_UNSYNCED。这个值不是所有系统都支持的,如果你放错了,GoReplay会告诉你可用的值。
--input-raw-timestamp-type string
# 如果打开,gor将跟踪请求之外的响应,并且它们将可用于中间件和文件输出
--input-raw-track-response
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
35
36
37
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
35
36
37
# 3.3 Kafka 相关
# 从 Kafka 读取请求和返回的统计
# eg:gor --output-stdout --input-kafka-host '192.168.0.1:9092,192.168.0.2:9092'
--input-kafka-host string
# 开启 json 格式,而不是文本格式
--input-kafka-json-format
# 指定要读取状态的 kafka 的 topic
# eg:gor --output-stdout --input-kafka-topic 'kafka-log'
--input-kafka-topic string
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 3.4 其他
# 用于测试输出,每秒发出一次 'Get /' 请求
--input-dummy value
# 用于Gor实例之间的内部通信
# eg:gor --input-tcp :28020 --output-http staging.com
--input-tcp value
# PEM编码的证书文件路径,启用TLS时使用
--input-tcp-certificate string
# PEM编码的证书秘钥文件路径,启用TLS时使用
--input-tcp-certificate-key string
# 开启 TLS 安全校验,别忘了指定证书和秘钥文件的路径
--input-tcp-secure
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 4,输出选项
# 4.1 输出到其他 http
# 转发请求到给定的 http 地址
# eg:gor --input-raw :80 --output-http http://staging.com
--output-http value
Forwards incoming requests to given http address.
# 发送请求和响应统计到 ElasticSearch
# eg:gor --input-raw :8080 --output-http staging.com --output-http-elasticsearch 'es_host:api_port/index_name'
--output-http-elasticsearch string
# 当所有 worker 繁忙时输出队列的长度,默认 1000
--output-http-queue-len int
# 允许的重定向次数
--output-http-redirects int
# http 响应缓冲区大小,超过此大小的数据将被丢弃
--output-http-response-buffer value
# 在进行 TLS 安全连接时不进行 hostname 校验
--output-http-skip-verify
# 每 N 毫秒报告一次 http 输出队列状态
--output-http-stats
# 报告一次 http 输出队列状态的时间间隔,默认 5000 ms
--output-http-stats-ms int
# 指定 http 请求响应的超时时间,默认 5 s
--output-http-timeout duration
# 如果打开,http 输出响应将设置为所有输出,如stdout, file等。
--output-http-track-response
# 回收空闲 workers 的时间,默认 2 s
--output-http-worker-timeout duration
# 限制最大 worker 数量,使用动态 worker 数量,默认 0 无限制,
--output-http-workers int
Gor uses dynamic worker scaling. Enter a number to set a maximum number of workers. default = 0 = unlimited.
# 限制最小 worker 数量,默认 1
--output-http-workers-min int
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
35
36
37
38
39
40
41
42
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
35
36
37
38
39
40
41
42
# 4.2 输出到其他 gor 实例
# 采用内部通讯输出到其他 gor 实例
# eg:gor --input-raw :80 --output-tcp replay.local:28020
--output-tcp value
# TCP 响应缓冲区大小,超过该大小的数据将被丢弃
--output-tcp-response-buffer value
# 使用 TLS 安全连接,另一方的输入应该也要开启 TLS
--output-tcp-secure
# 在进行 TLS 安全连接时不进行 hostname 校验
--output-tcp-skip-verify
# 每 5 s 报告一次 TCP 输出队列状态
--output-tcp-stats
# 使用粘性连接,请求与返回使用相同id时,将被发送到同一个连接
--output-tcp-sticky
# 并行的 tcp 连接数量,默认 10
--output-tcp-workers int
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 4.3 输出到文件
# 将输入的请求写入文件
# eg:gor --input-raw :80 --output-file ./requests.gor
--output-file value
# 以追加的方式写入文件
--output-file-append
# 临时存储的缓冲区路径
# eg:gor --input-raw :80 --output-file s3://mybucket/logs/%Y-%m-%d.gz --output-file-buffer /mnt/logs (default "/tmp")
--output-file-buffer string
# 强制缓冲区刷入到文件的时间间隔,默认 1 s
--output-file-flush-interval duration
# 输出文件的最大大小,默认 1TB
--output-file-max-size-limit value
# 块队列的大小,默认 256
--output-file-queue-limit int
# 每个块的大小,默认 32mb
--output-file-size-limit value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 4.4 输出到标准输出
# 直接丢弃所有请求
--output-null
# 输出到屏幕
--output-stdout
1
2
3
4
5
2
3
4
5
# 4.5 二进制输出
# 将传入的二进制有效负载转发到给定地址
# eg:gor --input-raw :80 --input-raw-protocol binary --output-binary staging.com:80
--output-binary value
# 开启二进制的 debug 输出
--output-binary-debug
# 指定HTTP请求/响应超时,默认值为 5s
--output-binary-timeout duration
# 如果打开,二进制输出响应将设置为所有输出,如stdout, file等。
--output-binary-track-response
# 默认情况下,Gor 动态缩放 worker 数量,也可以直接指定
--output-binary-workers int
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 4.6 Kafka 相关
# Kafka TLS 配置的 CA 证书
# eg:gor --input-raw :3000 --output-kafka-host '192.168.0.1:9092' --output-kafka-topic 'topic' --kafka-tls-ca-cert cacert.cer.pem --kafka-tls-client-cert client.cer.pem --kafka-tls-client-key client.key.pem
--kafka-tls-ca-cert string
# Kafka TLS 配置的客户端证书
--kafka-tls-client-cert string
# Kafka TLS 配置的客户端秘钥
--kafka-tls-client-key string
# 将请求和返回的统计发送到 Kafka
# eg:gor --input-raw :8080 --output-kafka-host '192.168.0.1:9092,192.168.0.2:9092'
--output-kafka-host string
# 以 json 的格式而非文本
--output-kafka-json-format
# 指定 topic
# eg:gor --input-raw :8080 --output-kafka-topic 'kafka-log'
--output-kafka-topic string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 4.7 其他
# 输出内存采样数据到指定文件
--memprofile string
# 用于通过外部命令修改流量
--middleware string
# 如果启用,将自动解码请求和响应:Content-Encoding: gzip 和 Transfer-Encoding: chunked,可以与 --output-stdout一起使用
--prettify-http
# 如果打开,http输出将为每个 TCP 会话创建单独的 worker,分割输出也是基于会话的
--recognize-tcp-sessions
# 默认情况下,每个输出获得相同的流量。如果设置为true,则在所有输出中平均分配流量。
--split-output true
# 开启队列状态输出
--stats
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
编辑 (opens new window)
上次更新: 2024/08/21, 19:37:05