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
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的核心流程拆成了三个阶段。你从左边开始,用录制命令抓流量,中间用文件存起来,右边再回放到目标环境。每个阶段都有对应的参数来控制细节。
好了,GoReplay的基础入门就聊到这儿。你跟着操作一遍,应该就能上手了。记住,工具是死的,场景是活的。多在实际项目中用用,你会发现它的妙处。
可可精品资料库