---
title: Nacos 核心机制（注册发现 + 配置中心）
type: concept
domain: microservice
tags: [microservice, nacos, spring-cloud, registry, config-center, ap-cp, raft, distro, heartbeat]
status: mastered
created: 2026-09-27
last_reviewed: 2026-09-27
method: feynman
related_questions:
  - "什么是Nacos，主要用来作什么？"
  - "Nacos的服务注册和服务发现的过程是怎么样的？"
related_knowledge:
  - ./registry-center-selection.md
  - ./microservice-architecture.md
  - ./microservice-communication.md
  - ./load-balancing.md
anki_cards: 8
interview_rounds:
  - "2026-09-27-round-1-Q4"
  - "2026-09-27-round-1-Q6"
---

# Nacos 核心机制（注册发现 + 配置中心）

> Nacos = 注册中心 + 配置中心二合一。最大亮点是 **AP/CP 双模式**：临时实例走 Distro（AP 异步），永久实例走 Raft（CP 强一致）。

## TL;DR（30 秒扫完）

- **定位**：Dynamic Naming and Configuration Service，阿里开源，Spring Cloud Alibaba 核心
- **两大功能**：服务注册发现 + 配置中心
- **AP/CP 双模式**（最大亮点）：临时实例 Distro（AP）+ 永久实例 Raft（CP）
- **心跳续约**：客户端 5s 发一次，Nacos 判 15s 不健康、30s 自动剔除
- **服务发现**：本地缓存 + 长轮询（1.x）/ gRPC 长连接（2.x）监听变化
- **集群部署**：至少 3 节点，外置 MySQL，端口 8848（HTTP）+ 9848/9849（gRPC）

## 关键结论

- **结论 A**：Nacos 最大差异化是 AP/CP 双模式，通过实例类型切换
- **结论 B**：临时实例靠心跳续约（推），永久实例靠服务端 check（拉）
- **结论 C**：客户端本地缓存是关键——Nacos 集群挂了服务还能通信
- **结论 D**：2.x 用 gRPC 长连接替代 1.x 的 HTTP 长轮询，性能提升 10 倍

## 完整讲解（费曼四步）

### STEP 1 · 概念

Nacos（**N**aming and **A**nd **Co**nfiguration **S**ervice）是阿里开源的动态服务发现和配置中心，把注册中心和配置中心合二为一。

### STEP 2 · 大白话

**Nacos 像公司前台 + 公告板**：
- 前台（注册中心）：员工（服务实例）来了登记，走的时候签退；其他员工想知道某个同事在哪，来前台问
- 公告板（配置中心）：公司政策、通知统一贴在公告板，变了主动推送给大家

### STEP 3 · 底层

**两大功能**：

**1. 服务注册与发现**

服务注册流程（4 步）：
1. **启动上报**：服务启动时通过 SDK 调 `NamingService.registerInstance()`，HTTP PUT `/nacos/v1/ns/instance`（2.x 是 gRPC），把 IP/端口/权重/metadata 上报给 Nacos
2. **集群同步**：临时实例走 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 用长轮询（30s 挂起等待变化）；2.x 用 gRPC 长连接主动 push
3. **负载均衡调用**：消费端从本地缓存里按轮询/随机/权重/一致性哈希选实例发起实际调用

**2. 配置中心**
- 三级结构：Namespace（环境隔离，dev/test/prod）→ Group（业务分组）→ DataId（具体配置文件）
- 多格式：properties/yml/json/toml
- 热更新：`@NacosValue(autoRefreshed=true)` 或 Spring Cloud 的 `@RefreshScope`
- 监听推送：1.x HTTP 长轮询（30s），2.x gRPC 长连接

**AP/CP 双模式（最大亮点）**：

| 实例类型 | 一致性 | 协议 | 健康检查 | 用途 |
|---------|--------|------|---------|------|
| 临时实例（默认） | AP | Distro（异步复制） | 客户端心跳推 | 无状态微服务实例 |
| 永久实例 | CP | Raft/JRaft（强一致） | 服务端主动 check | 数据库主库、有状态节点 |

**客户端本地缓存**（关键）：
- 客户端本地缓存 Nacos 数据（文件缓存）
- Nacos 集群挂了仍能读到最近一次的服务列表，实现降级
- 但新的实例变化感知不到、健康状态不更新

**版本演进**：
- **1.x**：HTTP 长轮询拉取配置，UDP 推送服务列表
- **2.x**：改为 gRPC 长连接（推送更快、开销更小），性能提升 10 倍；支持 Raft/JRaft 实现 CP 一致性；新增端口 9848/9849
- **3.x**：加入 Kubernetes 兼容、多租户治理、AI 推理服务注册

**生产部署建议**：
- 至少 3 节点集群
- 外置 MySQL 存元数据（不用内嵌 Derby）
- 客户端配置多个 Nacos 地址
- 监听端口：8848（HTTP）+ 9848/9849（gRPC）

### STEP 4 · 简化

> **口诀**：Nacos = 注册 + 配置二合一；临时实例 AP（Distro）+ 永久实例 CP（Raft）；心跳 5/15/30 三档；客户端本地缓存兜底。

## 常见误区（从面试记录提炼）

- **误区 1**：把注册中心功能说成"配置中心"（表述混乱）→ 正确：注册中心管实例，配置中心管配置，是两个独立功能
- **误区 2**：只说功能不讲"是什么"→ 正确：Nacos 全称 Dynamic Naming and Configuration Service
- **误区 3**：不知道 AP/CP 双模式→ 正确：这是 Nacos 相比 Eureka（纯 AP）和 ZK（纯 CP）最大的差异化
- **误区 4**："Nacos 挂了服务全挂" → 正确：客户端本地缓存兜底，服务还能通信，只是新变化感知不到

## 延伸追问（面试追问预演）

1. **Nacos 是 AP 还是 CP？**
   - 要点：都支持，取决于实例类型。临时实例用 Distro（AP），永久实例用 Raft（CP）。这是 Nacos 相比 Eureka/Zookeeper 的独特之处。
2. **Nacos 如何做高可用部署？**
   - 要点：至少 3 节点集群，客户端配置多地址；依赖 MySQL 或内嵌 Derby（生产必须外置 MySQL）；用 gRPC 端口（8848 主端口 + 2 个偏移端口 9848/9849）。
3. **Nacos 和 Eureka 有什么区别？**
   - 要点：Eureka 是纯 AP，Nacos 是 AP/CP 双模式；Eureka 无配置中心，Nacos 有；Eureka 客户端有自我保护机制，Nacos 通过健康检查；Nacos 支持配置中心，功能更全。
4. **Nacos 集群挂了，服务还能继续通信吗？**
   - 要点：可以，客户端本地有缓存，服务列表最近一次的快照能读；已建立的连接不受影响；只是新的实例变化感知不到，健康状态也不会更新。
5. **Nacos 1.x 和 2.x 的服务发现机制有什么区别？**
   - 要点：1.x 用 HTTP 长轮询（30s），2.x 用 gRPC 长连接推送，性能提升 10 倍；2.x 支持 Raft 强一致，1.x 只支持 Distro；2.x 端口多 9848/9849 两个 gRPC 端口。

## 速查表

```
Nacos = 注册中心 + 配置中心（Spring Cloud Alibaba 核心）
两大功能：服务注册发现 + 配置中心（Namespace/Group/DataId）
AP/CP 双模式：临时实例 Distro（AP）+ 永久实例 Raft（CP）
心跳机制：5s 发一次 → 15s 判不健康 → 30s 自动剔除
服务发现：本地缓存 + 长轮询（1.x）/ gRPC 推送（2.x）
热更新：@NacosValue(autoRefreshed) / @RefreshScope
部署：3 节点 + 外置 MySQL + 端口 8848/9848/9849
演进：1.x HTTP 长轮询 → 2.x gRPC 长连接（10x）→ 3.x K8s 兼容
```

## 关联题目（题库）

- [x] 《什么是Nacos，主要用来作什么？》—— 2026-09-27 Round 1 Q4, 评分 ⭐⭐⭐
- [x] 《Nacos的服务注册和服务发现的过程是怎么样的？》—— 2026-09-27 Round 1 Q6, 评分 ⭐

## 关联知识

- [微服务架构演进与特征](./microservice-architecture.md)
- [注册中心选型](./registry-center-selection.md)
- [微服务调用方式全景](./microservice-communication.md)
- [负载均衡与路由](./load-balancing.md)

## Anki 候选卡片

1. **正**：Nacos 全称和定位？**反**：Dynamic Naming and Configuration Service，注册中心 + 配置中心二合一，Spring Cloud Alibaba 核心
2. **正**：Nacos AP/CP 双模式怎么切换？**反**：临时实例（默认）走 Distro 协议（AP，异步复制）；永久实例走 Raft/JRaft（CP，强一致）
3. **正**：Nacos 临时实例的心跳机制具体数字？**反**：客户端每 5s 发一次心跳；Nacos 判 15s 不健康、30s 自动剔除
4. **正**：Nacos 服务发现流程 3 步？**反**：首次拉取（getInstances/subscribe）→ 监听变化（1.x 长轮询 30s 或 2.x gRPC push）→ 负载均衡调用
5. **正**：Nacos 客户端本地缓存为什么重要？**反**：Nacos 集群挂了仍能读缓存，服务发现降级不断；只是新的变化感知不到
6. **正**：Nacos 1.x vs 2.x 区别？**反**：1.x HTTP 长轮询 + UDP 推送；2.x gRPC 长连接（10x 性能提升）+ 支持 Raft CP；2.x 端口多 9848/9849
7. **正**：Nacos 生产部署要点？**反**：至少 3 节点 + 外置 MySQL（不用 Derby）+ 客户端配多地址 + 端口 8848（HTTP）+ 9848/9849（gRPC）
8. **正**：Nacos 配置中心三级结构？**反**：Namespace（环境隔离）→ Group（业务分组）→ DataId（具体配置文件）；热更新用 @NacosValue(autoRefreshed) 或 @RefreshScope

---

*最后更新：2026-09-27*
