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
相关产品推荐
相关产品推荐

