使用toxiproxy模拟网络延迟需替换依赖地址为代理端口并显式添加latency toxic,启动服务后通过HTTP API控制,注意方向、单位及ARM架构适配,测试后须显式清理。

直接用 toxiproxy 模拟网络延迟,不是在 Go 代码里“写个 sleep”,而是让真实 TCP 流量经过它的代理层——这意味着你必须把被测服务的依赖地址(比如 Redis、MySQL、HTTP API)换成 toxiproxy 开的监听地址,再通过 HTTP API 控制它的行为。
启动 toxiproxy 并确认服务可达
不启动成功,后续所有操作都无效。常见错误是端口被占或没加 --listen 参数:
- Linux/macOS 下直接运行:
toxiproxy-server -port 8474(默认监听localhost:8474) - Windows 用户注意:二进制包默认不带 service 安装脚本,需手动后台运行或用
start /B toxiproxy-server.exe -port 8474 - 验证是否就绪:
curl -s http://localhost:8474/proxies | jq .应返回空数组或已有代理列表;返回Connection refused就说明服务没起来
用 toxiproxy-cli 创建代理并添加 latency toxic
代理本身不干扰流量,必须显式添加 toxic 才生效。最容易漏掉的是方向(upstream vs downstream)和单位(毫秒):
- 创建代理:
toxiproxy-cli create --listen localhost:6380 --upstream localhost:6379 redis-proxy(把原本连:6379的代码改成连:6380) - 添加下游延迟(即客户端收到响应变慢):
toxiproxy-cli toxic add -t latency -a latency=1200 -a jitter=200 redis-proxy - 注意:
latency=1200是 1200 毫秒,不是秒;jitter=200表示实际延迟在 1000–1400ms 之间波动 - 如果想模拟服务端处理慢(如数据库查询卡住),应加
upstream方向:-d upstream,否则只影响响应返回路径
Go 客户端代码只需改连接地址,不引入 toxiproxy 依赖
github.com/shopify/toxiproxy/v2/client 只用于自动化配置(比如测试 setup 阶段),业务代码完全不需要它。真正要改的只有连接字符串:
立即学习“go语言免费学习笔记(深入)”;
- Redis 示例:
redis.NewClient(&redis.Options{Addr: "localhost:6380"})(不是:6379) - HTTP 客户端:
http.DefaultClient.Transport = &http.Transport{Proxy: http.ProxyURL(&url.URL{Scheme: "http", Host: "localhost:8475"})}—— 注意:这是代理到 toxiproxy 的 HTTP 管理端口,仅用于控制;实际业务流量走的是你create时指定的--listen端口(如:6380) - 不要在业务逻辑里调用
proxy.AddToxic,这会导致测试与生产共用同一 toxiproxy 实例,不同测试用例互相干扰
清理 toxic 和 proxy 必须显式执行,否则残留影响后续测试
toxiproxy 不会自动清理,跑完测试后若不重置,下次测试可能还在延迟状态:
- 清空某个代理的所有 toxic:
toxiproxy-cli toxic remove -n latency_downstream redis-proxy - 彻底删除代理:
toxiproxy-cli delete redis-proxy - 推荐在 Go 测试的
TestMain或defer中调用curl -X DELETE http://localhost:8474/proxies/redis-proxy,避免手工遗漏 - ARM 架构(如 M1/M2 Mac)用户要注意:官方 release 的
toxiproxy二进制默认是amd64,需下载arm64版本,否则exec format error
真正难的不是加延迟,而是确保被测服务所有出站连接都经过 toxiproxy——DNS 解析、健康检查 endpoint、gRPC 的 resolver 地址,这些容易被忽略的路径一旦绕过代理,延迟就失效了。


















