4、GoReplay基础入门:从安装到第一次回放

说实话,我第一次接触GoReplay的时候,心里还挺没底的。那时候团队要做一次大版本升级,线上流量怎么验证?总不能直接拿生产环境练手吧。后来老同事甩给我一句话:「去学学GoReplay,这东西能救命。」

嗯,今天我们就来聊聊这个「救命工具」的基础用法。你跟着我走一遍,保证半小时内就能跑通第一个录制-回放流程。

4.1 GoReplay是什么?为什么选它?

GoReplay,说白了就是一个网络流量复制工具。它不像传统的代理工具那样需要修改代码或配置,而是直接抓取网卡上的HTTP请求,然后原封不动地转发到另一个环境。

我个人习惯把它比作「流量复印机」——生产环境来一份请求,它就复印一份,丢到测试环境去。你想想看,这比手动构造测试数据靠谱多了吧?

核心能力:
  • 录制:抓取指定端口的HTTP流量
  • 回放:将录制的流量发送到目标地址
  • 输出/输入:支持文件保存和读取,方便离线分析

我在项目中遇到过最典型的场景:新版本上线前,用GoReplay把生产环境1小时的流量录下来,回放到预发布环境。跑完一看,好家伙,三个隐藏bug直接现形。要是没这工具,上线后估计得被用户骂死。

4.2 安装GoReplay:三分钟搞定

安装这事,其实没啥技术含量。但有几个坑,我帮你提前踩了。

4.2.1 Linux/Mac环境

GoReplay官方提供了预编译的二进制文件,下载解压就能用。我个人推荐直接去GitHub Releases页面下载最新版。

# 下载(以Linux amd64为例)
wget https://github.com/buger/goreplay/releases/download/v1.3.3/gor_1.3.3_linux_amd64.tar.gz

# 解压
tar -xzf gor_1.3.3_linux_amd64.tar.gz

# 移动到PATH目录
sudo mv gor /usr/local/bin/

# 验证安装
gor --version

嗯,这里要注意:如果你用的是Mac,记得去下载darwin版本。我曾经有个同事,在Mac上下了Linux版,折腾了半天才发现问题。

4.2.2 Windows环境

Windows用户也别慌。GoReplay同样支持Windows,下载exe文件就行。

# 下载Windows版
# 访问 https://github.com/buger/goreplay/releases
# 选择 gor_1.3.3_windows_amd64.zip

# 解压后,在命令行中运行
gor.exe --version
避坑指南:我曾经在Windows上遇到过权限问题。如果你运行gor.exe时提示「拒绝访问」,记得以管理员身份打开命令行。另外,Windows Defender可能会误报,添加排除目录就好。

4.3 HTTP流量录制:把生产流量「存」下来

安装好了,咱们来干正事。录制流量,其实就是告诉GoReplay:「嘿,帮我盯着这个端口,所有经过的HTTP请求都记下来。」

4.3.1 基础录制命令

假设你的应用跑在本地8080端口,想录制流量并保存到文件:

gor --input-raw :8080 --output-file requests.gor

这条命令干了三件事:

  • --input-raw :8080:监听本机8080端口的原始流量
  • --output-file requests.gor:把流量写入文件requests.gor
  • 默认持续运行,直到你按Ctrl+C停止

你想想看,就这么一行命令,生产环境的真实请求就被「冻结」到文件里了。是不是很神奇?

4.3.2 录制时的实用参数

光有基础命令还不够,实际项目中会遇到各种情况。我整理了几个常用参数:

参数 作用 示例
--input-raw-track-response 同时录制响应内容 gor --input-raw :8080 --input-raw-track-response --output-file full.gor
--output-file-append 追加到已有文件(不覆盖) gor --input-raw :8080 --output-file-append --output-file session.gor
--input-raw-buffer-size 设置缓冲区大小(高流量时用) gor --input-raw :8080 --input-raw-buffer-size 1048576 --output-file big.gor
我的经验:录制时建议加上--input-raw-track-response。为什么呢?因为回放时如果只发请求不看响应,你根本不知道服务端返回了什么。有一次我排查一个接口兼容性问题,就是靠对比录制和回放的响应体才找到差异的。

4.4 流量回放基础命令:让历史重演

录制完了,怎么用?回放呗。说白了就是把录好的请求,重新发到目标服务器上。

4.4.1 最简单的回放

gor --input-file requests.gor --output-http http://localhost:9090

这条命令的意思是:从requests.gor文件读取请求,然后发送到http://localhost:9090。就这么简单。

我记得第一次跑回放的时候,盯着终端看请求一条条飞过,心里那个激动啊——就像在看一部「流量纪录片」。

4.4.2 控制回放速度

默认情况下,GoReplay会以录制时的原始速度回放。但有时候我们需要调整速度:

# 以2倍速回放
gor --input-file requests.gor --output-http http://localhost:9090 --input-file-loop --output-http-workers 10

# 限制回放速率(每秒最多100个请求)
gor --input-file requests.gor --output-http http://localhost:9090 --output-http-rate-limit 100

为什么会需要调整速度?我遇到过一种情况:测试环境扛不住生产级别的流量,一跑就崩。这时候把速率降下来,既能验证功能,又不至于把测试环境搞挂。

4.5 文件输出与输入:离线分析的基石

文件操作是GoReplay的核心能力之一。你录制的流量文件,可以反复使用、分享给同事、甚至作为测试用例的素材库。

4.5.1 文件格式说明

.gor文件其实是个文本文件,每行记录一个请求或响应。你可以用cat或文本编辑器打开看看:

1 1234567890 100
GET /api/users HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.68.0

1 1234567891 200
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42

{"users":[{"id":1,"name":"Alice"}]}

格式很简单:第一行是元数据(请求ID、时间戳、长度),后面跟着请求头和请求体。响应也是同样的结构。

小技巧:你可以用grep或awk直接处理.gor文件。比如想提取所有POST请求:
grep "^POST" requests.gor

4.5.2 文件分割与合并

实际项目中,一次录制可能产生几个GB的文件。我习惯按时间或大小分割:

# 录制时按大小分割(每100MB一个文件)
gor --input-raw :8080 --output-file requests_%Y%m%d_%H%M%S.gor --output-file-size-limit 100m

# 合并多个文件
cat requests_*.gor > all_requests.gor

嗯,这里要注意:合并文件时,顺序很重要。如果文件是按时间生成的,合并后回放才能保持原始顺序。

4.5.3 文件输入的高级用法

除了直接回放,文件输入还有一些实用场景:

  • 循环回放:用--input-file-loop参数,让GoReplay反复读取同一个文件,适合压力测试
  • 百分比回放:用--input-file-sample 50,只回放50%的请求,适合抽样验证
  • 过滤回放:结合--http-allow-url参数,只回放匹配特定URL的请求
# 循环回放,只处理/api开头的请求
gor --input-file requests.gor --input-file-loop --http-allow-url /api --output-http http://localhost:9090
避坑指南:我曾经犯过一个错误——用--input-file-loop做压力测试,结果忘了加速率限制,直接把测试环境的数据库打满了。所以,循环回放时一定要配合--output-http-rate-limit使用。

4.6 本章知识体系总览

说了这么多,咱们用一张图来梳理一下GoReplay的核心流程:

GoReplay 核心工作流程 录制阶段 文件存储 回放阶段 --input-raw :8080 --input-raw-track-response --input-raw-buffer-size --output-file requests.gor --output-file-append --output-file-size-limit --output-http :9090 --input-file-loop --output-http-rate-limit 录制 → 存储 → 回放,三步搞定流量复制

这张图把GoReplay的核心流程拆成了三个阶段。你从左边开始,用录制命令抓流量,中间用文件存起来,右边再回放到目标环境。每个阶段都有对应的参数来控制细节。

我的建议:刚开始学的时候,别急着上复杂参数。先跑通「录制→文件→回放」这个最小闭环。等流程走通了,再慢慢加过滤、限速、循环这些高级功能。我当年就是这么过来的,稳扎稳打比什么都强。

好了,GoReplay的基础入门就聊到这儿。你跟着操作一遍,应该就能上手了。记住,工具是死的,场景是活的。多在实际项目中用用,你会发现它的妙处。

可可精品资料库