Quarkus集成Smallrye Stork无法解析DNS问题求助
需要向service.example.com服务发送数据,该域名DNS包含CNAME记录及多个A记录(IP和名称已化名)。使用Quarkus原生RestClient时,若首个IP不可达,无法切换至其他IP。尝试用Smallrye Stork解决,但配置后始终报错:Failed to fetch service instances: java.lang.RuntimeException: No DNS server was able to resolve 'service.example.com'。即使指定DNS服务器、更换记录类型(A/AAAA/SRV)、调整hostname格式,或更换无CNAME的x.com测试,问题依旧。想确认是否误解了框架用途,或如何解决该问题。
DNS查询结果(service.example.com)
$ dig service.example.com ; <<>> DiG xxxxxxx <<>> service.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32008 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;service.example.com. IN A ;; ANSWER SECTION: service.example.com. 740 IN CNAME service.example.com.some.internal.service.com. service.example.com.some.internal.service.com. 290 IN A 300.402.251.65 service.example.com.some.internal.service.com. 290 IN A 300.402.250.1 service.example.com.some.internal.service.com. 290 IN A 300.402.249.65 service.example.com.some.internal.service.com. 290 IN A 300.402.248.1 ;; Query time: 0 msec ;; SERVER: 10.0.0.102#53(10.0.0.102) ;; WHEN: Mi Apr 10 08:27:42 CEST 2024 ;; MSG SIZE rcvd: 158
报错信息
2024-04-12 13:51:17.596 ERROR [io.sm.st.im.CachingServiceDiscovery:72] [] [] Failed to fetch service instances: java.lang.RuntimeException: No DNS server was able to resolve 'service.example.com'
Quarkus配置(application.properties)
quarkus.stork.my-service.service-discovery.type=dns quarkus.stork.my-service.service-discovery.hostname=service.example.com quarkus.stork.my-service.service-discovery.port=8443 quarkus.stork.my-service.service-discovery.secure=true quarkus.stork.my-service.service-discovery.dns-timeout=8s quarkus.stork.my-service.service-discovery.dns-servers=dns.dns1.de quarkus.stork.my-service.service-discovery.record-type=A
RestClient构建代码
RestClientBuilder.newBuilder() .baseUri(URI.create("stork://my-service")) .build(ServiceHealthInterface.class);
DNS查询结果(x.com)
$ dig x.com ; <<>> DiG xxxxxxx <<>> x.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28082 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;x.com. IN A ;; ANSWER SECTION: x.com. 292 IN A 300.144.42.1 x.com. 292 IN A 300.144.42.129 x.com. 292 IN A 300.144.42.193 x.com. 292 IN A 300.144.42.65 ;; Query time: 0 msec ;; SERVER: 10.1.1.102#53(10.1.1.102) ;; WHEN: Fr Apr 12 16:02:59 CEST 2024 ;; MSG SIZE rcvd: 98
1. 检查DNS服务器可达性
你配置的dns.dns1.de可能在应用运行环境中无法访问。在应用所在机器执行dig @dns.dns1.de service.example.com,确认该DNS服务器能正常解析目标域名。如果无法解析,换成你本地dig命令中使用的可用DNS服务器(比如10.0.0.102或10.1.1.102)。
2. 调整Stork DNS配置参数
- 移除
secure=true:该参数针对SRV记录的DNSSEC验证,你用的是A记录,无需开启,可能干扰解析流程。 - 显式开启CNAME跟随:添加
quarkus.stork.my-service.service-discovery.follow-cname=true,确保Stork能解析CNAME指向的最终A记录。 - 调整超时时间:把
dns-timeout缩短到2秒左右,避免长时间等待无响应的DNS服务器。
修改后的配置示例:
quarkus.stork.my-service.service-discovery.type=dns quarkus.stork.my-service.service-discovery.hostname=service.example.com quarkus.stork.my-service.service-discovery.port=8443 quarkus.stork.my-service.service-discovery.dns-timeout=2s quarkus.stork.my-service.service-discovery.dns-servers=10.0.0.102 quarkus.stork.my-service.service-discovery.record-type=A quarkus.stork.my-service.service-discovery.follow-cname=true
3. 确认Stork依赖是否正确引入
确保项目中已添加Stork的DNS服务发现依赖:
- Maven(pom.xml):
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-stork-dns-service-discovery</artifactId> </dependency>
- Gradle:
implementation 'io.quarkus:quarkus-stork-dns-service-discovery'
4. 优化RestClient集成方式
改用注入方式创建RestClient,确保Quarkus正确处理Stork集成逻辑:
@Inject @RestClient ServiceHealthInterface serviceClient;
同时确保ServiceHealthInterface接口标注了@RegisterRestClient注解。
5. 排查网络环境限制
检查应用所在机器的防火墙或代理规则,确保允许访问指定DNS服务器的UDP 53端口,避免DNS查询被拦截。
内容的提问来源于stack exchange,提问作者Bevor

