如何关闭Spring WebClient所用Netty HttpClient的DNS连接重试机制?
解决方案
高版本Reactor Netty(适配Spring Boot 2.7.10+ / 3.0+)
直接通过内置配置参数关闭多IP重试逻辑,仅需在构造HttpClient时设置maxAddressesPerHost为1即可:
import reactor.netty.http.client.HttpClient; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.client.WebClient; // 构造自定义HttpClient HttpClient httpClient = HttpClient.create() // 限制每个域名仅保留1个解析到的IP,无多余IP可供重试 .resolver(nameResolverSpec -> nameResolverSpec.maxAddressesPerHost(1)); // 注入到WebClient中使用 WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .build();
该配置是你提到的reactor-netty issue #1822落地的官方特性,配置后域名解析仅返回第一条记录,首次连接失败直接抛出错误,不会触发后续IP的连接尝试。
低版本Reactor Netty兼容方案
如果使用的版本未提供上述配置项,可自定义地址解析器仅返回首个解析IP:
import io.netty.resolver.AddressResolver; import io.netty.resolver.DefaultAddressResolverGroup; import io.netty.resolver.InetNameResolver; import io.netty.util.concurrent.EventExecutor; import reactor.netty.http.client.HttpClient; import java.net.InetSocketAddress; import java.util.List; public class SingleIpResolverGroup extends DefaultAddressResolverGroup { public static final SingleIpResolverGroup INSTANCE = new SingleIpResolverGroup(); @Override protected AddressResolver<InetSocketAddress> newResolver(EventExecutor executor) { InetNameResolver baseResolver = (InetNameResolver) super.newResolver(executor); return baseResolver.asAddressResolver(addr -> { List<InetSocketAddress> allResolved = baseResolver.resolveAll(addr).getNow(null); return allResolved == null || allResolved.isEmpty() ? List.of() : List.of(allResolved.get(0)); }); } } // 配置到HttpClient HttpClient httpClient = HttpClient.create() .resolver(SingleIpResolverGroup.INSTANCE);
内容的提问来源于stack exchange,提问作者reperion
相关产品推荐
相关产品推荐

