第6课:Nacos核心原理 & 2025版适配SpringCloud环境搭建

文章目录

适配版本 :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配置中心的DataId
  • spring.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课)

相关推荐
海宇AI2 小时前
零信任架构实战:基于海宇学历核验版构建自动化高并发资信评估网关
人工智能·微服务·架构·自动化
EatFan3 小时前
Spring Boot 4 升级避坑指南:依赖变化、Undertow 弃用、4.0.5 补丁与 Java 25 虚拟线程落地
java·spring boot·微服务·虚拟线程·spring boot 4
需要82614 小时前
分布式事务:Seata AT/TCC/SAGA 的取舍与踩坑
java·spring boot·分布式·spring·spring cloud
无序的浪15 小时前
测试博客-基于微服务的在线判题系统
java·spring cloud·docker·微服务·测试·在线判题
天远Date Lab17 小时前
微服务架构实战:基于天远学历信息高级版构建自动化人才准入网关
人工智能·微服务·架构·自动化
troy12819 小时前
Java 技术栈全景指南:从基础到微服务的完整知识体系
java·开发语言·微服务
需要82620 小时前
MySQL MVCC 与事务隔离级别:从一条 update 看版本链
java·数据库·spring boot·mysql·spring cloud
阿狗童鞋1 天前
SpringBoot微服务实战指南
spring boot·后端·微服务
今年下半年1 天前
记录一次IBMS物联网项目的架构设计及技术栈应用
物联网·websocket·网络协议·tcp/ip·微服务·udp·kafka