Files
NixMsg/test/chaos/README.md

1.9 KiB
Raw Permalink Blame History

混沌 / 弱网测试辅助(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,或你启动时打印的地址)。

  1. 本机起好 NixMsg(或任意 TCP 服务),记下 HOST:PORT。
  2. 在 Windows 上,容器访问本机服务用 host.docker.internal:PORT。
  3. 用本包客户端或 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)。