62 lines
1.9 KiB
Markdown
62 lines
1.9 KiB
Markdown
# 混沌 / 弱网测试辅助(Q 线)
|
||
|
||
用 toxiproxy 官方镜像做延迟和断开;Linux 丢包用容器内 netem。所有 Docker 资源名带 `q` 前缀,用完删除。
|
||
|
||
## 启动 toxiproxy
|
||
|
||
在仓库根目录(或本目录)执行:
|
||
|
||
```powershell
|
||
docker compose -p q-chaos -f test/chaos/compose.yml up -d
|
||
```
|
||
|
||
API 默认映射到本机随机/固定端口见 compose 注释。查看实际端口:
|
||
|
||
```powershell
|
||
docker compose -p q-chaos -f test/chaos/compose.yml port toxiproxy 8474
|
||
```
|
||
|
||
清理:
|
||
|
||
```powershell
|
||
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 分配端口):
|
||
|
||
```go
|
||
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:
|
||
|
||
```bash
|
||
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)。
|
||
|
||
## 单元测试
|
||
|
||
```powershell
|
||
go test ./test/chaos/ -count=1
|
||
```
|
||
|
||
## netem 丢包
|
||
|
||
见 [netem/README.md](./netem/README.md)。脚本必须在 Linux 容器内执行(本机是 Windows)。
|