尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

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

Sharingan 写轮眼:5 步跑通 Go 服务流量录制回放的完整指南 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 调用把完整流量落盘或推给 agentrecorder/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.15mac/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 21 # 4. 编译并启动示例服务占用 9999 端口 cd ../example go build -tagsreplayer -gcflagsall-N -l nohup ./example run.log 21 # 5. 浏览器打开回放页面 # http://127.0.0.1:8998几个关键点提前说明必须用定制版 golang它是录制/回放 Hook 能力的载体官方 golang 编译出的程序不具备此能力SUT 编译必须带-tagsreplayer和-gcflagsall-N -l关闭内联是 gomonkey 打桩的前提若服务启动阶段就建 TCP 连接连接池初始化等务必先起 Replayer-Agent、再起 SUT。打开页面后在首页选中内置示例流量点击运行就能在回放结果页看到 Inbound 响应对比与每个 Outbound 请求的匹配情况。控制台五大核心功能1. 流量搜索支持关键词、通配符与 DSL 收藏首页提供按接口请求/返回、下游请求/返回、SessionId 等多维度检索还内置了几个实用技巧详见 流量搜索指南否定搜索关键词前加!排除含该词的流量通配符?匹配单字符、*匹配任意串建议放在中/后置以提升速度DSL 收藏把常用查询条件存为 tag下次输入 tag 即可一键填充搜索表单适合沉淀回归用例集。2. 单流量回放diff 一目了然回放结果页将 SUT 的实际响应与录制时的响应逐项对比Outbound 请求还会展示线上请求 vs 实测请求的匹配 diff下游协议繁杂时可先按协议筛选再查看。3. 批量并发回放默认 10 路并发筛选出流量后点批量回放默认并发度 10可用启动参数-parallelx调整。回放结果页给出整体成功/失败统计左侧列出每条流量的明细点击可直接转入单流量回放。还有个彩蛋当首页不输入任何筛选条件时批量回放会遍历所有已上报 DSL对应的流量适合做全量回归。4. 覆盖率报告回放顺手测覆盖率以覆盖率模式启动 SUTgo 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 请求里带上 sessionIDreplayer 包 Mock 掉 TCP 连接的 Read/Write 方法让 SUT 的每个 goroutine 都能把 sessionID 透传到 Mock Server跨 goroutine 场景则借助定制版 golang 的 goroutineID 委托机制维持链路并发回放原理。时间回拨Web Server 把录制时的时间戳传给 SUTreplayer 包 Mocktime.Now让时间敏感逻辑缓存过期、对账日期等按录制时刻执行。进阶玩法从单机到生产录制线上真实流量业务代码import _ github.com/didi/sharingan用定制版 golang 加-tagsrecorder编译设置RECORDER_ENABLEDtrue与RECORDER_TO_AGENThttp://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),仅供参考
返回列表