一、问题出现原因及初步分析
今天遇到一个奇怪的错误,一个一直正确运行的微服务后台,突然无法访问,如何重启都会报错。
想到近期有人在服务器上安装过其它服务,因此,考虑可能是配置问题,可配置问题修复后,绐终无法调用到这台机器的服务,测试发现报500错误码。
逐个服务排查,发现调用不到服务,因此考虑是gateway的问题。果然在Gateway中看到如下报错信息。
报错内容截取了主要部分,如下:
java.net.UnknownHostException: Failed to resolve 'bogon' after 2 queries
at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1047) ~[netty-resolver-dns-4.1.82.Final.jar!/:4.1.82.Final]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
*__checkpoint ⇢ com.armi.gateway.configuration.CorsConfiguration$$Lambda$463/511707818 [DefaultWebFilterChain]
*__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
*__checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
*__checkpoint ⇢ HTTP POST "/sso/api/auth/signin" [ExceptionHandlingWebHandler]
可以看到,报错内容与两个内容有关,1、‘bogon’;2、DnsResolveContext;3、CorsConfiguration(可能性不大,但暂不排除)
二、问题原因排查
1、分析bogon
找到报错,就有了方向。先查了查bogon,得到如下结果:
这个错误表明Spring Gateway在尝试解析一个名为bogon的主机名时失败了。bogon通常不是一个真实的主机名,它可能是配置错误或者临时测试时使用的一个占位符。
意思是不是很明白,大概是说找名为“bogon”的主机,但没找到。“bogon”也不是真实的主机名,可能只是一个占位符。
看报错信息,DnsResolveContext应该是与bogon的报错直接关联,先跳过,分析CorsConfiguration,这个是自己写的,方便排查。也可以看一看是否能进一步了解这个错误的原因。
2、分析CorsConfiguration
先进行远程调试,停止gateway服务,使用如下命令启动gateway服务,命令中:10.11.12.102为我的服务器的IP,5005为调试端口,后面在Intellij idea中配置时使用。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10.11.12.102:5005 -jar gateway.jar
在Intellij idea中添加一个Gateway的远程调试,其中Host为服务器的IP,5005为上面设置的调试端口。
经过测试,发现Cors没有问题,但错误依然在。而且在调试的代码中全部正常。
结论,与CorsConfiguragion文件无关。只与这个bogon有关
三、错误原因分析及总结
结合前面的分析结果,可以断定,问题就是出现在bogon上,三个可能性:1、代码中配置了“bogon”;2、Consul配置有问题,有“bogon”相关内容;3、服务器配置异常。
先在代码中搜索了“bogon”,什么也没找到;替换了Consul,错误依然在,那就只剩下一种可能性,服务器配置异常。
那么,既然是要找bogon,那么就检查一下consul服务器和应用服务器的名称,使用如下命令:
hostname
惊奇的发现,两台服务器的名称都是bogon。
于是,深入调研了一下bogon这个词。
服务器名称为bogon,用于表示一个不存在或不可达的IP地址。
在实际应用中,这可能是因为某种特定的网络环境或配置错误导致IP地址无法解析,从而显示为bogon。
也就是说,服务器的名称异常,于是,修改计算名称
hostnamectl set-hostname <host-name>
而后重启所有服务,一切恢复正常。顺利解决。