文章目录
- 一、开篇:为什么注册中心是微服务的“第一块基石”
- 二、Nacos架构模型与核心概念
- 2.1 双内核架构:Naming + Config + AI Registry
- 2.2 核心概念
- 三、CAP理论与AP/CP切换机制
- 3.1 CAP理论的务实应用
- 3.2 Distro协议:服务发现的AP实现
- 3.3 Raft协议:配置中心的CP实现
- 四、服务注册表底层原理
- 4.1 临时实例 vs 永久实例
- 4.2 心跳保活机制
- 4.3 服务发现流程
- 五、2025版适配:关键变化与踩坑
- 5.1 破坏性变更:Bootstrap废弃
- 5.2 Nacos 3.0+默认开启鉴权
- 5.3 依赖配置
- 六、Nacos 3.1.1单机部署实战
- 6.1 环境准备
- 6.2 下载与解压
- 6.3 单机模式启动
- 6.4 验证启动成功
- 七、将service-user注册到Nacos
- 7.1 配置application.yml
- 7.2 启动服务并验证
- 7.3 通过API验证
- 八、踩坑指南
- 坑一:忘记配置 spring.config.import
- 坑二:控制台端口仍用8848访问
- 坑三:鉴权未配置导致注册失败
- 坑四:单机启动未加 -m standalone
- 坑五:JDK版本不匹配
- 九、课后作业
- 十、下节预告
- 🔗《最新版 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的名字是Naming andConfigurationService 的缩写,但从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环境中,默认注册的服务都是临时实例。改为永久实例的配置:
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中:
# 旧方式(2025.1.x中已废弃)spring:application:name:service-usercloud:nacos:config:server-addr:127.0.0.1:8848在2025.1.x中,不再支持bootstrap.yml和bootstrap.properties,必须使用spring.config.import:
# 新方式(2025.1.x必须使用)spring:application:name:service-userconfig: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,密码需要在首次使用时手动初始化。
在客户端侧,需要添加用户名和密码配置:
spring:cloud:nacos:username:nacospassword:你设置的密码踩坑提示:如果Nacos Server开启了鉴权但客户端未配置用户名密码,服务注册会返回403 Forbidden,错误信息为user not found!。
5.3 依赖配置
在service-user模块的POM中添加Nacos Discovery依赖:
<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官网下载页面选择稳定版本,下载二进制包:
# Linux/macOSwgethttps://github.com/alibaba/nacos/releases/download/3.1.1/nacos-server-3.1.1.zipunzipnacos-server-3.1.1.zip-d/opt/cd/opt/nacos# Windows# 下载 nacos-server-3.1.1.zip,解压到 D:\DevTools\nacos6.3 单机模式启动
Windows:
cd D:\DevTools\nacos\bin startup.cmd -m standaloneLinux/macOS:
cd/opt/nacos/binshstartup.sh-mstandalone-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 验证启动成功
# 查看启动日志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中:
server:port:8081spring:application:name:service-userconfig:import:-optional:nacos:service-user.yamlcloud:nacos:discovery:server-addr:127.0.0.1:8848namespace:publicgroup:DEFAULT_GROUPusername:nacospassword: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 启动服务并验证
cdservice-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验证
# 查询服务实例列表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课)