本文介绍当应用服务调用了非预期的服务提供者时的解决方案。
问题现象
应用服务调用了依赖服务的提供者时,提示No provider或找不到服务等错误。
应用服务调用了依赖服务的提供者重启或发布后,IP地址发生变更但应用服务仍然在调用旧的提供者地址。
可能原因
服务提供者未注册或注册至错误环境内。
网络问题或订阅者应用有问题,导致Nacos-Client未获取到最新的服务提供者地址。
Nacos-Client已经获取到最新的服务提供者地址,但应用未使用(如有路由规则、权重规则、框架缓存等)。
解决方案
(1) 从控制台上查看该服务的提供者是否存在,且数量及地址是否符合预期。若在控制台上看到预期的服务提供者不存在,解决方案请参考服务提供者注册失败。
(2) 如果控制台上仍然能看到旧服务提供者IP地址,解决方案请参考控制台还能查到不存在的服务提供者IP链接怎么办。
(3) 若控制台上服务存在且地址符合预期,可通过以下操作确认地址是否推送成功:搜索该服务或订阅者IP的推送轨迹,是否存在记录。存在记录则为推送成功。
在应用订阅者节点上找到Nacos-Client的日志,检索关键字current ips以及对应的服务名,查看日志中的服务提供者实例个数及对应的详细信息是否与控制台上的一致。一致则确认Nacos-Client已收到推送。
(4) 通过上述操作,若已确认服务提供者列表已经成功推送,表明应用自身未使用最新服务提供者地址。请根据应用所使用框架,或应用自身逻辑出发,排查问题原因。该问题经常出现在以下场景。
Spring Cloud框架使用Feign/Loadbalance/Robin等辅助插件框架时,由于其存在自身缓存/路由规则,会导致Nacos-Client中最新的服务提供者地址不被使用或被延迟使用。
Dubbo 2.7.7~2.7.16存在多订阅问题,有可能出现推送的最新地址不被使用的问题。请升级至2.7.17以上版本或开启推空保护规避。
(5) 若通过上述操作未发现服务提供者列表已经成功推送,可通过Nacos-Client的日志查看推送出错的原因。
如出现read time out、connected timeout等超时字样,则参考#5.1.2.9Nacos连接超时问题。
如出现UnknownHostException、Unable to resolve host等域名无法解析问题,则参考#5.1.2.11域名无法解析的问题
如果使用2.0.0~2.0.4版本Nacos-Client,且应用中依赖org.reflections工具包,则可能是该工具包冲突导致。请设置org.reflections工具包为0.9.11版本或升级Nacos-Client至2.1.0及以上版本。