Quarkus RestClient多A类IP地址DNS故障转移配置咨询
Quarkus RestClient多IP故障转移解决方案
针对你遇到的RestClient仅使用第一个DNS解析IP、失败时不重试其他IP的问题,可通过以下几种方式解决:
1. 使用Apache HttpClient作为底层客户端并配置重试
Quarkus提供了Apache HttpClient扩展,该客户端默认支持遍历DNS解析出的所有IP,配合重试配置可实现故障转移:
步骤1:添加依赖
Maven项目在pom.xml中加入:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest-client-apache</artifactId> </dependency>
步骤2:配置application.properties
针对你的RestClient实例配置(替换com.example.MyServiceClient为你的接口类全限定名或配置键):
# 基础地址 quarkus.rest-client."com.example.MyServiceClient".url=https://service.example.com # 连接超时与读取超时 quarkus.rest-client."com.example.MyServiceClient".apache-client.connect-timeout=5s quarkus.rest-client."com.example.MyServiceClient".apache-client.socket-timeout=10s # 开启重试 quarkus.rest-client."com.example.MyServiceClient".apache-client.retry-enabled=true # 最大重试次数 quarkus.rest-client."com.example.MyServiceClient".apache-client.max-retries=3 # 连接池配置(按需调整) quarkus.rest-client."com.example.MyServiceClient".apache-client.connection-manager.max-total=20 quarkus.rest-client."com.example.MyServiceClient".apache-client.connection-manager.default-max-per-route=5
Apache HttpClient会自动遍历DNS返回的所有IP,当第一个IP连接失败时尝试下一个,配合重试配置可覆盖多次连接失败场景。
2. 配置RESTEasy Reactive客户端(默认模式)
若使用Quarkus默认的RESTEasy Reactive RestClient,可直接通过配置开启连接失败重试:
quarkus.rest-client."com.example.MyServiceClient".url=https://service.example.com quarkus.rest-client."com.example.MyServiceClient".reactive.connect-timeout=5s quarkus.rest-client."com.example.MyServiceClient".reactive.read-timeout=10s # 开启连接失败重试 quarkus.rest-client."com.example.MyServiceClient".reactive.retry-on-connect-failure=true # 最大重试次数 quarkus.rest-client."com.example.MyServiceClient".reactive.max-retries=3
Reactive客户端原生支持DNS多IP遍历,开启retry-on-connect-failure后会自动尝试其他IP。
3. 调整JVM DNS缓存参数
JVM默认会缓存DNS解析结果,可能导致无法及时获取最新IP列表。在应用启动参数中添加以下配置:
-Dnetworkaddress.cache.ttl=60 -Dnetworkaddress.cache.negative.ttl=10
networkaddress.cache.ttl:DNS正缓存有效期(单位:秒),设置为60表示每分钟重新解析一次networkaddress.cache.negative.ttl:DNS负缓存(即解析失败的记录)有效期,设置为10表示10秒后重新尝试解析
4. 结合Fault Tolerance增强重试逻辑
添加quarkus-smallrye-fault-tolerance依赖,在RestClient接口上标注@Retry注解,针对连接异常进行重试:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-smallrye-fault-tolerance</artifactId> </dependency>
然后在接口中配置:
@RegisterRestClient(baseUri = "https://service.example.com") @Retry( maxRetries = 3, delay = 100, retryOn = {ConnectException.class, SocketTimeoutException.class} ) public interface MyServiceClient { @GET @Path("/api/data") String getData(); }
该注解会在指定异常发生时触发重试,配合底层客户端的IP遍历,可实现更全面的故障恢复。
内容的提问来源于stack exchange,提问作者Bevor
相关产品推荐
相关产品推荐

