随着应用功能的不断增加,测试它所需的工作量也会成倍增加。GoReplay则为我们提供了一个简单而快速的测试方法,即重用现有流量进行测试。它能够记录和分析应用程序的流量,且不会对应用程序造成影响。
一、简介
GoReplay,又称Gor,是一个采用Golang编写的、开源的HTTP实时流量捕获和重放工具。通过它可以完成流量复制、负载测试、流量监控和流量分析等工作。它以守护进程(而不是Proxy)的形式运行在集群的入口服务器上(比如,nginx),同时不会入侵现有的集群架构。Gor的工作原理如下:

二、安装
Gor的安装十分简单,下载官网的二进制包,然后解压的任意PATH目录下即可:
1 2 3
| mkdir -p ~/download/ wget -O ~/download/gor_v1.2.0_x64.tar.gz https://github.com/buger/goreplay/releases/download/v1.2.0/gor_v1.2.0_x64.tar.gz sudo tar xf ~/download/gor_v1.2.0_x64.tar.gz -C /usr/local/bin/
|
三、实时捕获HTTP流量
3.1、运行Web服务
Gor通常运行在集群的入口服务器上捕获用户的请求。这里,为了便于演示在安装了Gor的服务器上使用Docker启动了一个Nginx服务:
1
| docker run -d -p 8080:80 --name web nginx
|
3.2、捕获流量
想要捕获HTTP流量只需执行如下命令即可:
1
| sudo gor --input-raw :8080 --output-stdout
|
该命令会监听8080端口上的所有网络活动,并会将捕获到的数据记录到stdout。此时,如果我们再打开一个终端并执行curl -I 127.0.0.1:8080,在原来的终端上则会看到类似如下的输出信息:
1 2 3 4 5
| 1 d06a877080ceafe56b851d62d7411a7d7c58e762 1602318552165570232 185093 HEAD / HTTP/1.1 Host: 127.0.0.1:8080 User-Agent: curl/7.58.0 Accept: */*
|
需要注意的是,默认情况下GoReplay不追踪响应,可以使用--output-http-track-response参数启用它。
四、实时重放HTTP流量
4.1、运行Web服务
这次我们在安装了Gor的服务器上的运行两个Nginx服务,如下:
1 2
| docker run -d -p 8081:80 --name web1 nginx docker run -d -p 8082:80 --name web2 nginx
|
4.2、重放流量
重放流量也很简单,执行如下命令即可:
1
| sudo gor --input-raw :8081 --output-http="http://127.0.0.1:8082"
|
此时,如果我们访问web1,在web2的访问日志中会看到有同样的请求存在:
1 2 3 4 5 6
| $ curl http://127.0.0.1:8081 ...
$ docker logs -f web2 ... 172.17.0.1 - - [10/Oct/2020:08:52:01 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
|
五、离线重放
当然,除了实时重放外,Gor还支持将捕获到的数据保存在文件中,以供之后再进行重放。
5.1、运行Web服务
这里我们还是在安装了Gor的服务器上的运行一个Nginx服务,如下:
1
| docker run -d -p 80:80 --name nginx nginx
|
5.2、捕获流量,并存入文件
要想将捕获到的HTTP流量存入文件也很简单,执行如下命令即可:
1
| sudo gor --input-raw :80 --output-file=requests.gor --output-file-append
|
需要注意的是,默认情况下gor会将捕获到的数据写入到多个文件中,可以使用--output-file-append参数关闭它。
访问web服务后,在文件requests.gor中可以看到类似如下内容:
1 2 3 4 5 6 7 8 9 10 11
| $ sudo cat requests.gor 1 de21503b1ba356be5c585fc3e989b3dbba5e51ca 1602320715010273170 724411 GET / HTTP/1.1 Host: 127.0.0.1 User-Agent: curl/7.58.0 Accept: */*
🐵🙈🙉 1 a110b64c69f71e9e370296e2ffd10d71290998c7 1602320715010715372 364743 ...
|
5.3、重放请求
重放请求也是一条命令的事,如下:
1
| sudo gor --input-file requests.gor --output-http="http://127.0.0.1"
|
此时,我们如果观察nginx的访问日志,会有如下输出:
1 2 3 4 5 6
| $ docker logs -f nginx ... 172.17.0.1 - - [10/Oct/2020:09:14:15 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-" 172.17.0.1 - - [10/Oct/2020:09:14:15 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-" 172.17.0.1 - - [10/Oct/2020:09:14:15 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-" ...
|