GoReplay入门

随着应用功能的不断增加,测试它所需的工作量也会成倍增加。GoReplay则为我们提供了一个简单而快速的测试方法,即重用现有流量进行测试。它能够记录和分析应用程序的流量,且不会对应用程序造成影响。

一、简介

GoReplay,又称Gor,是一个采用Golang编写的、开源的HTTP实时流量捕获和重放工具。通过它可以完成流量复制、负载测试、流量监控和流量分析等工作。它以守护进程(而不是Proxy)的形式运行在集群的入口服务器上(比如,nginx),同时不会入侵现有的集群架构。Gor的工作原理如下:

image-20201010161023899

二、安装

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" "-"
...

GoReplay入门
https://kuberxy.github.io/2020/10/10/GoReplay入门/
作者
Mr.x
发布于
2020年10月10日
许可协议