文档

应用服务调用了非预期的服务提供者

更新时间:

本文介绍当应用服务调用了非预期的服务提供者时的解决方案。

问题现象

  • 应用服务调用了依赖服务的提供者时,提示No provider找不到服务等错误。
  • 应用服务调用了依赖服务的提供者重启或发布后,IP地址发生变更但应用服务仍然在调用旧的提供者地址。

可能原因

  • 服务提供者未注册或注册至错误环境内。
  • 网络问题或订阅者应用有问题,导致Nacos-Client未获取到最新的服务提供者地址。
  • Nacos-Client已经获取到最新的服务提供者地址,但应用未使用(如有路由规则、权重规则、框架缓存等)。

解决方案

  1. 从控制台上查看该服务的提供者是否存在,且数量及地址是否符合预期。具体操作,请参见查看服务详情

    若在控制台上看到预期的服务提供者不存在,解决方案请参考服务提供者注册失败

  2. 如果控制台上仍然能看到旧服务提供者IP地址,解决方案请参考控制台还能查到不存在的服务提供者IP链接怎么办
  3. 若控制台上服务存在且地址符合预期,可通过以下操作确认地址是否推送成功:
    1. 若MSE Nacos实例版本为专业版且使用的Nacos-client版本为2.0.0及以上,请搜索该服务或订阅者IP的推送轨迹,是否存在记录。存在记录则为推送成功。具体操作,请参见推送轨迹
    2. 若MSE Nacos实例版本为专业版2.0.4.0及以上且使用的Nacos-client版本为2.0.0及以上,请查看推送监控中的推送成功率是否为100%。具体操作,请参见新版Grafana监控大盘
    3. 若MSE Nacos实例版本为基础版或Nacos-Client版本较低,可以在应用订阅者节点上找到Nacos-Client的日志,检索关键字current ips以及对应的服务名,查看日志中的服务提供者实例个数及对应的详细信息是否与控制台上的一致。一致则确认Nacos-Client已收到推送。具体操作,请参见如何获取Nacos-Client的日志?
  4. 通过上述操作,若已确认服务提供者列表已经成功推送,表明应用自身未使用最新服务提供者地址。请根据应用所使用框架,或应用自身逻辑出发,排查问题原因。该问题经常出现在以下场景。
    1. Spring Cloud框架使用Feign/Loadbalance/Robin等辅助插件框架时,由于其存在自身缓存/路由规则,会导致Nacos-Client中最新的服务提供者地址不被使用或被延迟使用。请根据对应框架设置排查对应问题。
    2. Dubbo 2.7.7~2.7.16存在多订阅问题,有可能出现推送的最新地址不被使用的问题。请升级至2.7.17以上版本或开启推空保护规避。更多信息,请参见推空保护
    3. 由于框架问题复杂且由社区自行维护,排查难度较高,建议接入微服务治理的无损发布功能。更多信息,请参见配置无损滚动发布
  5. 若通过上述操作未发现服务提供者列表已经成功推送,可通过Nacos-Client的日志查看推送出错的原因。
    1. 如出现read time outconnected timeout等超时字样,解决方案请参考如何解决MSE Nacos连接超时问题?
    2. 如出现UnknownHostExceptionUnable to resolve host等域名无法解析问题,解决方案请参考如何解决MSE Nacos实例域名无法解析的问题?
    3. 若您使用2.0.0~2.0.4版本Nacos-Client,且您应用中依赖org.reflections工具包,则可能是该工具包冲突导致。请设置org.reflections工具包为0.9.11版本或升级Nacos-Client至2.1.0及以上版本。
  • 本页导读 (1)