惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 郭慕荣

Docker部署zookeeper总结 Mac中git ssh的配置(GitLab) Java 类加载机制 面试题(一) 如何监控和调优JVM性能? jvm常用的参数有哪些? 怎么配置? hashmap 和currenthashmap 的原理?详解一下 aop在项目中使用的场景?怎么使用? Java dubbo spring springboot中的spi机制 spring中常见的两种代理模式 Redis的zset 面试汇总 drools 规则引擎在线化配置 - 郭慕荣 springcloud中常用的注解详解 springcloud中网关gateway总结 spring是怎么解决循环依赖的? MySQL 死锁 怎么处理? 在写left join的时候 是大表在左侧 还是小表在左侧(二) 在写left join的时候 是大表在左侧 还是小表在左侧(一) nacos客户端(接口调用者)如何感知被调用服务下线? (二) 在MySQL中 redolog undolog binlog 写入的场景,顺序 - 郭慕荣
nacos客户端(接口调用者)如何感知被调用服务下线?(一)
郭慕荣 · 2025-10-18 · via 博客园 - 郭慕荣

Nacos 客户端(接口调用者)感知被调用服务下线的过程,依赖于 Nacos 的服务注册与发现机制、健康检查机制以及客户端缓存更新策略。核心逻辑是:Nacos 服务器实时维护服务实例状态,客户端通过 “主动拉取 + 被动推送” 结合的方式,实时同步服务实例变化,最终感知到服务下线。

被调用服务(服务提供者)下线分为两种情况,Nacos 对这两种情况的处理方式不同,客户端的感知路径也略有差异:

服务提供者因 “优雅停机”(如执行shutdown命令、调用 Nacos API 注销)主动下线时,会向 Nacos 服务器发送注销请求,明确告知 “当前实例需下线”。

服务提供者因 “进程崩溃、服务器宕机、网络中断” 等异常情况被动下线,无法主动通知 Nacos,此时依赖 Nacos 的健康检查机制发现实例不可用,进而标记为下线。

无论主动还是异常下线,Nacos 服务器都会先更新服务实例状态,为客户端感知提供基础:

  • 服务提供者调用 Nacos 的NamingService.deregisterInstance()方法,向服务器发送注销请求;
  • Nacos 服务器接收到请求后,立即将该实例从 “健康实例列表” 中移除,并更新服务的元数据(如实例数量、状态)。

Nacos 通过客户端心跳上报和服务器端主动探测两种方式检测服务健康状态:

  • 客户端心跳上报(默认方式): 服务提供者启动后,会定期(默认 5 秒)向 Nacos 服务器发送心跳包(包含实例 ID、服务名等信息); Nacos 服务器维护一个 “心跳超时计数器”,若超过15 秒未收到心跳(可配置),则将实例标记为 “不健康”;若超过30 秒未收到心跳,则将实例从健康列表中移除(视为下线)。
  • 服务器端主动探测(可选): 若配置为服务器端探测(如 TCP 端口探测、HTTP 接口探测),Nacos 服务器会定期(如每 2 秒)向服务实例发送探测请求; 若连续多次(如 3 次)探测失败,服务器会将实例标记为下线。

Nacos 客户端(调用者)通过 **“本地缓存 + 服务端推送 + 定时拉取”** 三重机制,实时同步服务实例状态,从而感知下线:

调用者启动时,会从 Nacos 服务器全量拉取目标服务的所有健康实例,存储在本地内存缓存(ServiceInfo对象)中,作为服务调用的 “基准列表”。

  • 缓存内容:服务名、实例列表(IP、端口、健康状态、权重等)、最后更新时间。

Nacos 采用 **“推播结合”** 的模式,当服务实例状态变化(如下线)时,服务器会主动通知客户端,触发客户端缓存更新:

  • 机制实现:客户端初始化时,会通过NamingService.subscribe()方法注册服务监听器(EventListener),并与 Nacos 服务器建立长连接(基于 HTTP 长轮询或 UDP);当服务实例状态变化(如下线)时,Nacos 服务器会通过长连接向所有订阅该服务的客户端推送 “实例变更事件”(包含变更的实例 ID、服务名、变更类型);客户端接收到推送后,立即触发监听器回调,增量更新本地缓存(移除下线实例)。

  • 优势:实时性高(毫秒级),避免客户端频繁轮询导致的资源浪费。

为防止 “推送丢失”(如网络波动导致推送失败),客户端会定时全量拉取服务实例列表,作为缓存更新的兜底:

  • 拉取频率:默认每 60 秒(可通过nacos.client.refresh.interval配置);
  • 流程:客户端向 Nacos 服务器发送全量查询请求,对比本地缓存的 “最后更新时间” 与服务器的最新时间;若服务器数据更新,则拉取最新实例列表,全量覆盖本地缓存。

即使客户端缓存未及时更新(如推送延迟、拉取周期未到),调用者在实际发起服务调用时,还会通过以下方式校验实例可用性:

  • 负载均衡层过滤:客户端集成的负载均衡组件(如 Ribbon、Spring Cloud LoadBalancer)会从本地缓存中筛选 “健康实例”(过滤已标记为下线的实例);
  • 失败重试与快速失败:若调用某个实例时发生 “连接超时、拒绝连接” 等错误,客户端会将该实例临时标记为 “不可用”(如通过熔断器模式),并触发缓存重新拉取,避免再次调用。
  1. 服务下线触发:服务主动注销或异常下线,Nacos 服务器更新实例状态;
  2. 服务器通知:Nacos 通过长连接向客户端推送 “实例下线事件”;
  3. 客户端缓存更新:客户端监听器接收事件,增量更新本地缓存,移除下线实例;
  4. 兜底校验:定时全量拉取确保缓存一致,调用时负载均衡过滤进一步保障。

通过这套机制,Nacos 客户端能在秒级内感知服务下线,确保调用者不再向已下线的服务实例发起请求,保障服务调用的可用性。