






















Nacos 客户端(接口调用者)感知被调用服务下线的过程,依赖于 Nacos 的服务注册与发现机制、健康检查机制以及客户端缓存更新策略。核心逻辑是:Nacos 服务器实时维护服务实例状态,客户端通过 “主动拉取 + 被动推送” 结合的方式,实时同步服务实例变化,最终感知到服务下线。
被调用服务(服务提供者)下线分为两种情况,Nacos 对这两种情况的处理方式不同,客户端的感知路径也略有差异:
服务提供者因 “优雅停机”(如执行shutdown命令、调用 Nacos API 注销)主动下线时,会向 Nacos 服务器发送注销请求,明确告知 “当前实例需下线”。
服务提供者因 “进程崩溃、服务器宕机、网络中断” 等异常情况被动下线,无法主动通知 Nacos,此时依赖 Nacos 的健康检查机制发现实例不可用,进而标记为下线。
无论主动还是异常下线,Nacos 服务器都会先更新服务实例状态,为客户端感知提供基础:
NamingService.deregisterInstance()方法,向服务器发送注销请求;Nacos 通过客户端心跳上报和服务器端主动探测两种方式检测服务健康状态:
Nacos 客户端(调用者)通过 **“本地缓存 + 服务端推送 + 定时拉取”** 三重机制,实时同步服务实例状态,从而感知下线:
调用者启动时,会从 Nacos 服务器全量拉取目标服务的所有健康实例,存储在本地内存缓存(ServiceInfo对象)中,作为服务调用的 “基准列表”。
Nacos 采用 **“推播结合”** 的模式,当服务实例状态变化(如下线)时,服务器会主动通知客户端,触发客户端缓存更新:
机制实现:客户端初始化时,会通过NamingService.subscribe()方法注册服务监听器(EventListener),并与 Nacos 服务器建立长连接(基于 HTTP 长轮询或 UDP);当服务实例状态变化(如下线)时,Nacos 服务器会通过长连接向所有订阅该服务的客户端推送 “实例变更事件”(包含变更的实例 ID、服务名、变更类型);客户端接收到推送后,立即触发监听器回调,增量更新本地缓存(移除下线实例)。
优势:实时性高(毫秒级),避免客户端频繁轮询导致的资源浪费。
为防止 “推送丢失”(如网络波动导致推送失败),客户端会定时全量拉取服务实例列表,作为缓存更新的兜底:
nacos.client.refresh.interval配置);即使客户端缓存未及时更新(如推送延迟、拉取周期未到),调用者在实际发起服务调用时,还会通过以下方式校验实例可用性:
通过这套机制,Nacos 客户端能在秒级内感知服务下线,确保调用者不再向已下线的服务实例发起请求,保障服务调用的可用性。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。