拓冰建站拓冰建站
首页 / 资讯中心 / 正文

GoReplay HTTP 流量回放指南:使用 --output-http 将真实流量重放至测试环境

性能测试可观测性网络【免费下载链接】goreplayGoReplay is an open-source tool for capturing and replaying live HTTP traffic into a test environment in order to continuously test your system with real data. It can be used to increase confidence in code deployments, configuration changes and infrastructure changes.项目地址https://gitcode.com/gh_mirrors/go/goreplay点击查看免费下载GoReplay 是一个开源工具用于捕获线上实时 HTTP 流量并将其重放到测试环境中从而用真实数据持续检验系统。本文以官方文档 docs/Replaying-HTTP-traffic.md 为核心系统讲解 HTTP 回放HTTP output的全部配置动态 Worker 池、重定向跟随、超时、响应缓冲、Basic Auth 注入与多域名 Host 保持。读完本文你将掌握如何用一行命令把线上流量安全地灌入 staging 环境并能根据业务场景精准调优回放行为。一、HTTP 回放基本用法GoReplay 使用--output-http选项将 HTTP 流量回放到指定地址sudo ./gor --input-raw :8000 --output-httphttp://staging.env该命令的含义是--input-raw :8000捕获本机 8000 端口上的全部 HTTP 请求--output-httphttp://staging.env将捕获到的请求原样转发到staging.env这台测试服务器。从源码看--output-http是一个可重复出现的 MultiOption 参数见 settings.go因此你可以在一条命令中同时指定多个回放目标例如同时回放到 dev 与 staging 两套环境参考 docs/Capturing-and-replaying-traffic.mdgor --input-tcp :28020 --output-http http://staging.com --output-http http://dev.com--output-http的地址可以省略 scheme省略时默认按http://处理这一逻辑体现在 output_http.go 的NewHTTPOutput构造函数中。在回放的同时你还可以对流量做实时过滤filtering、限速rate limiting和重写rewriting三者可以在回放链路上叠加使用。GoReplay 的插件化架构见 plugins.go保证输入input、修改middleware/modifier与输出output各环节解耦--output-http只是最终输出环节的一个插件。二、HTTP 输出 Worker 池动态伸缩与固定数量动态 Worker 池机制默认情况下GoReplay 的 HTTP 输出使用动态 Worker 池其行为要点如下原文要点完整保留初始创建 10 个 HTTP 输出 Worker对应 output_http.go 中的常量initialDynamicWorkers 10当 HTTP 输出队列长度超过 10 时动态创建更多 Worker新建 Worker 数量 N 等于触发检查时队列的长度队列长度在每次向 HTTP 输出队列写入消息时都会被检查见 output_http.go 的PluginWrite逻辑在创建 N 个新 Worker 的请求被满足之前不会继续创建更多 Worker动态 Worker 如果暂时无法处理消息会休眠 100 毫秒动态 Worker 如果连续 2 秒无法处理消息就会退出消亡。从源码可以更精确地还原这套机制NewHTTPOutput根据WorkersMin启动初始 Worker默认为 1并启动workerMaster协程output_http.go负责回滚回收空闲 Worker当活跃 Worker 数大于最小值且队列为空时会逐个关闭 Worker 直至回到最小值。而PluginWriteoutput_http.go在每次写入时检查队列长度与活跃 Worker 数的差值按需补充新 Worker补充数量受WorkersMax最大 Worker 数约束。指定固定 Worker 数量如果你希望回放行为更可预测可以固定 Worker 数量gor --input-raw :80 --output-http http://staging.com --output-http-workers20参数说明对应 settings.go 的 flag 定义参数默认值说明--output-http-workers0不限制即math.MaxInt32动态伸缩时的最大 Worker 数--output-http-workers-min0实际取 1动态伸缩时的最小 Worker 数--output-http-queue-len1000输出队列可容纳的请求数队列满时所有 Worker 均繁忙--output-http-worker-timeout2s空闲 Worker 回滚等待时长需要注意的是--output-http-workers与--output-http-workers-min共同控制 Worker 池的上下界当最大值与最小值相等时Worker 数量保持固定不再动态伸缩见 output_http.go 的条件判断。三、跟随重定向默认情况下GoReplay忽略所有重定向——因为重定向通常由调用方应用的客户端处理。但在回放环境自身会引入新重定向的场景下你可以启用重定向跟随gor --input-tcp replay.local:28020 --output-http http://staging.com --output-http-redirects 2上面的例子表示每个请求最多跟随 2 次重定向。底层实现位于 output_http.go 的NewHTTPClientGo 标准库http.Client的CheckRedirect回调中当已跳转次数len(via)达到RedirectLimit时返回http.ErrUseLastResponse停止跟随并输出调试日志maximum output-http-redirects[N] reached!。默认值 0 表示不跟随settings.go参数值被限制为非负数output_http.go。四、HTTP 超时配置默认情况下HTTP 请求与响应的超时时间均为5 秒。可通过--output-http-timeout覆盖gor --input-tcp replay.local:28020 --output-http http://staging.com --output-http-timeout 30s参数类型为 Go 的time.Duration因此支持30s、1m、500ms等写法settings.go默认值 5 秒定义在 settings.go从源码看若配置的 Timeout 小于 100 毫秒会被强制重置为 1 秒output_http.go以避免非法值导致的异常行为。该超时直接作用于底层http.Client.Timeoutoutput_http.go同时覆盖连接建立、请求发送与响应读取全过程。五、响应缓冲控制内存占用与 Middleware 可用数据量默认情况下为了降低内存消耗GoReplay 内部 HTTP 客户端最多读取200KB响应体该数据在启用 Middleware 时才会被使用。你可以通过--output-http-response-buffer调高上限该参数接受字节数gor --input-raw :80 --output-http http://staging.com --output-http-response-buffer 1048576更精确的源码事实如下flag 默认值为 0但NewHTTPOutput中会将小于等于 0 的值重置为100 * 1024100KB见 output_http.go参数类型为size.Size见 internal/size/size.go该自定义类型支持带单位写法如1mb、512kb甚至0x十六进制例如--output-http-response-buffer 2mb响应读取的实际缓冲逻辑在HTTPClient.Sendoutput_http.go与 tcp_client.go 中默认ResponseBufferSize为 100KB超出部分会进入 chunk 读取逻辑但整体受maxResponseSize 1GBoutput_http.go的硬上限约束。适用场景提醒该缓冲仅在你使用 Middleware 处理响应数据时有意义如果只是纯回放请求响应体会被直接关闭resp.Body.Close()不会造成额外内存开销。六、Basic Auth 凭据注入如果开发或 staging 环境受 Basic Authentication 保护可以在回放时直接注入凭据gor --input-raw :80 --output-http http://user:passstaging.com注意这将会覆盖原请求中的任何 Authorization 头。实现细节Go 标准库在解析带user:pass形式的 URL 时会把凭据放入url.Userinfo。GoReplay 对--output-http地址执行url.Parse后将 URL 主机替换为回放目标同时原请求的 Host 被替换为配置中的目标主机见 output_http.go。Basic Auth 注入同样是标准 HTTP 行为凭据会以Authorization: Basic base64(user:pass)的形式发送覆盖原始请求头。该行为与 WebSocket 输出插件的处理方式一致见 output_ws.go 中u.User的解析与清空逻辑。如果希望在过滤层针对 Basic Auth 做更细粒度的控制还可以参考--http-basic-auth-filter见 settings.go 与 http_modifier.go它按解码后的 Basic Auth 字符串做正则匹配不匹配的请求会被丢弃。七、多域名支持保留原始 Host 头如果你的应用同时接受来自多个域名的流量并希望保留原始 Host 头可以使用--http-original-host选项它告诉 GoReplay 不要改动 Host 头gor --input-raw :80 --output-http http://staging.com --http-original-host默认行为与源码依据默认情况下--http-original-host未开启GoReplay 会用--output-http指定的主机替换原请求的 Host 头req.Host c.config.url.Host见 output_http.go开启该选项后req.Host保持原始值不变settings.go 中的 flag 说明也明确指出该选项会保留原始 Host 头对应测试用例TestHTTPOutputKeepOriginalHost见 output_http_test.go测试服务器通过 TLS 接收请求并断言req.Host custom-host.com验证了开启OriginalHost: true后 Host 头不被改写。使用建议多域名场景下如多个 CNAME 指向同一服务务必开启此选项否则回放请求的 Host 头被统一改写为目标环境域名可能导致虚拟主机路由错乱。八、回放参数速查表综合本文与 settings.go将 HTTP 回放相关参数汇总如下参数默认值作用--output-http url无回放目标地址可重复指定多个--output-http-workers0不限动态 Worker 池最大 Worker 数--output-http-workers-min1动态 Worker 池最小 Worker 数--output-http-queue-len1000输出队列长度上限--output-http-worker-timeout2s空闲 Worker 回收超时--output-http-redirects0不跟随每个请求最多跟随的重定向次数--output-http-timeout5sHTTP 请求/响应超时--output-http-response-buffer0实际 100KB响应缓冲大小支持 kb/mb 单位--http-original-hostfalse保留原始 Host 头不替换为目标主机--output-http-track-responsefalse开启后回放响应可被其他输出stdout、file 等消费--output-http-skip-verifyfalse跳过 TLS 证书主机名校验自签名证书场景--output-http-stats/--output-http-stats-msfalse / 5000周期性输出队列统计--output-http-elasticsearch空将请求/响应统计发送到 ElasticSearch九、验证回放是否生效你可以在本地启动一个测试服务器来验证回放链路。仓库自带完整的集成测试可直接参考运行go test -run TestHTTPOutputTestHTTPOutputoutput_http_test.go验证了请求头改写User-Agent: Gor、POST body 完整性、以及 OPTIONS 请求被忽略的行为TestHTTPOutputSSLoutput_http_test.go验证 HTTPS 回放需要SkipVerify: true的场景TestHTTPOutputSessionsoutput_http_test.go验证了 TCP 会话识别模式下同一会话内的请求被路由到同一 Worker--recognize-tcp-sessions配合使用时GoReplay 会为每个会话维护独立 Worker见 output_http.go。十、相关文档延伸请求过滤回放前按 URL、Header 等规则过滤请求限速限制回放速率避免压垮测试环境请求重写修改 URL、Header、Body 后再回放从文件保存与回放离线录制后离线回放流量捕获与回放入门--input-raw的完整捕获选项Middleware自定义中间件处理请求与响应故障排查回放异常时的定位思路。赞分享性能测试可观测性网络【免费下载链接】goreplayGoReplay is an open-source tool for capturing and replaying live HTTP traffic into a test environment in order to continuously test your system with real data. It can be used to increase confidence in code deployments, configuration changes and infrastructure changes.项目地址https://gitcode.com/gh_mirrors/go/goreplay点击查看免费下载相关推荐GoReplay 入门与实践捕获线上 HTTP 流量并安全回放至测试环境GoReplay 入门与实践捕获线上 HTTP 流量并安全回放至测试环境 GoReplay 是一款开源的网络流量捕获与回放工具它像 tcpdump 一样在后性能测试可观测性网络GoReplay 入门实战从端口捕获真实 HTTP 流量并复现到测试环境GoReplay 入门实战从端口捕获真实 HTTP 流量并复现到测试环境 本篇基于 GoReplay 官方入门教程 docs/getting started/性能测试可观测性网络HouseMD部署指南3步完成生产环境配置安全高效监控线上应用HouseMD部署指南3步完成生产环境配置安全高效监控线上应用 HouseMD是一款比BTrace更出色的诊断工具能够帮助开发者安全高效地监控线上应用。本性能测试可观测性网络上一篇LMFlow 2025终极路线图7个即将发布的AI大模型优化特性下一篇LMFlow分布式推理终极指南多节点部署与负载均衡实战策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门