Sharingan 写轮眼:5 步跑通 Go 服务流量录制回放的完整指南
2026/8/24 1:57:42 网站建设 项目流程

Sharingan 写轮眼:5 步跑通 Go 服务流量录制回放的完整指南

【免费下载链接】sharinganSharingan(写轮眼)是一个基于golang的流量录制回放工具,适合项目重构、回归测试等。项目地址: https://gitcode.com/gh_mirrors/sha/sharingan

如果你维护着一个下游依赖繁杂的 Go 服务,重构前总为"测试数据从哪来"发愁——Sharingan(写轮眼)就是为此而生的流量录制回放工具:它能把线上真实请求连同全部下游调用原样复制下来,回放时用 Mock 数据替代真实下游,让测试不再依赖外部环境。本文带你从架构认知、5 步上手,到核心功能、原理拆解与避坑排查,一次讲清。

测试的两大痛点,它怎么解?

微服务时代,回归测试普遍卡在两个地方:

  • 造数据难:业务链路复杂,手工构造一条"全链路可用"的测试用例成本极高,单元测试只能覆盖局部逻辑;
  • 养环境贵:一次回归要拉起 N 个下游依赖,任何一边抖动,测试就红一片。

Sharingan 对应给出两种"瞳术"能力:

能力作用对应痛点
复制录制线上真实流量(含全部下游请求/响应)用真实流量代替手工造数
幻术回放时把下游调用重定向到 Mock Server,时间回拨到录制时刻回放零下游依赖、零时间误差

相比 tcpcopy、goreplay 这类只录入口流量的方案,它连Outbound 下游流量一起录下来,回放时下游环境完全不需要存在。此外还支持并发录制/回放、写流量回放(不污染数据)、噪音去除、协议解析(HTTP、MySQL、Redis、Thrift)等能力,且不绑定任何业务框架,对应用几乎无侵入。

4 个核心模块,各司其职

理解模块分工,后面所有配置都豁然开朗:

  • recorder:编进业务进程的录制 SDK,在语言标准库层面 Hook 网络调用,串联一个请求内的所有 goroutine 调用,把完整流量落盘或推给 agent(recorder/);
  • recorder-agent:独立进程,负责控制录制比例、筛选与存储线上流量(recorder-agent/);
  • replayer:编进业务进程的回放 SDK,核心是重定向连接、Mock 时间、打标流量(replayer/);
  • replayer-agent:独立进程,Web 控制台 + Mock Server 二合一,负责流量搜索、回放调度、diff 对比、批量回放、覆盖率报告(replayer-agent/)。

两个 agent 都以单进程独立部署:录制侧默认走 9003 端口,回放侧 Web 界面监听8998、Mock Server 监听3515,均可改配置。

上手:5 步完成第一次流量回放

项目自带一个 example 示例服务,并内置了 3 条提前录好的示例流量,非常适合零成本体验:

# 1. 获取源码 git clone https://gitcode.com/gh_mirrors/sha/sharingan cd sharingan # 2. 安装定制版 golang(支持 go1.10 ~ go1.15,mac/linux amd64) sudo sh install.sh go1.13 export GOROOT=/tmp/recorder-go1.13 export PATH=$GOROOT/bin:$PATH # 3. 编译并后台启动 replayer-agent(占用 3515、8998 端口) cd replayer-agent go build nohup ./replayer-agent >> run.log 2>&1 & # 4. 编译并启动示例服务(占用 9999 端口) cd ../example go build -tags="replayer" -gcflags="all=-N -l" nohup ./example >> run.log 2>&1 & # 5. 浏览器打开回放页面 # http://127.0.0.1:8998

几个关键点提前说明:

  • 必须用定制版 golang,它是录制/回放 Hook 能力的载体,官方 golang 编译出的程序不具备此能力;
  • SUT 编译必须带-tags="replayer"-gcflags="all=-N -l"(关闭内联是 gomonkey 打桩的前提);
  • 若服务启动阶段就建 TCP 连接(连接池初始化等),务必先起 Replayer-Agent、再起 SUT

打开页面后,在首页选中内置示例流量,点击"运行",就能在回放结果页看到 Inbound 响应对比与每个 Outbound 请求的匹配情况。

控制台五大核心功能

1. 流量搜索:支持关键词、通配符与 DSL 收藏

首页提供按接口请求/返回、下游请求/返回、SessionId 等多维度检索,还内置了几个实用技巧(详见 流量搜索指南):

  • 否定搜索:关键词前加!,排除含该词的流量;
  • 通配符?匹配单字符、*匹配任意串,建议放在中/后置以提升速度;
  • DSL 收藏:把常用查询条件存为 tag,下次输入 tag 即可一键填充搜索表单,适合沉淀回归用例集。

2. 单流量回放:diff 一目了然

回放结果页将 SUT 的实际响应与录制时的响应逐项对比,Outbound 请求还会展示"线上请求 vs 实测请求"的匹配 diff;下游协议繁杂时,可先按协议筛选再查看。

3. 批量并发回放:默认 10 路并发

筛选出流量后点"批量回放",默认并发度 10,可用启动参数-parallel=x调整。回放结果页给出整体成功/失败统计,左侧列出每条流量的明细,点击可直接转入单流量回放。还有个"彩蛋":当首页不输入任何筛选条件时,批量回放会遍历所有已上报 DSL对应的流量,适合做全量回归。

4. 覆盖率报告:回放顺手测覆盖率

以覆盖率模式启动 SUT(go test编译 +-coverpkg参数)后,每次回放都会累计代码覆盖数据,支持单流量/批量回放的累计统计,最终生成整体报告与逐函数覆盖详情,红色标记未覆盖代码。注意:点击"覆盖率报告"链接会重启 SUT 重新统计,两次点击之间先回放些流量。

5. 噪音上报:让下次回放更准

时间戳、traceID 这类"天然不同"的字段会造成假 diff。在结果页把这类字段上报为噪音后,再次回放时会自动忽略,匹配度与准确率显著提升(详见 噪音/DSL 上报指南)。

回放凭什么这么准?背后的原理

回放本质要解决两件事:如何拦截 SUT 的下游请求如何选对要 Mock 的响应

连接重定向:replayer/ 包基于 gomonkey 对标准库syscall.Connect打桩,把 SUT 建连的目标地址静默替换成 Mock Server(:3515),业务代码对此完全无感知。

Outbound 匹配:重构往往改变调用顺序,纯时序匹配太脆弱。Mock Server 采用类似全文检索的分词打分算法:请求按 16 字节 n-gram 切块,与录制的下游请求逐块比对加权(首个 chunk 加权,因为 HTTP 头里的 URL 最有区分度),阈值 0.85 优先向后找,找不到再回绕头部(阈值 0.1);对已匹配过的请求施加 90% 降权系数,避免相似请求互相"抢"到同一条线上响应。

并发回放:通过 sessionID 把 Web Server、SUT、Mock Server 三方串起来——Web Server 在 HTTP 请求里带上 sessionID,replayer 包 Mock 掉 TCP 连接的 Read/Write 方法,让 SUT 的每个 goroutine 都能把 sessionID 透传到 Mock Server;跨 goroutine 场景则借助定制版 golang 的 goroutineID 委托机制维持链路(并发回放原理)。

时间回拨:Web Server 把录制时的时间戳传给 SUT,replayer 包 Mocktime.Now,让时间敏感逻辑(缓存过期、对账日期等)按录制时刻执行。

进阶玩法:从单机到生产

  • 录制线上真实流量:业务代码import _ "github.com/didi/sharingan",用定制版 golang 加-tags="recorder"编译,设置RECORDER_ENABLED=trueRECORDER_TO_AGENT="http://127.0.0.1:9003"(流量推给 recorder-agent)或RECORDER_TO_FILE(本地落盘)。完整流程见 录制接入文档。线上录制的最佳实践是双 bin 部署:正常 bin + 录制 bin,只在一台机器开启录制,配合 pprof 监控逐步放量,出问题随时切回正常 bin;
  • 本地回放:Replayer-Agent 默认即本地回放模式——流量、噪音、DSL 全部读本地配置文件,无需 ES 等外部组件,把录制流量放进conf/traffic即可(本地回放接入);
  • 分开部署:Replayer-Agent 与 SUT 可分机部署,修改conf/moduleinfo.json中 SUT 地址,并在 SUT 侧设置环境变量REPLAYER_MOCK_IP指向 agent 机器;
  • 跨语言回放:replayer-agent v1.2.0 起支持用 Go 服务回放 PHP 录制的 fastcgi 流量,并自动补齐 MySQL 握手等非业务交互,专为"Go 重构 PHP 模块"的场景设计;
  • gRPC 服务:HTTP server 直接支持;gRPC server 需用项目内置的定制版 grpc-server/(v1.33.2,可用 go.mod replace 引入),录制 tag 为recorder_grpc

首次回放的避坑速查表

官方排查文档 总结了内部接入各模块时的高频问题,新手最常踩的有这几个:

现象原因解决
回放页整体飘红,提示connection refusedSUT 没起来先启动 SUT 再回放
SUT 启动时报 3515 端口连接拒绝Replayer-Agent 未启动先起 Replayer-Agent,再起 SUT
所有 Outbound 飘红、Testing Request提示 missingSUT 未引入 replayer 包,或未用定制版 golang 编译按 回放接入文档 检查 import 与编译 tag
部分 Outbound 有 diff流量太旧 / diff 是噪音 / 逻辑确实变了 / 录制机器上有调试操作重录最新流量、上报噪音、确认是否符合预期、换 session 重试
Outbound 匹配失败(missing / not matched)线上与线下配置不一致导致请求数量不同对齐两边配置
本地回放首页搜不到流量单条流量超过 100K调大配置项line_max_size

另外注意:目前不支持 HTTPS、HTTP/2(含 gRPC 入站)流量录制,支持 http1.1、thrift、mysql、redis、mongo 等常见协议。

写在最后

Sharingan 把"录制线上流量、Mock 下游回放、时间回拨、噪音过滤、覆盖率统计"做成了一体化工具链:改造面小(一行业务 import + 一个编译 tag)、上手成本低(自带示例与内置流量)、深度足够(标准库级 Hook、n-gram 匹配、goroutine 链路追踪)。对于Go 服务重构验证、版本回归测试、Go 重写其他语言模块这三类场景,它能显著压缩测试数据构造和环境维护的开销。按本文 5 步跑通 example 之后,把录制侧接入真实服务,就是完整的生产级工作流了。

【免费下载链接】sharinganSharingan(写轮眼)是一个基于golang的流量录制回放工具,适合项目重构、回归测试等。项目地址: https://gitcode.com/gh_mirrors/sha/sharingan

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询