Spring Boot 2.4.0+ Spring Cloud Gateway报UnknownHostException
Spring Cloud Gateway转发请求DNS解析异常问题
问题核心表现
- Spring Cloud Gateway网关服务可正常完成启动流程,对外暴露服务端口无异常报错
- 所有经网关转发的后端服务请求均执行失败,抛出DNS解析类异常
- 经验证,将配套使用的Spring Boot版本降级至兼容范围后,请求转发链路可恢复正常运行
- 异常调用链路关联Reactor Netty组件的已知DNS解析逻辑变更问题
完整异常堆栈
java.net.UnknownHostException: failed to resolve 'myserver' after 4 queries at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): |_ checkpoint ? org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain] |_ checkpoint ? org.springframework.cloud.sleuth.instrument.web.TraceWebFilter [DefaultWebFilterChain] |_ checkpoint ? org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain] |_ checkpoint ? HTTP GET "/service/api/applications/123" [ExceptionHandlingWebHandler] Stack trace: at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:966) at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:414) at io.netty.resolver.dns.DnsResolveContext.onResponse(DnsResolveContext.java:601) at io.netty.resolver.dns.DnsResolveContext.access$400(DnsResolveContext.java:63) at io.netty.resolver.dns.DnsResolveContext$2.operationComplete(DnsResolveContext.java:458) .....
异常产生根因
- 高版本Reactor Netty调整了默认DNS解析器的工作行为:不再默认对齐操作系统的本地解析规则(包括hosts映射、系统DNS配置、本地DNS缓存),而是启用独立的内置DNS客户端发起解析查询
- 异常堆栈的调用点全部位于
io.netty.resolver.dns包下,说明故障完全发生在Reactor Netty的DNS解析环节,和网关本身的路由转发、过滤器执行逻辑无关 - 当后端服务域名通过本地hosts映射、内网DNS地址分配的场景下,内置解析器如果没有正确加载对应DNS服务器配置,就会发起无效查询,经过多次重试后最终抛出解析失败的异常
可落地的解决方向
- 版本快速适配:将Spring Boot版本降级到与当前网关逻辑兼容的稳定版本区间,可快速恢复DNS解析能力
- 自定义解析配置:在网关的Reactor Netty全局配置中,显式指定内置DNS解析器需要使用的DNS服务器地址,补充对应域名的静态映射规则
- 解析逻辑切换:调整Reactor Netty的DNS解析策略,强制复用操作系统的本地解析能力,绕开内置解析器的逻辑限制
内容的提问来源于stack exchange,提问作者Albert Scholtz
相关产品推荐
相关产品推荐

