← 返回 NACOS 列表

Nacos 注册中心原理

Nacos 注册中心原理

一、Nacos 概述

Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的服务发现与配置管理平台,提供服务注册与发现动态配置管理两大核心能力。

  • 注册中心:服务实例注册、健康检查、服务发现
  • 配置中心:配置集中管理、动态下发、变更通知

三、Nacos 注册中心原理

3.1 核心概念 [1.x/2.x/3.x 通用]

概念 说明
服务名 服务的唯一标识
实例 提供服务的具体 IP:Port 节点
临时实例 心跳上报,不健康则自动剔除(默认
持久化实例 需要手动注销,不健康不会被自动摘除
健康检查 检测实例是否存活
服务分组 同一服务的不同分组隔离
保护阈值 当健康实例比例低于阈值时,返回所有实例(包括不健康的)

3.2 注册表存储架构(按版本)

[1.x/2.x 机制] 全内存存储

                    ┌─────────────────────┐
                    │    Nacos Server      │
                    │  ┌─────────────────┐ │
                    │  │   注册表 Registry │ │
                    │  │ (Service → Set   │ │
                    │  │  of Instance)    │ │
                    │  │ 全部在内存       │ │
                    │  └─────────────────┘ │
                    │  ┌─────────────────┐ │
                    │  │ 一致性协议(Distro)│ │
                    │  └─────────────────┘ │
                    └────────┬────────────┘
                             │
         ┌───────────────────┼───────────────────┐
         ▼                   ▼                   ▼
    ┌──────────┐       ┌──────────┐       ┌──────────┐
    │ Provider │       │ Consumer │       │ Cluster  │
    │ (生产者)  │       │ (消费者)  │       │ (集群节点) │
    └──────────┘       └──────────┘       └──────────┘

1.x/2.x 瓶颈: 所有实例全量在内存中,10 万实例重启需从 DB 全量加载,耗时 ~180s。

[3.x 机制] 分级持久化存储

                    ┌───────────────────────────┐
                    │      Nacos Server 3.x       │
                    │  ┌───────────────────────┐ │
                    │  │  L1 内存层(热点数据)   │ │
                    │  │  │ 活跃实例缓存         │ │
                    │  └───────────────────────┘ │
                    │  ┌───────────────────────┐ │
                    │  │  L2 磁盘/DB层(全量数据)│ │
                    │  │  │ 持久化所有实例       │ │
                    │  └───────────────────────┘ │
                    │  ┌───────────────────────┐ │
                    │  │ 一致性协议(Distro)      │ │
                    │  └───────────────────────┘ │
                    └───────────────────────────┘

3.x 改进: 启动时仅加载 L1 热点数据,L2 按需加载,10 万实例启动从 180s → ~12s。详细存储对比见 5.2 节。


3.3 服务注册流程(按版本)

[1.x 机制] HTTP 注册

Provider ── HTTP POST /v1/ns/instance ──▶ Nacos Server 1.x
                                                │
                                           (1) 接收 JSON 格式实例数据
                                                │
                                           (2) 将实例存入内存注册表
                                                │
                                           (3) Distro 异步同步集群
                                                │
                                           (4) 返回 HTTP 200 OK
                                                │
Provider ◀──────── 注册成功 ─────────────────────┘

1.x 注册细节:

  • 使用 HTTP POST 请求,参数为 URL encode 格式或 JSON body
  • 请求路径:/v1/ns/instance
  • 参数包含:serviceName, ip, port, groupName, namespaceId, metadata, ephemeral=true
  • 无长连接,每次注册/心跳都是独立的 HTTP 请求

[2.x/3.x 机制] gRPC 注册

Provider ── 先建立 gRPC 双向流长连接 ──▶ Nacos Server 2.x/3.x
         │                                    │
         │  InstanceRequest (gRPC)             │
         │  Payload: {namespace, serviceName,  │
         │   ip, port, groupName, metadata}    │
         │══════════════════════════════════▶ │
         │                                    │
         │                                    │ (1) gRPC 反序列化请求
         │                                    │ (2) 写入注册表
         │                                    │     (1.x/2.x: 全内存写入)
         │                                    │     (3.x: 按 L1 热点策略写入)
         │                                    │ (3) Distro 异步同步集群
         │                                    │
         │◀══════ 注册成功响应 ────────────────│

3.4 心跳续约机制(按版本)

[1.x 机制] HTTP 心跳

临时实例通过 HTTP 请求上报心跳:

Provider ── HTTP PUT /v1/ns/instance/beat ──▶ Nacos Server 1.x
         │                                          │
         │  每 5s 发送一次 HTTP PUT                   │
         │  Body: {serviceName, ip, port, ...}        │ (1) 重置最后心跳时间
         │                                          │ (2) 标记实例为健康
         │◀──────── HTTP 200 OK ─────────────────────│ (3) 返回续约成功

1.x 心跳的关键问题:

  • 每个实例每 5s 发起一次 HTTP 请求,服务量大时 HTTP 连接数和线程开销激增
  • 服务端每个心跳请求都需要创建/销毁 HTTP 连接(即使开启 Keep-Alive,TCP 连接仍大量占用)

[2.x/3.x 机制] gRPC 长连接心跳

临时实例通过 gRPC 长连接的心跳包续约:

Provider ── 通过已建立的 gRPC 长连接 ──▶ Nacos Server 2.x/3.x
         │                                    │
         │  每 5s 发送心跳 (HealthCheckReq)     │
         │  复用同一个 gRPC 连接                 │ (1) 重置最后心跳时间
         │══════════════════════════════════▶ │ (2) 标记实例为健康
         │◀════════ 响应 ─────────────────────│

2.x/3.x 的改进: gRPC 长连接复用,所有心跳共享同一连接,服务端连接数从 O(实例数) 降至 O(节点数)。

[通用] 心跳参数与健康检测 [1.x/2.x/3.x]

下表参数在三个版本中基本一致:

参数 默认值 说明
heartbeatInterval 5s 客户端发送心跳间隔
ipDeleteTimeout 30s 连续 30s 收不到心跳,实例被标记为不健康
实际剔除时间 30s+ 健康检测线程周期性扫描并剔除过期实例

健康检测与摘除流程(服务端侧,三个版本通用):

后台检查线程每 3s 执行一次扫描
         │
    ┌────┴────┐
    │ 遍历所有  │
    │ 服务实例  │
    └────┬────┘
         │
    ┌────┴────┐
    │ 当前时间 -   │
    │ 最后心跳时间  │
    │ > 30s ?   │
    └────┬────┘
       Yes│          No
         ▼           ▼
    标记为不健康   不做处理
         │
    ┌────┴────┐
    │ 延迟扫描周期 │
    │ 若仍未恢复   │
    └────┬────┘
         │
         ▼
   从注册表中移除
         │
         ▼
   通知订阅的消费者(1.x: HTTP 通知 / 2.x/3.x: gRPC 推送)

3.5 服务发现流程(按版本)

[1.x 机制] HTTP 查询 + 无推送

Consumer ── HTTP GET /v1/ns/instance/list ──▶ Nacos Server 1.x
         │                                           │
         │  参数:serviceName, group, namespace        │ (1) 查询内存注册表
         │                                           │ (2) 返回实例列表 JSON
         │◀────────── 实例列表 ───────────────────────│
         │
         ▼
    (3) 客户端本地缓存实例列表
         │
    (4) 客户端需自行轮询检查变化(Nacos 1.x 客户端会定时拉取)

1.x 的局限: 服务端不支持主动推送,客户端只能定时 HTTP 拉取实例列表,存在感知滞后。

[2.x/3.x 机制] gRPC 订阅 + 主动推送

Consumer                 Nacos Server 2.x/3.x
   │                              │
   │  (1) 建立 gRPC 双向流长连接    │
   │════════════════════════════▶ │
   │◀════════════════════════════│
   │                              │
   │  (2) SubscribeService 订阅    │
   │  (gRPC 请求)                  │
   │────────────────────────────▶│
   │                              │ (3) 首次返回当前全量实例列表
   │◀────── 实例列表(全量)─────────│
   │                              │
   │                              │ (4) 后续:实例变化时主动推送
   │  实例上线/下线/健康变化         │
   │◀──── NotifySubscriber ──────│ ← 服务端主动推送
   │   (变化的实例增量数据)         │
   │                              │
   ▼                              ▼
  (5) 更新本地缓存

两种获取方式对比(2.x/3.x):

方式 说明 版本
pull 首次订阅时拉取全量实例列表 1.x/2.x/3.x 首次查询均使用
push 服务实例变更时,服务端通过 gRPC 双向流主动推送更新 仅 2.x/3.x

3.6 一致性协议 — Distro [1.x/2.x/3.x 通用概念实现有差异]

概念层面在各版本中一致:Nacos 注册中心采用 Distro 协议(AP 协议),而非强一致的 CP 协议(如 ZK 的 ZAB)。

设计思想(通用):

每个 Nacos 节点只负责一部分数据的写操作
    │
    ├── 客户端写入时,选择负责该服务的节点
    │
    ├── 写操作先写入本地
    │
    └── 异步同步到集群其他节点(最终一致)

关键特征(通用):

特性 说明
一致性 最终一致性(AP 优于 CP)
可用性 集群部分节点宕机,不影响整体服务
分区容忍 网络分区时优先保证可用性
写策略 客户端就近写入,节点间异步同步
读策略 任意节点可读(当前节点数据可能稍旧)

实现差异

维度 [1.x 机制] [2.x 机制] [3.x 机制]
集群一致性协议 Distro(AP)+ Raft(CP 配置同步) Distro(AP)+ JRAFT(CP 配置同步) 继承 2.x,性能优化
数据同步方式 异步 HTTP 同步 异步 gRPC 同步 异步 gRPC 同步
同步任务 DumpTask DumpTask(优化版) DumpTask(分级存储适配)

同步机制示意图(三个版本通用逻辑):

Client ──写请求──▶ Node A(负责节点)
                       │
                 写入本地注册表
                  (1.x/2.x: 全内存写入)
                  (3.x: L1/L2 分级写入)
                       │
                 异步发送 DumpTask ──▶ 同步到 Node B
                       │                  │
                 异步发送 DumpTask ──▶ 同步到 Node C
                       │                  │
                 返回 Client OK          其他节点更新注册表

3.7 保护阈值机制 [1.x/2.x/3.x 通用]

3.7.1 什么是保护阈值

保护阈值(Protect Threshold) 是 Nacos 注册中心的一项容灾保护机制,用于防止因大量服务实例不健康而导致的雪崩式服务不可用

核心定义:

当某个服务的健康实例数占总实例数的比例低于设置的阈值时,Nacos 将打破健康筛选规则,向消费者返回所有实例(包括不健康的),而不是返回空列表或仅返回健康的少数实例。

3.7.2 工作原理

计算公式:

健康实例比例 = 健康实例数 / 总实例数

判定逻辑:

                                                 ┌───────────────────┐
                                                 │   保护阈值设置      │
                                                 │   (0 ~ 1 之间)    │
                                                 └────────┬──────────┘
                                                          │
                    ┌──────────────────────────────────────┴──────────────────────┐
                    │                                                             │
                    ▼                                                             ▼
    ┌──────────────────────────────┐                        ┌──────────────────────────────┐
    │  健康比例 ≥ 保护阈值           │                        │  健康比例 < 保护阈值           │
    │                              │                        │                              │
    │  正常筛选模式                  │                        │  保护模式激活                   │
    │  消费者只获得健康实例           │                        │  消费者获得所有实例              │
    │  不健康的实例被过滤掉           │                        │  (包括健康的和不健康的)        │
    └──────────────────────────────┘                        └──────────────────────────────┘

3.7.3 为什么需要保护阈值?—— 场景分析

没有保护阈值时的问题:

场景:某服务有 10 个实例,全部健康
         │
   发生网络抖动 / 服务器过载
         │
         ▼
    8 个实例被误判为不健康(心跳超时)
         │
         ▼
    消费者拉取实例列表 → 仅返回 2 个健康实例
         │
         ├── 2 个实例承受全部流量 → 过载
         ├── 过载导致心跳超时 → 被标记不健康
         ├── 消费者获取到 0 个实例 → 请求全部失败
         └── ❿ 服务完全不可用(雪崩)

有保护阈值时:

场景:某服务有 10 个实例,设置保护阈值 = 0.5
         │
   发生网络抖动 / 服务器过载
         │
         ▼
    8 个实例被误判为不健康
    (健康比例 = 2/10 = 0.2 < 0.5)
         │
         ▼
    保护模式激活 → 消费者获取到全部 10 个实例
         │
         ├── 流量分发到所有实例(包括"不健康"的)
         ├── 实际上大部分实例仍能处理请求
         ├── 部分请求可能失败,但服务整体可用
         └── ❿ 服务降级可用,而非完全不可用

3.7.4 核心作用总结

作用 说明
防止雪崩 避免健康实例过载后被误判为不健康,导致消费者拿到空列表
保证服务可用性 即使大部分实例状态异常,消费者仍能继续调用(以请求成功率换服务可用性)
容忍误判 网络抖动、GC 暂停等临时故障可导致心跳超时,保护阈值容忍这些误判
柔性降级 不追求"只调健康实例"的强一致,而是"有服务可用"的最终目标

3.7.5 参数配置

参数 默认值 说明
protectThreshold 0(关闭) 0~1 之间的小数,0 表示不开启保护
建议生产设置 0.3 ~ 0.6 视服务冗余度而定,冗余越高阈值可设越低

配置方式:

  • 通过 Nacos 控制台:服务详情 → 保护阈值
  • 通过 API:PUT /v1/ns/service 携带 protectThreshold 参数
  • 通过 Spring Cloud:spring.cloud.nacos.discovery.protect-threshold=0.5

3.7.6 注意事项与面试要点

1. 保护阈值是"保底"手段,不是常规方案

  • 正常情况下应确保健康实例比例远高于阈值
  • 频繁触发保护模式说明系统存在稳定性问题,需要排查根因

2. 触发保护时消费者会调用到不健康实例

  • 请求可能失败或超时,需要在消费者侧做好重试熔断策略
  • 保护阈值与熔断(Sentinel / Hystrix)配合使用:保护阈值保证调用链不断,熔断保证单次调用质量

3. 保护阈值不适用于所有场景

  • 如果服务是无状态的且可以容忍部分请求失败 → 设置保护阈值
  • 如果调用失败会造成严重副作用(如重复扣款)→ 应严格只调健康实例,不设保护阈值

4. 与临时/持久化实例的关系

  • 保护阈值主要针对临时实例(心跳维护的实例)
  • 持久化实例本身不会被自动摘除,保护阈值对其效果有限

4.1 客户端启动初始化(按版本)

[1.x 机制] HTTP 客户端初始化

  1. 创建 NacosRestTemplate(HTTP 客户端——基于 Apache HttpClient)
  2. 创建 NamingClientProxy(HTTP 代理层)
  3. 创建 ConfigService(配置中心客户端,基于 HTTP 长轮询)
  4. 创建 NamingService(注册中心客户端,基于 HTTP 心跳/查询)
  • 1.x 客户端不建立任何长连接,所有请求走 HTTP
  • 各功能模块使用独立的 HTTP 通道:配置长轮询(所有配置合并到一个请求)、服务心跳(每实例独立请求)、服务查询(独立请求),无连接复用能力

[2.x/3.x 机制] gRPC 客户端初始化

  1. 创建 NacosRestTemplate(HTTP 客户端——降级用)
  2. 创建 NamingClientProxy 代理层(gRPC 优先)
  3. 尝试建立 gRPC 双向流长连接
     ├── 连接地址:{serverIp}:9848(HTTP 端口 8848 + 1000)
     ├── 发送 ConnectResetRequest 进行连接认证
     │   └── 携带 namespace、appName、clientId
     ├── 连接成功 → 后续所有操作走 gRPC 长连接(主通道)
     └── 连接失败 → 降级到 HTTP 协议(备用通道,兼容 1.x 通信)
  4. 创建 ConfigService(配置中心客户端,gRPC 监听)
  5. 创建 NamingService(注册中心客户端,gRPC 心跳/订阅)
  • 2.x/3.x 优先建立单一 gRPC 长连接,配置监听、心跳、服务订阅全部复用该连接
  • 3.x 继承 2.x 的 gRPC 初始化流程,无变化

4.3 注册中心的完整交互(按版本)

[1.x 机制] HTTP 注册 + 心跳 + 查询

Provider 1.x                    Nacos Server 1.x                Consumer 1.x
   │                                │                              │
   │  (1) HTTP POST 注册             │                              │
   │  /v1/ns/instance                │                              │
   │══════════════════════════════▶ │                              │
   │◀══════ HTTP 200 OK ───────────│                              │
   │                                │                              │
   │  (2) 每 5s HTTP PUT 心跳        │                              │
   │  /v1/ns/instance/beat          │                              │
   │══════════════════════════════▶ │                              │
   │◀══════ HTTP 200 OK ───────────│                              │
   │                                │                              │
   │                                │                              │  (3) HTTP GET 查询
   │                                │◀═════════════════════════════│  /v1/ns/instance/list
   │                                │══════════════════════════════▶│  返回实例列表
   │                                │                              │
   │                                │                              │  (4) 定时轮询检查变化
   │                                │                              │     (非实时)
   │  30s 无 HTTP 心跳 → 不健康     │                              │
   │  60s 无 HTTP 心跳 → 摘除       │                              │
   │                                │                              │

[2.x/3.x 机制] gRPC 长连接注册 + 心跳 + 订阅推送

Provider 2.x/3.x              Nacos Server 2.x/3.x             Consumer 2.x/3.x
   │                                │                              │
   │  (1) 建立 gRPC 双向流长连接      │  (5) 建立 gRPC 双向流长连接     │
   │════════════════════════════▶  │◄══════════════════════════════│
   │◀════════════════════════════│══════════════════════════════▶│
   │                                │                              │
   │  (2) gRPC InstanceRequest      │                              │
   │════════════════════════════▶  │                              │
   │                                │  (a) 写入注册表               │
   │                                │  (b) Distro 同步集群节点       │
   │  (3) 注册成功 ◀══════════════│                              │
   │                                │                              │
   │  (4) 每 5s gRPC 心跳            │                              │
   │  (复用同一长连接)               │                              │
   │════════════════════════════▶  │                              │
   │◀══════ 响应 ─────────────────│                              │
   │                                │                              │
   │                                │  (6) gRPC SubscribeService   │
   │                                │◀═════════════════════════════│
   │                                │                              │
   │                                │  (7) 首次返回全量实例列表       │
   │                                │══════════════════════════════▶│
   │                                │                              │
   │                                │  (8) 实例变更时主动推送        │
   │  实例变化时                     │  gRPC NotifySubscriber       │
   │ (上线/下线/健康变化)            │══════════════════════════════▶│
   │                                │                              │
   │  30s 无心跳 → 不健康           │                              │
   │  60s 无心跳 → 摘除             │                              │
   │                                │                              │

4.4 通讯端口说明(按版本)

端口 协议 用途 引入版本 说明
8848 HTTP 管理控制台、HTTP API 1.x 起 所有版本均存在
9848 gRPC 客户端 gRPC 请求端口(8848 + 1000) 2.x 开始 1.x 无此端口
9849 gRPC 集群节点间 gRPC 通信(8848 + 1001) 2.x 开始 1.x 无此端口
7848 HTTP 集群 JRAFT 选举通信 2.x 开始 1.x 使用 Raft 在 8848

版本差异小结:

端口数量 Nacos 1.x Nacos 2.x Nacos 3.x
对外端口 1 个(8848) 2 个(8848 + 9848) 同 2.x
集群内部端口 0 个 1 个(7848) 同 2.x

5.1 Nacos 与 Eureka / Apollo 对比

对比项 Nacos Eureka Apollo
注册中心 ✔️ ✔️
配置中心 ✔️ ✔️
CAP AP(注册中心) AP CP(配置中心)
一致性协议 Distro + JRAFT(2.x/3.x)/ Raft(1.x) Peer to Peer 数据库
健康检查 1.x: HTTP 心跳 / 2.x+: gRPC 长连接 心跳
配置热更新 1.x: HTTP 长轮询 / 2.x+: gRPC 推送 ✔️ 长轮询
当前版本 2.5.x 稳定 / 3.x AI 原生 停维 活跃

5.2 版本演进对比:1.x vs 2.x vs 3.x

Nacos 经历了三个大版本迭代,从最初的微服务注册配置中心,发展到面向 AI 原生架构的一站式资源治理平台。

整体演进路线

版本 定位 发布年份 当前状态
Nacos 1.x 微服务注册配置中心 v1 2019 维护期(建议升级)
Nacos 2.x 微服务注册配置中心 v2 2022 当前主流稳定版(2.5.x 为最新稳定版)
Nacos 3.x AI 原生资源治理平台 2025 Beta 中(3.2.0 Beta),可预览

一、通信协议对比

维度 Nacos 1.x Nacos 2.x Nacos 3.x
配置中心协议 HTTP 长轮询(Pull) gRPC 双向流(Push)+ HTTP 降级 gRPC 双向流(增强)
注册中心协议 HTTP 心跳 gRPC 双向流长连接 gRPC 双向流长连接
连接模型 各功能独立 HTTP 通道(无复用) 多路复用单一 gRPC 长连接 继承 2.x 模型,连接管理更稳定
推送能力 无(纯 Pull) 服务端主动 Push 服务端主动 Push,延迟更低
端口数 1 个(8848) 3 个(8848 HTTP + 9848 gRPC + 7848 JRAFT) 同 2.x

二、存储架构对比

维度 Nacos 1.x Nacos 2.x Nacos 3.x
注册表存储 全内存 全内存 分级存储:热点数据内存 + 全量持久化
配置存储 MySQL/Derby MySQL/Derby 同 2.x(新增索引优化)
内存占用 降低约 75%
10万实例启动时间 ~180s ~180s ~12s(提升 15 倍)
查询 QPS ~12,000 ~12,000 ~15,000(提升 25%)
变更推送 P99 延迟 1~30s(轮询) ~150ms ~80ms(降低 47%)

三、功能特性对比

功能 Nacos 1.x Nacos 2.x Nacos 3.x
服务注册与发现 ✔️ 基础版 ✔️ gRPC 优化版 ✔️ 多维度分组
配置管理 ✔️ 基础版 ✔️ gRPC 推送 ✔️ 配置标签化
K8s Service 同步 ❌ 需第三方适配器 ❌ 需 nacos-sync ✔️ 原生支持
RBAC 权限 ✔️ 全局读写 ✔️ 命名空间/服务/配置级细粒度
鉴权默认开启 ✔️ 3.0 起默认开启
AI Registry ✔️ MCP/Agent/Prompt/Skill 四类
Nacos Copilot ✔️ 内置 AI 助手(3.2+)
控制台与引擎分离部署 ✔️ 支持独立升级
原生多维度分组 ✔️ 环境/可用区/版本/业务分组

四、部署与运维对比

维度 Nacos 1.x Nacos 2.x Nacos 3.x
Java 要求 Java 8+ Java 8+ Java 17+
集群一致性 Distro(AP)+ Raft(CP) Distro(AP)+ JRAFT(CP) 继承 2.x,性能优化
部署模式 一体机 一体机 一体机 / 仅服务发现 / 仅配置管理
一键安装 手动部署 手动部署 ✔️ nacos-setup 脚本
CLI 工具 ✔️ nacos-cli 命令行
升级注意 需改造客户端 SDK ⚠️ 需 Java 17+,数据库迁移,客户端 SDK 不兼容 2.x

五、如何选择

场景 推荐版本 理由
传统微服务,生产环境稳定优先 Nacos 2.5.x 最成熟稳定,Java 8 兼容,社区支持完善
存量集群从 1.x 升级 Nacos 2.5.x 无需改 Java 版本,过渡平滑
引入 AI 能力,存量 API 改造为 MCP Nacos 3.x MCP Registry 是刚需,支持 0 代码改造
大规模集群(10万+ 实例) Nacos 3.x 分级存储节省 75% 内存,启动快 15 倍
多租户权限管控严格 Nacos 3.x 细粒度 RBAC,默认开启鉴权
本地开发尝鲜新特性 Nacos 3.2 Beta AI Registry + Nacos Copilot 体验
生产环境从 2.x 升级到 3.x 等待 3.2 GA Beta 版本不建议直接上生产

注册中心常见问题

Q2:Nacos 集群挂了一个节点,客户端还能正常工作吗?**

1.x 机制:HTTP 请求自动切换到其他节点,客户端有本地快照保底。

2.x/3.x 机制:gRPC 连接断开后客户端自动重连到其他可用节点,行为基本一致。

**

Q3:临时实例和持久化实例怎么选?**

所有版本通用:绝大多数场景使用临时实例(默认)。持久化实例适用于服务节点固定、IP 不变且不希望被自动摘除的场景。

**

Q5:Distro 协议怎么保证最终一致性?**

1.x/2.x/3.x 通用原理:每个节点负责一部分数据,写入时先写本地,然后通过异步任务 DumpTask 批量同步给其他节点。同步失败会重试,网络恢复后数据最终一致。3.x 在此基础上适配了分级存储策略。

**

Q6:Nacos 1.x/2.x/3.x 面试中怎么回答版本选型?**

  • 如果项目在用 Nacos 1.x:说明正在升级到 2.x,因为 1.x 的 HTTP 机制没有连接复用能力,配置监听、服务心跳、服务查询各走独立通道,整体连接开销大;gRPC 是更优方案
  • 如果项目在用 Nacos 2.x:说明是当前主流的稳定选择,生产环境首选 2.5.x,性能满足绝大多数微服务场景
  • 如果项目在考虑 Nacos 3.x:说明团队有 AI 化转型的规划(MCP Registry、AI Agent 接入),但需注意 Java 17+ 的要求和 Beta 版本稳定性
  • 核心观点:版本选型本质是 "当前业务阶段 → 匹配版本能力",小规模稳定项目 2.x 足矣,大规模集群或 AI 场景才考虑 3.x

六、交互流程图总结(按版本)

[1.x 机制] HTTP 全链路

▼ 启动阶段 ▼

  应用启动
     ↓
  NacosClient 1.x 初始化
   ├─ 创建 HttpClients(Apache HttpClient)
   └─ 无长连接,所有请求走 HTTP

     ┌───────────────────┐
     │ 配置中心           │        ┌──────────────────┐
     │ HTTP 长轮询监听    │        │ 注册中心           │
     │ HTTP 拉取配置      │        │ HTTP 注册         │
     │ 存储本地快照       │        │ HTTP 心跳(5s)   │
     └───────────────────┘        └──────────────────┘


▼ 运行阶段 ▼

  配置中心线程                   注册中心线程
      │                             │
      ├── HTTP 长轮询(30s)         ├── HTTP 心跳(5s)
      ├── 有变更 → HTTP 拉取        ├── HTTP 定时查询实例列表
      ├── 无变更 → 继续下一轮        └── 断连 → 本地缓存保底
      └── 断连 → 本地快照保底


▼ 关闭阶段 ▼

  应用停机
      ├── HTTP 注销请求(注册中心)
      ├── 清理监听(配置中心)
      └── 关闭 HTTP 连接池

[2.x/3.x 机制] gRPC 全链路

▼ 启动阶段 ▼

  应用启动
     ↓
  NacosClient 2.x/3.x 初始化
   ├─ 创建 GrpcClient
   ├─ 发起 gRPC 连接握手(端口 9848)
   ├─ 连接成功 → 分配 clientId
   └─ 连接失败 → 降级到 HTTP(1.x 兼容模式)

     ┌───────────────────┐
     │ 配置中心           │        ┌──────────────────┐
     │ gRPC 监听(Push)  │        │ 注册中心           │
     │ 首次 gRPC 拉取     │        │ gRPC 注册         │
     │ 存储本地快照       │        │ gRPC 心跳(5s)   │
     └───────────────────┘        └──────────────────┘


▼ 运行阶段 ▼

  配置中心线程                   注册中心线程
      │                             │
      ├── 等待 gRPC Push            ├── gRPC 心跳(5s)
      ├── 收到 Push → 拉取 → 刷新   ├── 等待 gRPC NotifySubscriber
      ├── 无变更 → 零网络开销       ├── 有变更 → 更新本地缓存
      └── gRPC 断连 → HTTP 降级     └── gRPC 断连 → HTTP 降级


▼ 关闭阶段 ▼

  应用停机
      ├── gRPC 注销请求(注册中心)
      ├── 清理 gRPC 监听(配置中心)
      ├── 关闭 gRPC 连接(发送断开信号)
      └── 释放资源