You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot测试中Toxiproxy注入延迟无效问题求助

问题描述

正在进行POC验证,尝试在Spring Boot测试中用Toxiproxy注入延迟,但设置的latency toxic完全没效果。测试逻辑是ping www.google.com,期望延迟后输出可达状态,结果却立即打印了。附上测试代码,求排查思路。

@Testcontainers
public class ToxiproxyTest {

  @LocalServerPort
  private int port;

  // Toxiproxy container, which will be used as a TCP proxy
  @Container
  public static ToxiproxyContainer toxiproxy = new ToxiproxyContainer("ghcr.io/shopify/toxiproxy:2.5.0")
      .withNetwork(Network.newNetwork());

  private Proxy proxy;


  @SneakyThrows
  @BeforeEach
  public void setUp() {
    ToxiproxyClient toxiproxyClient = new ToxiproxyClient(toxiproxy.getHost(), toxiproxy.getControlPort());
    proxy = toxiproxyClient.createProxy("proxy", toxiproxy.getHost() + ":" + port, "www.google.com:80");
  }

  @SneakyThrows
  @Test
  public void testLatency() {
    proxy.toxics().latency("latency", ToxicDirection.DOWNSTREAM, 200000L);

    Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
    int returnVal = p1.waitFor();
    boolean reachable = (returnVal==0);
    System.out.println(reachable);
  }
}
排查思路及解决方案
  • 核心问题:流量未经过Toxiproxy代理
    你的测试直接调用ping www.google.com,完全没走Toxiproxy创建的代理端口。Toxiproxy仅会拦截经过自身的流量,必须让请求先打到Toxiproxy的代理端口,再由它转发到目标地址,toxic规则才会生效。

  • 代理配置错误
    创建Proxy时用了@LocalServerPort获取的端口,这个注解是用来获取当前Spring Boot应用的端口,和Toxiproxy的代理监听端口无关。应该让Toxiproxy自动分配或指定可用端口,测试时请求这个代理端口。

  • 协议不兼容
    Toxiproxy仅支持TCP/UDP协议,而ping基于ICMP协议,代理根本无法拦截这类流量,必须改用TCP协议的请求(比如HTTP)来测试延迟效果。

  • 修正后的代码示例

@Testcontainers
public class ToxiproxyTest {

    @Container
    public static ToxiproxyContainer toxiproxy = new ToxiproxyContainer("ghcr.io/shopify/toxiproxy:2.5.0");

    private Proxy proxy;

    @SneakyThrows
    @BeforeEach
    public void setUp() {
        ToxiproxyClient toxiproxyClient = new ToxiproxyClient(toxiproxy.getHost(), toxiproxy.getControlPort());
        // 让Toxiproxy自动分配监听端口,转发到www.google.com:80
        proxy = toxiproxyClient.createProxy("google-proxy", "0.0.0.0:0", "www.google.com:80");
    }

    @SneakyThrows
    @Test
    public void testLatency() {
        // 设置200ms下游延迟(原代码200000L是200秒,数值过大易超时)
        proxy.toxics().latency("latency", ToxicDirection.DOWNSTREAM, 200L);

        // 获取代理实际监听端口
        int proxyPort = proxy.getProxyPort();
        // 发送HTTP请求到Toxiproxy代理端口
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("http://" + toxiproxy.getHost() + ":" + proxyPort))
                .build();

        long start = System.currentTimeMillis();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        long end = System.currentTimeMillis();

        boolean reachable = response.statusCode() >= 200 && response.statusCode() < 300;
        System.out.println("可达状态:" + reachable);
        System.out.println("请求耗时:" + (end - start) + "ms");
    }
}
  • 额外注意事项
    • 测试延迟时建议先设置较小值(如200ms),避免因超时长导致测试失败。
    • 创建代理时用0.0.0.0:0可自动分配端口,避免端口冲突,后续通过proxy.getProxyPort()获取实际端口。

内容的提问来源于stack exchange,提问作者ham_ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:14:55