文章目录
-
- 一、开篇:为什么注册中心是微服务的"第一块基石"
- 二、Nacos架构模型与核心概念
-
- [2.1 双内核架构:Naming + Config + AI Registry](#2.1 双内核架构:Naming + Config + AI Registry)
- [2.2 核心概念](#2.2 核心概念)
- 三、CAP理论与AP/CP切换机制
-
- [3.1 CAP理论的务实应用](#3.1 CAP理论的务实应用)
- [3.2 Distro协议:服务发现的AP实现](#3.2 Distro协议:服务发现的AP实现)
- [3.3 Raft协议:配置中心的CP实现](#3.3 Raft协议:配置中心的CP实现)
- 四、服务注册表底层原理
-
- [4.1 临时实例 vs 永久实例](#4.1 临时实例 vs 永久实例)
- [4.2 心跳保活机制](#4.2 心跳保活机制)
- [4.3 服务发现流程](#4.3 服务发现流程)
- 五、2025版适配:关键变化与踩坑
-
- [5.1 破坏性变更:Bootstrap废弃](#5.1 破坏性变更:Bootstrap废弃)
- [5.2 Nacos 3.0+默认开启鉴权](#5.2 Nacos 3.0+默认开启鉴权)
- [5.3 依赖配置](#5.3 依赖配置)
- [六、Nacos 3.1.1单机部署实战](#六、Nacos 3.1.1单机部署实战)
-
- [6.1 环境准备](#6.1 环境准备)
- [6.2 下载与解压](#6.2 下载与解压)
- [6.3 单机模式启动](#6.3 单机模式启动)
- [6.4 验证启动成功](#6.4 验证启动成功)
- 七、将service-user注册到Nacos
-
- [7.1 配置application.yml](#7.1 配置application.yml)
- [7.2 启动服务并验证](#7.2 启动服务并验证)
- [7.3 通过API验证](#7.3 通过API验证)
- 八、踩坑指南
-
- [坑一:忘记配置 spring.config.import](#坑一:忘记配置 spring.config.import)
- 坑二:控制台端口仍用8848访问
- 坑三:鉴权未配置导致注册失败
- [坑四:单机启动未加 -m standalone](#坑四:单机启动未加 -m standalone)
- 坑五:JDK版本不匹配
- 九、课后作业
- 十、下节预告
- [🔗《最新版 SpringCloud 2025 从入门到实战》系列课程导航](#🔗《最新版 SpringCloud 2025 从入门到实战》系列课程导航)

适配版本 :Nacos Server 3.1.1、Nacos Client 3.1.1、Spring Cloud Alibaba 2025.1.0.0、Spring Boot 4.0.8、Spring Cloud 2025.1.3、JDK 21
课程定位:注册中心阶段开篇,从架构原理到生产部署,完成第一个服务注册到Nacos的全流程
一、开篇:为什么注册中心是微服务的"第一块基石"
第5课结束时,我们拥有了一个完整的 microservice-platform 多模块工程,三个业务服务都能独立启动。但它们是孤立的 ------service-order 不知道 service-user 部署在哪台机器、哪个端口。在第4课的调用链路拆解中,我们默认"Nacos已经帮我们维护了服务清单",但那份清单从何而来、如何保持最新、实例上下线时消费者如何感知,这些问题一直没有回答。
注册中心就是回答这些问题的组件。没有它,微服务的"服务发现"能力无从谈起,后续的OpenFeign调用、Gateway路由、Sentinel集群限流全部无法落地。
Nacos在2025年的注册中心生态中占据绝对主导地位。Nacos 3.1.1于2025年11月26日发布,是当前生产环境推荐的稳定版本。更重要的是,Spring Cloud Alibaba 2025.1.0.0在Nacos集成方式上做了一次重大变更 :正式废弃了Spring Cloud Bootstrap,全面转向 spring.config.import 机制。如果你从旧版本迁移,这一步不改,服务根本连不上Nacos。
本课将从Nacos架构原理讲到生产部署,再从客户端适配讲到第一个服务注册成功。
二、Nacos架构模型与核心概念
2.1 双内核架构:Naming + Config + AI Registry
Nacos的名字是 Na ming and Co nfiguration Service 的缩写,但从3.0开始,它的核心能力扩展为三大模块。Nacos 3.0引入了全新的AI Registry模块,和传统的服务注册、配置管理并列,成为Nacos的三大核心能力之一。
┌──────────────────────────────────────────────────────────────┐
│ Client SDK │
│ 注册 / 发现 / 监听配置 / AI Registry │
└──────────────────────────────┬───────────────────────────────┘
│
┌──────────────────────────────┴───────────────────────────────┐
│ Nacos Server │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Naming 模块 │ │ Config 模块 │ │ AI Registry │ │
│ │ 服务注册 │ │ 配置管理 │ │ MCP/A2A 注册 │ │
│ │ 服务发现 │ │ 配置监听 │ │ Agent 端点 │ │
│ │ 健康检查 │ │ 配置推送 │ │ 批量注册 │ │
│ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │ │
│ ┌────────┴────────────────────┴────────────────────┴────────┐ │
│ │ Nacos Core │ │
│ │ 一致性协议 (Distro / Raft) · 集群管理 · AP/CP 切换 │ │
│ └──────────────────────────┬────────────────────────────────┘ │
│ │ │
│ ┌──────────────┴──────────────┐ │
│ │ MySQL (配置持久化) │ │
│ │ Raft Log (集群一致性) │ │
│ └─────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
本课及后续课程聚焦于Naming模块 (注册中心),第10-12课将深入Config模块(配置中心)。AI Registry模块是Nacos 3.x的新增能力,Spring Cloud Alibaba 2025.1.0.0暂未提供对应的客户端适配,本专栏不展开。
2.2 核心概念
服务(Service) :一个或一组软件功能的集合,通过服务名标识。在Spring Cloud中,spring.application.name 的值就是服务名。
实例(Instance) :服务的一个具体部署单元,包含IP、端口、权重、元数据等信息。一个服务可以有多个实例。
服务注册表(Service Registry) :Nacos Server端维护的服务实例清单,是服务发现的核心数据结构。注册表分为临时实例 和永久实例两种存储形态。
命名空间(Namespace) :最外层的逻辑隔离,通常用于区分开发、测试、生产环境。
分组(Group) :服务级别的隔离,默认分组为 DEFAULT_GROUP。
集群(Cluster) :同一服务实例的逻辑分组,用于机房级别的容灾隔离。
三、CAP理论与AP/CP切换机制
3.1 CAP理论的务实应用
CAP理论指出,分布式系统无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance),只能三选二。Nacos的设计哲学是 "能AP就AP,必须CP才CP" ------不同模块根据业务场景选择不同的一致性策略。
| 模块 | 一致性 | 协议 | CAP取舍 | 原因 |
|---|---|---|---|---|
| 服务发现 | 最终一致 | Distro(Nacos自研) | AP | 实例上下线频繁,多一个实例最多多一次失败重试,少一个实例最多少处理一段时间流量,短时间不一致对业务几乎无影响 |
| 配置管理 | 强一致 | Raft(JRaft实现) | CP | 配置值不一致会导致业务行为"飘"------部分节点收到新限流值100,部分节点还是1000,后果严重 |
Nacos 3.1.x的默认模式已调整为CP模式,而2.3.2 OEM版本默认为AP模式,升级时需要特别注意。
3.2 Distro协议:服务发现的AP实现
Distro是Nacos自研的AP一致性协议,核心思想非常务实:
责任分片 :每个Nacos节点只负责一部分服务实例的"权威数据"。例如3个节点,节点A负责 service-user 和 service-order,节点B负责 service-product,节点C负责 service-pay。客户端注册到任意节点,该节点先本地写入,再异步广播给其他节点。
本地写、异步同步:注册请求到达节点A后,A先完成本地注册并立即返回成功,然后异步将变更推送给节点B和C。这种"先返回、后同步"的模式保证了注册操作的低延迟。
最终一致:异步同步完成后,集群内所有节点对同一服务实例的视图最终一致。如果节点A在此期间宕机,它负责的实例数据由其他节点接管,重启后可重新拉取。
节点故障恢复:Distro的容错设计保证了单节点故障不会导致其负责的实例数据永久丢失。
3.3 Raft协议:配置中心的CP实现
配置管理使用JRaft(Raft协议的Java工程化实现),要求至少3个节点才能正常选举。写请求必须经过Leader,Follower收到写请求会转发给Leader。Leader将日志复制到多数派节点并确认后,才返回写入成功。配置最终持久化到MySQL,Raft只负责一致性协调,不负责存储。
生产提示 :Nacos配置中心不能使用2节点集群。Raft需要多数派选举,2节点无法形成有效的多数派,工程上是错误的。
四、服务注册表底层原理
4.1 临时实例 vs 永久实例
这是Nacos注册中心最核心的概念差异,底层实现机制完全不同。
临时实例 :注册后仅保存在服务端内存中的服务注册表(一个Map结构),不持久化到磁盘 。服务实例出现异常或下线后,Nacos将其从注册表中剔除。适合业务服务------服务下线后不需要在注册中心中继续可见。
永久实例 :不仅存在于服务注册表中,同时持久化到磁盘文件 。服务实例异常或下线后,Nacos只将其健康状态设置为"不健康",不会剔除。适合MySQL、Redis等基础设施服务------需要一直看到实例状态,即使异常也要能查看实时状态。
在Spring Cloud环境中,默认注册的服务都是临时实例。改为永久实例的配置:
yaml
spring:
cloud:
nacos:
discovery:
ephemeral: false # 默认为true(临时实例)
2.x的重要变化 :在1.x中,一个服务中可以同时存在临时实例和永久实例,由实例本身决定。在2.x及3.x中,临时/永久属性由服务决定,一个服务中的所有实例要么全部临时、要么全部永久。
4.2 心跳保活机制
临时实例:客户端定期向Nacos Server发送心跳包(默认间隔5秒)。Nacos Server在超过15秒未收到心跳后,将实例标记为不健康;超过30秒后,从注册表中剔除该实例。
永久实例:由Nacos Server主动探测(TCP探测或HTTP探测),不依赖客户端上报心跳。即使实例完全不可达,也只会标记为不健康,不会剔除。
4.3 服务发现流程
Consumer 启动
│
▼
从Nacos Server拉取目标服务的实例列表
│
▼
本地缓存实例列表(用于快速响应和容灾)
│
▼
订阅服务变更(建立gRPC长连接)
│
▼
当Provider实例上下线时,Nacos Server通过gRPC长连接推送变更
│
▼
Consumer 更新本地缓存,LoadBalancer使用最新列表
Nacos 2.x/3.x使用gRPC长连接进行服务变更推送,相比1.x的HTTP长轮询,实时性和性能大幅提升。客户端本地缓存在Nacos Server不可用时仍能继续提供实例列表,保证了一定的容灾能力。
五、2025版适配:关键变化与踩坑
5.1 破坏性变更:Bootstrap废弃
这是Spring Cloud Alibaba 2025.1.0.0最关键的变更。官方Release Notes明确说明:Remove bootstrap config support, use spring.config.import instead。
在旧版本中,Nacos配置中心的连接信息写在 bootstrap.yml 中:
yaml
# 旧方式(2025.1.x中已废弃)
spring:
application:
name: service-user
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
在2025.1.x中,不再支持 bootstrap.yml 和 bootstrap.properties ,必须使用 spring.config.import:
yaml
# 新方式(2025.1.x必须使用)
spring:
application:
name: service-user
config:
import:
- optional:nacos:service-user.yaml # 配置中心的配置
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
关键要点 :spring.config.import 的值格式为 optional:nacos:{dataId}。optional: 前缀表示如果配置不存在不报错,否则启动会因配置缺失而失败。
5.2 Nacos 3.0+默认开启鉴权
从Nacos 3.0.0开始,控制台鉴权功能默认启用 。首次启动时会提示输入3个鉴权相关配置(管理员用户名、密码、以及一个鉴权开关的确认)。默认用户名为 nacos,密码需要在首次使用时手动初始化。
在客户端侧,需要添加用户名和密码配置:
yaml
spring:
cloud:
nacos:
username: nacos
password: 你设置的密码
踩坑提示 :如果Nacos Server开启了鉴权但客户端未配置用户名密码,服务注册会返回 403 Forbidden,错误信息为 user not found!。
5.3 依赖配置
在 service-user 模块的POM中添加Nacos Discovery依赖:
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
版本由父POM中导入的Spring Cloud Alibaba BOM统一管理(2025.1.0.0),无需写版本号。该依赖会自动引入 nacos-client 3.1.1。
六、Nacos 3.1.1单机部署实战
6.1 环境准备
硬件要求:Nacos运行建议至少2C4G 60G的机器配置。
JDK要求:Nacos Server 3.1.1要求JDK 17+,推荐使用JDK 21。
6.2 下载与解压
从Nacos官网下载页面选择稳定版本,下载二进制包:
bash
# Linux/macOS
wget https://github.com/alibaba/nacos/releases/download/3.1.1/nacos-server-3.1.1.zip
unzip nacos-server-3.1.1.zip -d /opt/
cd /opt/nacos
# Windows
# 下载 nacos-server-3.1.1.zip,解压到 D:\DevTools\nacos
6.3 单机模式启动
Windows:
cmd
cd D:\DevTools\nacos\bin
startup.cmd -m standalone
Linux/macOS:
bash
cd /opt/nacos/bin
sh startup.sh -m standalone
-m standalone 表示单机模式运行(非集群模式)。如果不加此参数,Nacos会以集群模式启动,单机环境下会报错。
首次启动 :Nacos 3.x默认启用鉴权,启动时会提示输入管理员用户名和密码。按提示完成初始化后,控制台地址为 http://127.0.0.1:8080/index.html。
端口变化注意 :Nacos 3.0将控制台端口从8848分离 到8080,客户端通信仍使用8848。这是3.x的重要变化,不要再用
http://localhost:8848/nacos访问控制台。
6.4 验证启动成功
bash
# 查看启动日志
tail -f /opt/nacos/logs/start.out
# 预期输出末尾:
# Nacos started successfully in stand alone mode. use external storage
# Nacos Console started successfully
浏览器访问控制台,使用初始化时设置的用户名密码登录。
七、将service-user注册到Nacos
7.1 配置application.yml
在 service-user/src/main/resources/application.yml 中:
yaml
server:
port: 8081
spring:
application:
name: service-user
config:
import:
- optional:nacos:service-user.yaml
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
group: DEFAULT_GROUP
username: nacos
password: nacos
配置解析:
spring.application.name:服务名,在Nacos注册表中以此标识spring.config.import:2025.1.x强制要求的配置导入方式,指向Nacos配置中心的DataIdspring.cloud.nacos.discovery.server-addr:Nacos Server地址(8848是客户端通信端口)namespace和group:实例注册的命名空间和分组
7.2 启动服务并验证
bash
cd service-user
mvn spring-boot:run
启动日志中应出现:
[nacos-discovery] register instance success, serviceName: service-user, ip: 192.168.x.x, port: 8081
进入Nacos控制台 → 服务管理 → 服务列表,应能看到 service-user 服务,实例数为1,健康状态为"健康"。
7.3 通过API验证
bash
# 查询服务实例列表
curl "http://127.0.0.1:8848/nacos/v3/client/ns/instance/list?serviceName=service-user"
# 预期返回JSON包含实例的ip、port、healthy等信息
八、踩坑指南
坑一:忘记配置 spring.config.import
现象 :服务启动时报 No spring.config.import property has been defined。
原因 :2025.1.x强制要求 spring.config.import,即使暂时不连接配置中心也必须显式声明。
解决 :添加 spring.config.import: optional:nacos:service-user.yaml。如果暂不打算使用配置中心,可以加 optional: 前缀,但该行配置本身不能省略。
坑二:控制台端口仍用8848访问
现象 :浏览器访问 http://localhost:8848/nacos 显示404或连接失败。
原因:Nacos 3.0将控制台端口分离到8080。
解决 :访问 http://localhost:8080/index.html。
坑三:鉴权未配置导致注册失败
现象 :启动日志报 NacosException: user not found! 或 403。
原因:Nacos 3.x默认开启鉴权,客户端未提供用户名密码。
解决 :在 spring.cloud.nacos 下添加 username 和 password。
坑四:单机启动未加 -m standalone
现象 :启动日志报 Nacos Server did not start because dumpservice bean construction failure 或集群相关错误。
原因:未指定单机模式,Nacos尝试以集群模式启动。
解决 :使用 startup.sh -m standalone 或 startup.cmd -m standalone。
坑五:JDK版本不匹配
现象 :Nacos Server启动报 UnsupportedClassVersionError。
原因:Nacos 3.1.1要求JDK 17+,使用了JDK 8或11启动。
解决 :确保 JAVA_HOME 指向JDK 17或21。
九、课后作业
作业一:在本地部署Nacos 3.1.1单机版,完成控制台初始化,并记录控制台端口和客户端端口的差异。
作业二 :将 service-order 和 service-product 也注册到Nacos,观察服务列表中的三个服务。修改 service-user 的 server.port,重启后观察Nacos控制台中实例端口的更新。
作业三 :将 service-user 的实例改为永久实例 (ephemeral: false),手动停止服务后观察控制台中实例的状态变化(不健康但未被剔除),对比临时实例的行为差异。
作业四(进阶) :阅读Nacos官方文档中关于命名空间(Namespace) 的说明,在Nacos控制台创建一个名为 dev 的命名空间,将 service-user 注册到该命名空间下,验证 namespace 配置项的作用。
十、下节预告
第7课将进入微服务注册与发现完整实战 & 服务调用底层解析 。我们将把 service-order 作为消费者,通过Nacos发现 service-user 的实例列表,完成第一次跨服务的HTTP调用。内容包括生产者/消费者服务搭建、服务注册流程源码分析、客户端服务发现机制、心跳检测原理、服务列表缓存机制,以及完整的调用测试和日志链路分析。这是OpenFeign课程的前置基础------理解"发现"之后,第14课将学习"声明式调用"如何封装这一过程。
🔗《最新版 SpringCloud 2025 从入门到实战》系列课程导航
第一部分:微服务前置基础 & 新版环境搭建(第1-5课)
第二部分:注册中心核心(Nacos 最新版)(第6-9课)
第三部分:配置中心核心(Nacos配置中心)(第10-12课)
第四部分:服务通信核心(OpenFeign + LoadBalancer)(第13-16课)
第五部分:网关核心(SpringCloud Gateway 新版)(第17-20课)
第六部分:熔断、限流、降级(Sentinel 新版)(第21-24课)
第七部分:微服务监控、链路追踪、日志体系(第25-28课)
第八部分:微服务高阶特性 & 分布式核心能力(第29-31课)
第九部分:企业级完整项目实战 & 架构复盘(第32-35课)