本文介绍如何通过微服务实现无损发布或无损上下线。
问题现象
您的应用在发布、重启等操作时,上游服务(发起调用的服务)可能会请求到正在停止的下游服务(被调用的服务),导致出现业务流量的错误(例如链接超时、业务报错等)。
问题原因
下游服务在请求发起后才开始停止,导致请求不被响应。
下游服务停止时,由于应用本身逻辑复杂,停止较慢,导致从注册中心注销服务较晚。
下游服务正常停止,但上游服务因其他原因(例如网络故障、资源不足、处理逻辑异常等),没有及时处理和使用注册中心给予的新下游服务地址列表。
使用了旧版本的客户端,由于机制问题移除下线的地址列表时效性较低。
解决方案
最佳方式为接入微服务治理的无损发布功能。无损发布功能提供一站式的无损发布及上下线服务,免去复杂的排查及解决过程。更多信息,请参见配置无损滚动发布。
如果无法接入微服务治理的无损发布功能,则需要查看上游服务的Nacos客户端日志,在日志中检索下游服务的名字及关键字current ips
,并比较下游服务的变更时间、Nacos客户端日志信息的时间及上游服务报错的时间。
若三者基本一致(即发起下游服务变更后,上游服务开始报错,但Nacos客户端日志信息出现后,上游服务报错停止),则说明程序正常,可使用下文的通用解决方案。更多信息,请参见通用解决方案。
若下游服务的变更时间、Nacos客户端日志信息的时间基本一致,但上游服务报错的时间始终未恢复,说明Nacos服务端正确推送了地址,且Nacos客户端也接收到了地址,但应用程序未使用。您可以按照如下方法进行排查。
非开源框架使用者请检查应用自身逻辑,查看是否存在缓存机制且缓存更新出错。
开源框架使用者可以到对应社区寻求帮助。
若下游服务的变更时间、Nacos客户端日志信息的时间基本一致,但上游服务报错的时间恢复很慢,说明Nacos服务端正确推送了地址且Nacos客户端也接收到了地址,但应用程序未立刻使用,可以按照以下方法排查。
非开源框架使用者,请检查应用自身是否有缓存机制并且缓存更新存在延迟问题。
请检查是否使用
ribbon
、feign
、loadbalance
等辅助框架,此类框架存在地址列表缓存且更新时间较慢,请根据对应框架修改缓存刷新配置。其他开源框架使用者可以到对应社区寻求帮助。
若排查后仍无法解决,可使用下文的通用解决方案。更多信息,请参见通用解决方案。
若下游服务的变更时间与Nacos客户端日志信息的时间、上游服务报错的时间相差较大,说明下游服务变更未被Nacos客户端感知到,可以按照以下方法排查。
将上游服务和下游服务的Nacos客户端升级至2.X及以上版本。
查看上游服务是否存在网络故障、资源不足等问题。
排查下游服务停止时是否存在阻塞逻辑,导致应用无法响应请求但注册中心仍旧存在。
若排查后仍无法解决,可使用下文的通用解决方案。更多信息,请参见通用解决方案。