如何在Spring Boot中配置Reactive Feign底层的Netty HttpClient?
解决Playtika Reactive Feign自定义Netty HttpClient DNS TCP重试问题
要实现UDP DNS解析失败时重试TCP的需求,可以通过以下几种方式自定义Netty HttpClient并集成到Playtika的Reactive Feign中:
方式一:通过ReactorNettyHttpClientMapper全局配置(推荐)
Spring Boot 3.x提供了ReactorNettyHttpClientMapper接口,可以全局修改所有WebClient使用的Netty HttpClient配置,Playtika的Reactive Feign会自动复用这个配置:
import org.springframework.boot.web.reactive.function.client.ReactorNettyHttpClientMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import reactor.netty.http.client.HttpClient; @Configuration public class DnsTcpRetryConfig { @Bean public ReactorNettyHttpClientMapper reactorNettyHttpClientMapper() { return httpClient -> httpClient .resolver(spec -> spec.retryTcpOnTimeout(true)); } }
这种方式无需修改Feign客户端的构建逻辑,所有基于WebClient的HTTP客户端都会自动生效,适合全局统一配置场景。
方式二:自定义WebClient并手动传入Feign Builder
如果需要针对单个Feign客户端单独配置,可以手动构建带有自定义Netty HttpClient的WebClient,再传给WebReactiveFeign.Builder:
1. 创建自定义Netty HttpClient和Connector
import org.springframework.http.client.reactive.ReactorClientHttpConnector; import reactor.netty.http.client.HttpClient; public class CustomNettyConnectorProvider { public ReactorClientHttpConnector getCustomConnector() { HttpClient customHttpClient = HttpClient.create() .resolver(spec -> spec.retryTcpOnTimeout(true)); return new ReactorClientHttpConnector(customHttpClient); } }
2. 构建Feign客户端时传入自定义WebClient
import com.playtika.reactivefeign.webclient.WebReactiveFeign; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class FeignClientConfiguration { @Bean public MyFeignClient myFeignClient(CustomNettyConnectorProvider connectorProvider) { WebClient customWebClient = WebClient.builder() .clientConnector(connectorProvider.getCustomConnector()) .build(); return WebReactiveFeign.builder() .webClient(customWebClient) .target(MyFeignClient.class, "http://your-target-service"); } }
这种方式可以精准控制单个Feign客户端的HTTP客户端配置,适合需要差异化配置的场景。
方式三:自定义NettyClientHttpConnector并覆盖默认Bean
直接创建自定义的ReactorClientHttpConnector Bean,覆盖Spring默认的实例,这样所有WebClient都会使用这个Connector:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import reactor.netty.http.client.HttpClient; @Configuration public class GlobalNettyConnectorConfig { @Bean public ReactorClientHttpConnector reactorClientHttpConnector() { HttpClient httpClient = HttpClient.create() .resolver(spec -> spec.retryTcpOnTimeout(true)); return new ReactorClientHttpConnector(httpClient); } }
这种方式和方式一类似,也是全局生效,但更直接控制Connector实例。
内容的提问来源于stack exchange,提问作者pioter
相关产品推荐
相关产品推荐

