跳到正文
发现
Toxiproxy:网络故障模拟 TCP 代理
命令行工具开发者工具

Toxiproxy:网络故障模拟 TCP 代理

Shopify 开源的 TCP 代理框架,通过 HTTP API 动态注入延迟、断连等网络故障,用于混沌与容错测试。

admin
发布于 2026-10-28
浏览
4
访问
0
下载
0
版本
v2.13.0
平台
Windows、macOS、Linux
该作品还没有经过官方审核。访问演示、下载或复制命令前,请自行确认来源可信。

详细介绍

项目简介

Toxiproxy 是一个用于模拟网络条件的框架,专门为测试、CI 和开发环境设计。它支持对连接进行确定性的篡改,也支持随机化的混沌测试与自定义配置。项目的目标是帮助开发者用测试证明:自己的应用不存在单点故障。Toxiproxy 由两部分组成:用 Go 编写的 TCP 代理(即本仓库),以及通过 HTTP 与代理通信的客户端。你只需让应用的所有测试连接都经过 Toxiproxy,之后就可以通过 HTTP 操控这些连接的健康状态。自 2014 年 10 月起,Shopify 一直在其所有开发和测试环境中使用它。

主要功能

  • TCP 代理 + HTTP API:可在测试运行时动态创建、启用、禁用代理,并注入故障。
  • 多种 toxic(故障注入项):latency、down、bandwidth、slow_close、timeout、reset_peer、slicer、limit_data、packet_loss。
  • 多语言客户端:提供 Ruby、Go、Python、.NET、PHP、Node、Java、Haskell、Rust、Elixir 等客户端库。
  • 命令行工具 toxiproxy-cli:无需写代码即可创建代理、添加 toxic、查看列表。
  • 配置文件:可通过 -config 选项把 JSON 配置文件传给服务端。
  • 日志级别可调:支持 panic、fatal、error、warn/warning、info、debug、trace,通过环境变量 LOG_LEVEL 设置。

安装与使用

Ubuntu

$ wget -O toxiproxy-2.13.0.deb https://github.com/Shopify/toxiproxy/releases/download/v2.13.0/toxiproxy_2.13.0_linux_amd64.deb
$ sudo dpkg -i toxiproxy-2.13.0.deb
$ sudo service toxiproxy start

macOS(Homebrew / MacPorts)

$ brew tap shopify/shopify
$ brew install toxiproxy
$ port install toxiproxy

Docker

$ docker pull ghcr.io/shopify/toxiproxy
$ docker run --rm -it ghcr.io/shopify/toxiproxy

源码编译

$ make build
$ ./dist/toxiproxy-server

填充代理:应用启动时(早于任何连接建立)需要告知 Toxiproxy 把哪些监听地址代理到哪里。可用客户端库的 populate 辅助方法:

Toxiproxy.populate([
  {
    name: "shopify_test_redis_master",
    listen: "127.0.0.1:22220",
    upstream: "127.0.0.1:6379"
  },
  {
    name: "shopify_test_mysql_master",
    listen: "127.0.0.1:24220",
    upstream: "127.0.0.1:3306"
  }
])

也可以用 CLI 创建代理:

toxiproxy-cli create -l localhost:26379 -u localhost:6379 shopify_test_redis_master

注入故障:把应用的连接地址改为 Toxiproxy 的监听端口后,即可在测试中操控:

redis = Redis.new(port: 22220)

Toxiproxy[:shopify_test_redis_master].downstream(:latency, latency: 1000).apply do
  redis.get("test") # will take 1s
end

或通过 CLI:

toxiproxy-cli toxic add -t latency -a latency=1000 shopify_test_redis_master

大型应用建议把配置写在单独的 config/toxiproxy.json,通过 -config 传给服务端,或用 populate 加载:

[
  {
    "name": "web_dev_frontend_1",
    "listen": "[::]:18080",
    "upstream": "webapp.domain:8080",
    "enabled": true
  },
  {
    "name": "web_dev_mysql_1",
    "listen": "[::]:13306",
    "upstream": "database.domain:3306",
    "enabled": true
  }
]

注意事项

  • Toxiproxy 2.0 对 API 做了不兼容 1.x 的改动,使用 2.x 服务端时需确保客户端库版本匹配,可通过 /version 端点查看服务端版本。
  • 监听端口建议避开临时端口范围,避免随机端口冲突;Linux 默认范围是 32768 到 61000,见 /proc/sys/net/ipv4/ip_local_port_range。
  • 代理命名建议采用 <app>_<env>_<data store>_<shard>,避免多个应用共用同一个 Toxiproxy 时发生冲突。
  • 以宿主机方式(--net=host)使用 Docker 镜像时,API 绑定在 0.0.0.0,可从各主机接口访问;若其他机器能访问该主机,请通过 -e TOXIPROXY_AUTH_TOKEN=<token> 设置认证令牌。

本作品整理自 GitHub 开源项目 Shopify/toxiproxy,原作者 @Shopify,许可证 MIT。中文介绍由 AI 根据项目 README 整理,以原仓库为准。

更新记录

  1. v2.13.0当前版本

    拒绝 average_size 小于等于 0 或 size_variation 越界的 slicer toxic 并避免无限递归;新增 HTTP API bearer token 认证(TOXIPROXY_AUTH_TOKEN);修复移除 toxic 卡死、bandwidth toxic 在 rate 小于等于 0 时挂起的问题;升级 Go 版本与依赖。

评论