混沌 / 弱网测试辅助(Q 线)
用 toxiproxy 官方镜像做延迟和断开;Linux 丢包用容器内 netem。所有 Docker 资源名带 q 前缀,用完删除。
启动 toxiproxy
在仓库根目录(或本目录)执行:
docker compose -p q-chaos -f test/chaos/compose.yml up -d
API 默认映射到本机随机/固定端口见 compose 注释。查看实际端口:
docker compose -p q-chaos -f test/chaos/compose.yml port toxiproxy 8474
清理:
docker compose -p q-chaos -f test/chaos/compose.yml down -v
对运行中的服务注入故障
不要写死 7443。上游地址取自当前实例的实际监听端口(例如测试 harness 写入的 listen.addr,或你启动时打印的地址)。
- 本机起好 NixMsg(或任意 TCP 服务),记下
HOST:PORT。 - 在 Windows 上,容器访问本机服务用
host.docker.internal:PORT。 - 用本包客户端或 curl 建代理(listen 用
0.0.0.0:0让 toxiproxy 分配端口):
c := chaos.NewClient("http://127.0.0.1:<api端口>")
p, err := c.CreateProxy("q-nixmsg", "0.0.0.0:0", "host.docker.internal:"+strconv.Itoa(port))
// 客户端改连 p.Listen(把 0.0.0.0 换成 127.0.0.1)
_, _ = c.AddLatency("q-nixmsg", "lag", 200, 50, "")
_, _ = c.AddResetPeer("q-nixmsg", "rst", 0, "")
等价 curl:
curl -s -X POST http://127.0.0.1:<api>/proxies \
-H 'Content-Type: application/json' \
-d '{"name":"q-nixmsg","listen":"0.0.0.0:0","upstream":"host.docker.internal:<PORT>","enabled":true}'
延迟:POST .../proxies/q-nixmsg/toxics,type=latency,attributes.latency / jitter(毫秒)。
断开:type=reset_peer,attributes.timeout(毫秒,0 表示尽快 RST)。
单元测试
go test ./test/chaos/ -count=1
netem 丢包
见 netem/README.md。脚本必须在 Linux 容器内执行(本机是 Windows)。