HttpClient创建后设置代理失效问题排查
Reactor Netty HttpClient代理配置失效问题分析与解决
问题现象
链式调用.proxy()配置代理时,HttpClient可正常通过代理访问目标站点;但先创建HttpClient实例,再通过条件语句调用.proxy()配置代理时,代理完全失效,请求直接发起DNS解析导致超时错误。
问题根源
Reactor Netty的HttpClient是不可变对象,所有配置类方法(包括.proxy())执行后都会返回一个新的HttpClient实例,原实例的配置不会被修改。
在proxyFails方法中,调用httpClient.proxy(...)后没有将返回的新实例重新赋值给原变量,后续传入ReactorClientHttpConnector的还是最初创建的未配置代理的HttpClient实例,自然无法走代理。
修复代码
修改proxyFails方法,将.proxy()返回的新实例赋值给原变量即可:
@Test public void proxyFailsFixed() { HttpClient httpClient = HttpClient.create(); if(true) { // 将proxy()返回的新实例重新赋值给httpClient变量 httpClient = httpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP) .host("proxyServerURL") .port(3128) ); } WebClient client = WebClient.builder() .baseUrl("https://www.cisco.com") .clientConnector(new ReactorClientHttpConnector(httpClient)) .exchangeStrategies(ExchangeStrategies.builder().codecs(it-> it.defaultCodecs().maxInMemorySize(2000000)).build()) .build(); String response = client.get() .uri("/") .retrieve() .bodyToMono(String.class) .block(); assertNotNull(response); }
验证说明
修改后,条件语句中配置的代理会被应用到新的HttpClient实例上,后续WebClient使用的是配置好代理的实例,请求会正常通过代理转发,避免直接发起DNS解析导致的超时问题。
内容的提问来源于stack exchange,提问作者awhig
相关产品推荐
相关产品推荐

