后台系统升级改造,目前有网关A,为了顺利升级,先部署网关B,在网关前面加一层转发层(IAS)A和B,定时任务调用网关B下的服务接口时,接口返回:{"timestamp":"2022-05-09T10:02:35.889+08:00","path":"/xxx/yyy","status":404,"error":"NotFound","message":null,"requestId":"06f3daf5-67392626"}转发层(IAS)的请求日志中没有请求记录,网关A的请求日志中没有任何记录。故障排查确认IAS和网关B是否正常:不使用域名,通过IP请求,接口调用成功。结论:正常。确认DNS是否正常:登录容器,在容器中执行curl,接口调用成功。结论:正常。总结一下:初步怀疑是调用服务的程序有问题。该服务使用spring-webflux的WebClient调用接口。需要检查WebClient是否有DNS缓存。问题的确认通过谷歌关键词搜索,成功定位到一个github问题:DocumentHowToSwitchDNSResolverIssue#1431reactor/reactor-nettyGitHub,然后通过问题中的链接,定位到官网ReactorNettyReferenceGuide(projectreactor.io),通过官方文档的描述得知,webclient底层使用的reactor-netty有缓存DNS,默认最长缓存时间为Int的最大值,为21亿秒。如果是缓存的原因,重启后服务调用应该是正常的。尝试重启后,发现服务确实可以调用。问题解决修改DNS缓存时间根据文档,可以设置DNS缓存时间webClient=WebClient.builder().clientConnector(newReactorClientHttpConnector(HttpClient.create().followRedirect(true))).build();更改为以下内容);但是当前项目的springboot版本是2.1.3.RELEASE,对应默认引入的reactor-netty版本是0.8.5.RELEASE,没有resolver方法。升级版本明确引入reactor-netty,指定1.0.15版本,启动时报NoSuchMethodException。发现显式引入的reactor-netty与springboot默认引入的netty-codec-http版本冲突。升级springboot版本到2.3.0.RELEASE。顺便把spring版本升级到5.3.18,解决spring零日漏洞问题。由于springboot默认引入了spring,所以只需要修改默认引入的版本:配置maven属性:
