← 每日面试题 学习看板

Nacos的服务注册和服务发现的过程是怎么样的?

面试题/00java/04 框架/02SpringCloud/Nacos的服务注册和服务发现的过程是怎么样的?.md

面试记录 2026-09-27

题目:Nacos的服务注册和服务发现的过程是怎么样的?

难度:medium

标签:spring/cloud, general/knowledge

评分:⭐☆☆☆☆(1/5)

我的回答

Nacos 的服务注册,加载类。发送请求信息,确定建立关系。进行注册,翻译过程是在。通过请求对应的端口接口实现发现,上线之后启动的时候进行调用,实现发现。然后双方建立互通消息,完成注册。

点评

优点:

不足:

补充(完整流程):

服务注册:

  1. 服务启动,读取 spring.cloud.nacos.discovery.server-addr 等配置
  2. 通过 NamingService.registerInstance() 调用 HTTP PUT /nacos/v1/ns/instance(或 2.x gRPC)向 Nacos 上报实例元数据(IP、端口、权重、健康状态、metadata)
  3. Nacos 集群接收请求,通过 Distro 协议把实例信息异步同步到其他节点(临时实例)
  4. 客户端启动定时任务,每 5 秒发一次心跳(/nacos/v1/ns/instance/beat)
  5. Nacos 服务端判断:15 秒无心跳标记不健康,30 秒无心跳自动剔除
  6. 服务优雅关闭时主动调用 DeregisterInstance 接口

服务发现:

  1. 消费端启动时通过 NamingService.getInstances() 或 subscribe() 请求服务列表
  2. HTTP GET /nacos/v1/ns/instance/list?serviceName=xxx 获取所有健康实例
  3. 客户端本地缓存服务列表,避免每次调用都查 Nacos
  4. 监听机制:1.x 用长轮询(30 秒挂起等待变化),2.x 用 gRPC 长连接主动 push
  5. 服务列表变化时更新本地缓存,消费端通过负载均衡(轮询/随机/权重)选实例发起调用

关键细节:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察对 Nacos 客户端与集群两端交互全流程的深入理解,尤其是心跳续约和健康检查机制。

知识点拆解:

  1. 服务注册流程:服务启动 → 上报实例(IP/port/权重/metadata)→ Nacos 集群同步(Distro/Raft)→ 客户端心跳续约(5s/次,15s 判不健康,30s 剔除)→ 优雅关闭时主动反注册。
  2. 服务发现流程:消费端启动 → 拉取服务列表并本地缓存 → 建立监听(长轮询或 gRPC push)→ 变化时更新缓存 → 负载均衡选实例发起调用。
  3. 心跳 vs 健康检查:临时实例走客户端推(心跳),永久实例走服务端拉(TCP check)。
  4. 集群内同步:
  1. 配置监听:1.x 长轮询(30s 挂起),2.x gRPC 长连接(推送更快、开销更小)
  2. 本地缓存:客户端缓存 Nacos 数据(文件缓存),Nacos 集群挂了仍能读到最近一次的服务列表,实现降级。
递进:注册是"上报+心跳续约",发现是"拉取+监听+本地缓存"。Nacos 用双一致性模型支撑两类实例。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 临时实例和永久实例有什么区别?心跳机制为什么重要?
  1. Nacos 集群挂了,服务还能继续通信吗?
  1. Nacos 1.x 和 2.x 的服务发现机制有什么区别?
  1. Nacos 服务发现的推送机制和 Eureka 的自我保护有什么区别?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,Nacos 的服务注册和发现是两个方向相反的交互流程,我分开讲。

服务注册分 4 步:

  1. 启动上报:服务启动时通过 SDK 调 NamingService.registerInstance(),底层是 HTTP PUT /nacos/v1/ns/instance(2.x 是 gRPC),把自身 IP、端口、权重、metadata 上报给 Nacos;
  2. 集群同步:Nacos 接收后,临时实例走 Distro 协议把数据异步复制到集群其他节点(AP 最终一致),永久实例走 Raft(CP 强一致);
  3. 心跳续约:客户端每 5 秒发一次心跳 /nacos/v1/ns/instance/beat;Nacos 判 15 秒没心跳标记为不健康、30 秒还没心跳就自动剔除;
  4. 优雅下线:服务关闭时调 DeregisterInstance 接口主动反注册,避免被误杀。

服务发现分 3 步:

  1. 首次拉取:消费端启动时调 getInstances() 或 subscribe(),HTTP GET /nacos/v1/ns/instance/list?serviceName=xxx 拿到全部健康实例,本地缓存这份列表;
  2. 监听变化:1.x 用长轮询(30 秒挂起连接,有变化立即返回),2.x 用 gRPC 长连接(服务端 push);有实例上下线时立即更新本地缓存;
  3. 负载均衡调用:消费端从本地缓存里按轮询/随机/权重/一致性哈希选实例发起实际调用。

两个关键点: