第一部分:项目概览与核心功能

第一章:什么是 Nacos?

1.1 Nacos 的诞生与定位

Nacos(读音:/nɑ:kəʊs/)是 Dynamic Naming and Configuration Service 的首字母简称,翻译过来就是"动态命名与配置服务"。这是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台

用最简单的大白话说:Nacos = 注册中心 + 配置中心

在微服务架构中,它就像是一个"服务管家",负责:

  1. 记录所有服务的地址(服务注册与发现)
  2. 管理所有服务的配置(配置中心)
  3. 监控服务的健康状态(健康检查)
  4. 协调服务之间的通信(服务治理)

1.2 核心价值:解决什么问题?

在传统的单体应用架构中,所有功能都在一个应用里,不存在服务发现问题。但是当系统拆分成几十甚至上百个微服务后,就会面临两大核心问题:

问题一:服务之间如何找到对方?

想象一下,你有一个电商系统,拆分成了:

  • 用户服务
  • 订单服务
  • 商品服务
  • 支付服务
  • 库存服务

当订单服务需要调用库存服务时,它怎么知道库存服务的地址呢?

传统做法

  • 在配置文件里写死 IP 地址:inventory.service.url=http://192.168.1.100:8080
  • 问题:如果库存服务扩容到 3 台机器,或者某台机器挂了,就需要修改配置、重启服务

Nacos 的解决方案

  • 库存服务启动时,自动向 Nacos 注册:"我是库存服务,我的地址是 192.168.1.100:8080"
  • 订单服务需要调用时,问 Nacos:"库存服务在哪里?"
  • Nacos 回答:"库存服务有 3 个实例:192.168.1.100:8080, 192.168.1.101:8080, 192.168.1.102:8080"
  • 订单服务根据负载均衡策略选择一个调用
问题二:配置如何统一管理?

假设你有 50 个微服务,每个服务都有自己的配置文件:

  • 数据库连接配置
  • Redis 配置
  • 第三方 API 密钥
  • 功能开关

传统做法

  • 每个服务都有自己的 application.ymlapplication.properties
  • 修改配置需要:修改文件 → 重新打包 → 重新部署 → 重启服务
  • 问题:修改一次数据库密码,需要重启 50 个服务!

Nacos 的解决方案

  • 所有配置集中存储在 Nacos
  • 服务启动时从 Nacos 拉取配置
  • 修改配置后,Nacos 实时推送给所有服务
  • 无需重启服务,配置立即生效!

1.3 Nacos 的核心优势

相比传统的解决方案(如 Eureka + Spring Cloud Config),Nacos 有以下优势:

能力 Nacos 传统方案(Eureka + Config)
服务注册与发现 ✅ 原生支持 ✅(Eureka)
动态配置管理 ✅ 支持热更新、灰度发布 ❌(需配合 Bus)
可视化控制台 ✅ 内置 Web UI
多环境隔离 ✅ Namespace + Group ⚠️ 依赖 Profile
协议支持 HTTP / gRPC / Dubbo / DNS 仅 HTTP
社区活跃度 🌟 高(阿里背书) ⚠️ Eureka 已停更
性能 🌟 经受双十一考验 一般

一句话总结:Nacos 是一站式解决方案,功能更全、性能更强、使用更简单。


第二章:为什么需要 Nacos?

2.1 微服务架构的挑战

在微服务架构中,随着服务数量的增加,会面临以下挑战:

挑战 1:服务地址管理复杂
  • 硬编码问题:在代码或配置中写死服务地址,难以维护
  • 动态变化:服务实例会动态增减(扩容、缩容、故障转移)
  • 多环境:开发、测试、生产环境的服务地址不同
挑战 2:配置分散难以管理
  • 配置分散:每个服务都有自己的配置文件
  • 修改困难:修改配置需要重启服务
  • 一致性难保证:相同服务的不同实例配置可能不一致
挑战 3:服务健康状态难以监控
  • 故障发现慢:服务挂了,其他服务还在调用
  • 人工干预多:需要人工剔除故障实例

2.2 Nacos 的解决方案

Nacos 通过以下机制解决上述挑战:

解决方案 1:服务注册与发现
服务启动 → 向 Nacos 注册 → Nacos 记录服务地址
服务调用 → 向 Nacos 查询 → Nacos 返回健康实例列表
服务停止 → 向 Nacos 注销 → Nacos 移除服务地址
解决方案 2:动态配置管理
配置修改 → Nacos 存储新配置 → 推送给所有订阅的服务
服务收到推送 → 动态刷新配置 → 无需重启
解决方案 3:健康检查
服务实例 → 定期向 Nacos 发送心跳
Nacos → 超时未收到心跳 → 标记实例为不健康
服务调用 → Nacos 只返回健康实例

2.3 Nacos 与其他注册中心的对比

特性 Nacos Eureka Consul Zookeeper
一致性协议 AP + CP AP CP CP
配置中心
健康检查 主动 + 被动 被动 主动 主动
多语言支持 Java
管理界面
性能
学习曲线

说明

  • AP 模式:优先保证可用性,允许短暂的数据不一致(适合服务注册发现)
  • CP 模式:优先保证一致性,数据强一致(适合配置管理)
  • Nacos 独特之处:同时支持 AP 和 CP 模式

第三章:核心功能特性

3.1 服务发现与服务健康监测

3.1.1 服务注册

服务启动时,向 Nacos 注册自己的元数据信息:

// 示例:服务注册
@Service
public class UserService {

    @NacosInjected
    private NamingService namingService;

    public void registerService() throws NacosException {
        // 注册服务实例
        namingService.registerInstance(
            "user-service",           // 服务名
            "192.168.1.100",          // IP 地址
            8080,                     // 端口
            "DEFAULT"                 // 集群名称
        );
    }
}

注册信息包括

  • 服务名(Service Name)
  • IP 地址
  • 端口号
  • 集群名称
  • 权重(用于负载均衡)
  • 元数据(自定义信息)
3.1.2 服务发现

服务消费者从 Nacos 获取服务实例列表:

// 示例:服务发现
@Service
public class OrderService {

    @NacosInjected
    private NamingService namingService;

    public void callUserService() throws NacosException {
        // 获取用户服务的所有实例
        List<Instance> instances = namingService.getAllInstances("user-service");

        // 选择一个实例进行调用(负载均衡)
        Instance instance = selectInstance(instances);

        // 发起 RPC 调用
        String url = "http://" + instance.getIp() + ":" + instance.getPort() + "/api/user";
        // ...
    }
}
3.1.3 健康检查

Nacos 提供多种健康检查方式:

方式一:客户端心跳(临时实例)

  • 服务实例定期向 Nacos 发送心跳
  • 默认心跳间隔:5 秒
  • 超时时间:15 秒(3 个心跳周期)
  • 超时未收到心跳,标记为不健康

方式二:服务端主动检查(持久实例)

  • Nacos 主动向服务实例发起健康检查
  • 支持 TCP、HTTP、MySQL 等多种检查方式
# 配置健康检查
spring:
  cloud:
    nacos:
      discovery:
        heart-beat:
          interval: 5000    # 心跳间隔(毫秒)
          timeout: 15000    # 超时时间(毫秒)

3.2 动态配置服务

3.2.1 配置管理

Nacos 提供集中式的配置管理:

# bootstrap.yml 配置
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: dev          # 命名空间
        group: DEFAULT_GROUP    # 分组
        file-extension: yaml    # 配置文件格式
3.2.2 动态配置刷新

配置变更后,自动推送给服务,无需重启:

// 示例:动态配置
@RestController
@RefreshScope  // 开启动态刷新
public class ConfigController {

    @Value("${app.feature.enabled:false}")
    private boolean featureEnabled;

    @Value("${app.timeout:3000}")
    private int timeout;

    @GetMapping("/config")
    public Map<String, Object> getConfig() {
        Map<String, Object> config = new HashMap<>();
        config.put("featureEnabled", featureEnabled);
        config.put("timeout", timeout);
        return config;
    }
}

说明

  • @RefreshScope:Spring Cloud 原生注解,支持配置动态刷新
  • @Value:注入配置值
  • 配置变更后,自动重新注入新值
3.2.3 配置版本管理

Nacos 提供配置版本管理功能:

  • 历史版本:保留配置的历史版本,支持回滚
  • 灰度发布:先对部分实例生效,验证后再全量发布
  • 配置对比:对比不同版本的配置差异

3.3 动态 DNS 服务

Nacos 可以作为 DNS 服务器使用:

# 通过 DNS 方式发现服务
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/service/dns?serviceName=user-service'

优势

  • 支持权重路由
  • 实现中间层负载均衡
  • 消除对厂商私有 API 的依赖

3.4 服务及其元数据管理

Nacos 提供服务元数据管理能力:

// 示例:服务元数据
Instance instance = new Instance();
instance.setServiceName("user-service");
instance.setIp("192.168.1.100");
instance.setPort(8080);

// 设置元数据
Map<String, String> metadata = new HashMap<>();
metadata.put("version", "v2.0");
metadata.put("env", "prod");
metadata.put("zone", "cn-east-1");
instance.setMetadata(metadata);

// 注册服务
namingService.registerInstance(instance);

元数据用途

  • 服务版本管理
  • 灰度发布
  • 流量路由
  • 故障隔离

3.5 MCP 服务管理(Nacos 3.0 新特性)

Nacos 3.0 新增了对 MCP(Model Context Protocol) 的支持,这是面向 AI Agent 应用的服务管理能力:

3.5.1 存量 API 转换为 MCP 服务

通过简单的声明,将现有的 HTTP/RPC 服务转换为 MCP 服务:

# 声明式配置
mcp:
  service:
    name: user-mcp-service
    source:
      type: http
      url: http://user-service/api
    tools:
      - name: getUser
        description: 获取用户信息
        parameters:
          - name: userId
            type: string
            description: 用户ID
3.5.2 MCP 服务自动注册

使用 Spring AI Alibaba 或 Nacos MCP SDK 自动注册 MCP 服务:

// 示例:MCP 服务注册
@McpService(name = "user-mcp-service")
public class UserMcpService {

    @McpTool(description = "获取用户信息")
    public User getUser(@McpParam(description = "用户ID") String userId) {
        // 业务逻辑
        return userService.getById(userId);
    }
}

第四章:应用情况与成果

4.1 生产环境应用

4.1.1 阿里巴巴内部应用

Nacos 在阿里巴巴集团内部大规模应用:

  • 服务规模:支撑数百万服务实例
  • 调用量:单日数十亿次服务调用
  • 稳定性:经受双十一流量洪峰考验
  • 历史:脱胎于阿里巴巴内部产品,历经 10 年生产验证
4.1.2 开源社区应用

自 2018 年开源以来,Nacos 已被广泛采用:

  • GitHub Stars:30,000+
  • 下载量:数百万次
  • 企业用户:覆盖金融、电商、物流、教育等多个行业
  • 生态集成:Spring Cloud Alibaba、Dubbo、Kubernetes 等

4.2 典型应用场景

场景一:电商系统
用户服务 → Nacos → 订单服务
商品服务 → Nacos → 库存服务
支付服务 → Nacos → 物流服务

价值

  • 服务自动发现,无需硬编码
  • 配置统一管理,动态调整促销策略
  • 健康检查,自动剔除故障实例
场景二:金融系统
账户服务 → Nacos → 交易服务
风控服务 → Nacos → 清算服务

价值

  • 多环境隔离(开发、测试、生产)
  • 配置加密存储,保障安全
  • 灰度发布,降低风险
场景三:AI 应用(Nacos 3.0)
AI Agent → Nacos → MCP 服务
LLM 服务 → Nacos → 工具服务

价值

  • MCP 服务统一管理
  • AI Agent 服务发现
  • 工具服务动态注册

4.3 成果与荣誉

  • FAST 2025 最佳论文奖(相关研究)
  • Spring Cloud Alibaba 核心组件
  • Apache Dubbo 生态组件
  • CNCF 云原生全景图收录

第二部分:技术原理与体系架构

第五章:核心架构设计

5.1 整体架构

Nacos 采用分层架构设计,从上到下分为以下几层:

┌─────────────────────────────────────────┐
│           客户端层(Client)              │
│   SDK、OpenAPI、Agent、DNS              │
├─────────────────────────────────────────┤
│           接入层(Access)                │
│   负载均衡、路由、限流                    │
├─────────────────────────────────────────┤
│         核心服务层(Core Service)        │
│   Naming Service | Config Service       │
├─────────────────────────────────────────┤
│       一致性协议层(Consistency)         │
│   Distro(AP) | Raft(CP)              │
├─────────────────────────────────────────┤
│         存储层(Storage)                 │
│   MySQL | Derby | 本地缓存               │
└─────────────────────────────────────────┘

5.2 核心组件详解

5.2.1 Naming Service(服务发现模块)

职责

  • 服务注册:接收服务实例的注册请求
  • 服务发现:提供服务实例列表查询
  • 健康检查:监控服务实例健康状态
  • 服务元数据管理:管理服务的元数据信息

核心类

// NamingService 核心接口
public interface NamingService {
    // 注册服务实例
    void registerInstance(String serviceName, Instance instance);

    // 注销服务实例
    void deregisterInstance(String serviceName, Instance instance);

    // 获取服务实例列表
    List<Instance> getAllInstances(String serviceName);

    // 获取健康的服务实例列表
    List<Instance> selectInstances(String serviceName, boolean healthy);
}
5.2.2 Config Service(配置管理模块)

职责

  • 配置管理:配置的增删改查
  • 配置推送:配置变更后推送给客户端
  • 配置版本管理:历史版本、回滚
  • 配置监听:客户端监听配置变更

核心类

// ConfigService 核心接口
public interface ConfigService {
    // 获取配置
    String getConfig(String dataId, String group, long timeoutMs);

    // 发布配置
    boolean publishConfig(String dataId, String group, String content);

    // 删除配置
    boolean removeConfig(String dataId, String group);

    // 添加配置监听器
    void addListener(String dataId, String group, Listener listener);
}
5.2.3 一致性协议层

Nacos 支持两种一致性协议:

Distro 协议(AP 模式)

  • 用于服务注册发现
  • 保证高可用性
  • 最终一致性

Raft 协议(CP 模式)

  • 用于配置管理
  • 保证强一致性
  • 基于 JRaft 实现
5.2.4 存储层

持久化存储

  • MySQL:生产环境推荐
  • Derby:嵌入式数据库,单机模式使用

缓存机制

  • 本地缓存:提升读取性能
  • 容灾目录:网络故障时使用本地数据

5.3 通信机制

5.3.1 HTTP 通信(Nacos 1.x)

Nacos 1.x 主要使用 HTTP 协议通信:

# 服务注册(HTTP)
POST /nacos/v1/ns/instance
?serviceName=user-service
&ip=192.168.1.100
&port=8080

# 服务发现(HTTP)
GET /nacos/v1/ns/instance/list
?serviceName=user-service

# 获取配置(HTTP)
GET /nacos/v1/cs/configs
?dataId=user-service.yaml
&group=DEFAULT_GROUP
5.3.2 gRPC 通信(Nacos 2.x)

Nacos 2.x 新增 gRPC 通信,提升性能:

端口说明

  • 8848:主端口(HTTP)
  • 9848:客户端 gRPC 端口(主端口 + 1000)
  • 9849:服务端 gRPC 端口(主端口 + 1001)
  • 7848:Raft 选举端口(主端口 - 1000)

优势

  • 长连接,减少连接开销
  • 二进制协议,传输效率高
  • 双向流,支持服务端推送

第六章:AP/CP 模式与一致性协议

6.1 CAP 理论基础

在分布式系统中,CAP 理论指出,一个分布式系统不可能同时满足以下三点:

  • C(Consistency):一致性,所有节点看到的数据是一致的
  • A(Availability):可用性,每个请求都能在合理时间内得到响应
  • P(Partition Tolerance):分区容错性,网络分区时系统仍能运行

实际选择:由于网络分区不可避免(P 必须满足),因此只能在 C 和 A 之间选择。

6.2 Nacos 的独特之处

Nacos 不是纯粹的 AP 服务,也不是纯粹的 CP 服务,而是同时支持两种模式

6.2.1 AP 模式(Distro 协议)

适用场景:服务注册发现(临时实例)

特点

  • 优先保证可用性
  • 允许短暂的数据不一致
  • 最终一致性

为什么服务发现选择 AP?

  • 服务发现对可用性要求极高
  • 短暂的数据不一致影响较小(客户端有本地缓存)
  • 服务实例可以通过心跳自动恢复
6.2.2 CP 模式(Raft 协议)

适用场景:配置管理、持久化服务实例

特点

  • 优先保证一致性
  • 数据强一致
  • 基于 Raft 协议

为什么配置管理选择 CP?

  • 配置数据必须一致,否则可能导致严重问题
  • 配置丢失或不一致比短暂不可用后果更严重

6.3 Distro 协议详解

Distro 是阿里巴巴自研的最终一致性协议,专为服务发现场景设计。

6.3.1 核心设计思想
每个节点负责一部分数据(分片)
每个节点将负责的数据同步给其他节点
定期发送校验值,保证最终一致性
6.3.2 工作流程

写操作流程

1. 客户端发送注册请求到节点 A
2. 节点 A 计算该数据属于哪个节点(假设是节点 B)
3. 如果是节点 A,直接处理;否则转发给节点 B
4. 节点 B 处理请求,写入本地
5. 节点 B 异步同步数据给其他节点
6. 返回响应给客户端

数据校验流程

1. 每个节点定期向其他节点发送校验请求
2. 校验请求包含:数据的校验值(如 checksum)
3. 接收节点对比校验值
4. 如果不一致,发起全量数据拉取

新节点加入流程

1. 新节点启动
2. 轮询所有现有节点,拉取全量数据
3. 只要有一个节点响应成功,即可完成初始化
4. 开始处理请求并参与数据同步
6.3.3 Distro vs Eureka
特性 Distro Eureka
数据分片 ✅ 每个节点负责部分数据 ❌ 所有节点存储全量数据
同步方式 权威节点同步 对等节点复制
性能 更高(减少冗余) 一般
一致性 最终一致 最终一致

6.4 Raft 协议详解

Raft 是经典的强一致性协议,Nacos 使用 JRaft 实现。

6.4.1 Raft 核心概念
  • Leader(领导者):处理所有写请求
  • Follower(跟随者):接收 Leader 的日志
  • Candidate(候选人):选举过程中的临时状态
6.4.2 工作流程

写操作流程

1. 客户端发送写请求到任意节点
2. 节点转发给 Leader
3. Leader 将操作写入日志
4. Leader 将日志复制到大多数节点(N/2 + 1)
5. 达到大多数后,Leader 提交日志
6. 返回响应给客户端

选举流程

1. Follower 在选举超时后变为 Candidate
2. Candidate 增加任期号,发起选举
3. 向其他节点发送选举请求
4. 收到大多数节点的投票,成为 Leader
5. 开始处理写请求
6.4.3 为什么选择 JRaft?
  • 成熟稳定:蚂蚁金服开源,经过大规模生产验证
  • Java 实现:与 Nacos 技术栈一致
  • 多 RaftGroup:支持数据分片,提升性能
  • 活跃社区:持续维护和优化

6.5 模式切换

6.5.1 如何选择模式?

通过 ephemeral 字段控制:

// Instance 类
public class Instance {
    /**
     * 是否为临时实例
     * true: 临时实例,使用 Distro 协议(AP)
     * false: 持久实例,使用 Raft 协议(CP)
     */
    private boolean ephemeral = true;
}
6.5.2 配置方式

Spring Cloud 配置

spring:
  cloud:
    nacos:
      discovery:
        # false 为永久实例(CP),true 为临时实例(AP)
        ephemeral: false

默认值

  • Nacos 1.x 和 2.x 默认都是 ephemeral = true(AP 模式)
  • 大多数场景推荐使用 AP 模式

第七章:服务注册发现原理

7.1 服务注册流程

7.1.1 完整流程图
服务启动
    ↓
初始化 Nacos Client
    ↓
构建注册请求(IP、端口、服务名等)
    ↓
发送注册请求到 Nacos Server
    ↓
Server 写入内存 + 持久化
    ↓
Server 同步数据到其他节点
    ↓
返回注册成功响应
    ↓
启动心跳线程(定期发送心跳)
7.1.2 代码示例
// Spring Cloud 自动注册
@SpringBootApplication
@EnableDiscoveryClient  // 开启服务发现
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

配置文件

spring:
  application:
    name: user-service  # 服务名
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  # Nacos Server 地址
        namespace: dev              # 命名空间
        group: DEFAULT_GROUP        # 分组
        service: ${spring.application.name}  # 服务名
7.1.3 注册信息

服务注册时,会携带以下信息:

{
  "serviceName": "user-service",
  "ip": "192.168.1.100",
  "port": 8080,
  "weight": 1.0,
  "enabled": true,
  "healthy": true,
  "ephemeral": true,
  "clusterName": "DEFAULT",
  "metadata": {
    "version": "v2.0",
    "env": "prod",
    "zone": "cn-east-1"
  }
}

7.2 服务发现流程

7.2.1 完整流程图
服务消费者启动
    ↓
初始化 Nacos Client
    ↓
订阅目标服务(如 user-service)
    ↓
从 Nacos Server 拉取服务实例列表
    ↓
缓存到本地
    ↓
建立长连接,监听服务变更
    ↓
服务变更时,Server 推送新列表
    ↓
更新本地缓存
7.2.2 服务发现方式

方式一:主动拉取

// 主动拉取服务列表
List<Instance> instances = namingService.getAllInstances("user-service");

方式二:订阅监听(推荐)

// 订阅服务变更
namingService.subscribe("user-service", new EventListener() {
    @Override
    public void onEvent(Event event) {
        if (event instanceof NamingEvent) {
            NamingEvent namingEvent = (NamingEvent) event;
            List<Instance> instances = namingEvent.getInstances();
            // 更新本地缓存
            updateLocalCache(instances);
        }
    }
});
7.2.3 本地缓存

服务消费者会缓存服务列表:

  • 首次拉取:启动时从 Nacos 拉取
  • 定期更新:定期从 Nacos 拉取最新列表
  • 推送更新:服务变更时,Nacos 主动推送
  • 容灾处理:Nacos 不可用时,使用本地缓存

7.3 健康检查机制

7.3.1 临时实例的健康检查

客户端心跳

服务实例 → 定期发送心跳 → Nacos Server
    ↓
Server 收到心跳 → 更新最后心跳时间
    ↓
超过 15 秒未收到心跳 → 标记为不健康
    ↓
超过 30 秒未收到心跳 → 剔除实例

心跳配置

spring:
  cloud:
    nacos:
      discovery:
        heart-beat:
          interval: 5000    # 心跳间隔(毫秒)
          timeout: 15000    # 超时时间(毫秒)
7.3.2 持久实例的健康检查

服务端主动检查

# 配置健康检查
nacos:
  health:
    check:
      enabled: true
      type: HTTP          # 检查类型:TCP、HTTP、MySQL
      url: /health        # HTTP 检查路径
      interval: 2000      # 检查间隔(毫秒)

检查类型

  • TCP:检查端口是否可连接
  • HTTP:发送 HTTP 请求,检查响应状态
  • MySQL:执行 SQL 查询,检查数据库连接

7.4 负载均衡

Nacos 支持多种负载均衡策略:

7.4.1 基于权重的负载均衡
// 设置实例权重
Instance instance = new Instance();
instance.setServiceName("user-service");
instance.setIp("192.168.1.100");
instance.setPort(8080);
instance.setWeight(2.0);  // 权重为 2,流量是普通实例的 2 倍

namingService.registerInstance(instance);
7.4.2 基于元数据的负载均衡
// 根据元数据选择实例
List<Instance> instances = namingService.selectInstances(
    "user-service",
    Collections.singletonMap("version", "v2.0"),  // 元数据过滤
    true  // 只返回健康实例
);

第八章:配置管理原理

8.1 配置模型

Nacos 的配置模型由三元组唯一确定:

配置 = Namespace + Group + Data ID
8.1.1 Namespace(命名空间)

作用:环境隔离

- dev(开发环境)
- test(测试环境)
- prod(生产环境)

配置

spring:
  cloud:
    nacos:
      config:
        namespace: dev  # 命名空间 ID
8.1.2 Group(分组)

作用:业务隔离

- DEFAULT_GROUP(默认分组)
- ORDER_GROUP(订单业务)
- USER_GROUP(用户业务)

配置

spring:
  cloud:
    nacos:
      config:
        group: ORDER_GROUP
8.1.3 Data ID(配置 ID)

格式

${prefix}-${spring.profiles.active}.${file-extension}

示例

user-service-dev.yaml    # 开发环境配置
user-service-test.yaml   # 测试环境配置
user-service-prod.yaml   # 生产环境配置

8.2 配置获取流程

8.2.1 完整流程图
服务启动
    ↓
读取 bootstrap.yml 配置
    ↓
连接 Nacos Server
    ↓
根据 Data ID、Group、Namespace 拉取配置
    ↓
合并到 Spring Environment
    ↓
启动应用
    ↓
监听配置变更
8.2.2 配置加载顺序
1. bootstrap.yml(本地配置)
2. Nacos 配置(远程配置)
3. application.yml(本地配置)

优先级:远程配置 > 本地配置

8.3 配置推送机制

8.3.1 推送流程
用户在 Nacos 控制台修改配置
    ↓
Nacos Server 保存新配置
    ↓
查找所有订阅该配置的客户端
    ↓
通过长连接推送配置变更
    ↓
客户端收到推送
    ↓
触发配置刷新事件
    ↓
重新加载配置到 Spring Bean
8.3.2 配置监听
// 配置监听示例
@Configuration
public class NacosConfigListener {

    @NacosConfigListener(dataId = "user-service.yaml", groupId = "DEFAULT_GROUP")
    public void onConfigReceived(String config) {
        System.out.println("收到配置变更:" + config);
        // 处理配置变更
    }
}

8.4 配置版本管理

8.4.1 历史版本

Nacos 保留配置的历史版本:

# 查看配置历史
GET /nacos/v1/cs/history?dataId=user-service.yaml&group=DEFAULT_GROUP
8.4.2 配置回滚
# 回滚到指定版本
POST /nacos/v1/cs/configs?dataId=user-service.yaml&group=DEFAULT_GROUP&content=...&id=123
8.4.3 灰度发布
# 创建 Beta 配置
POST /nacos/v1/cs/configs?dataId=user-service.yaml&group=DEFAULT_GROUP&content=...&betaIps=192.168.1.100,192.168.1.101

说明:Beta 配置只对指定 IP 生效,验证无误后再全量发布。


第九章:数据模型与核心概念

9.1 服务领域模型

Namespace(命名空间)
    └── Group(分组)
        └── Service(服务)
            └── Cluster(集群)
                └── Instance(实例)
9.1.1 Namespace(命名空间)

定义:用于隔离不同环境的配置和服务。

示例

  • public:默认命名空间
  • dev:开发环境
  • test:测试环境
  • prod:生产环境
9.1.2 Group(分组)

定义:用于隔离不同业务的服务和配置。

示例

  • DEFAULT_GROUP:默认分组
  • ORDER_GROUP:订单业务
  • USER_GROUP:用户业务
9.1.3 Service(服务)

定义:一个或一组软件功能,可被多个客户端重用。

属性

  • 服务名(Service Name)
  • 保护阈值(Protect Threshold)
  • 元数据(Metadata)
9.1.4 Cluster(集群)

定义:同一服务下的逻辑分组,通常对应一个机房或可用区。

示例

  • DEFAULT:默认集群
  • SH:上海机房
  • BJ:北京机房
9.1.5 Instance(实例)

定义:服务的一个具体运行实例。

属性

  • IP 地址
  • 端口号
  • 权重
  • 健康状态
  • 元数据

9.2 配置领域模型

Namespace(命名空间)
    └── Group(分组)
        └── Data ID(配置 ID)
            └── Content(配置内容)
9.2.1 配置信息
-- 配置表结构
CREATE TABLE config_info (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    data_id varchar(255) NOT NULL,
    group_id varchar(255) NOT NULL,
    content longtext NOT NULL,
    tenant_id varchar(128) DEFAULT '',  -- 命名空间
    ...
    PRIMARY KEY (id)
);
9.2.2 配置历史
-- 配置历史表
CREATE TABLE his_config_info (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    data_id varchar(255) NOT NULL,
    group_id varchar(255) NOT NULL,
    content longtext NOT NULL,
    tenant_id varchar(128) DEFAULT '',
    gmt_create datetime NOT NULL,
    ...
    PRIMARY KEY (id)
);

9.3 核心概念对比

概念 服务发现 配置管理
隔离维度 Namespace + Group Namespace + Group
标识 Service Name Data ID
数据 Instance 列表 Config Content
一致性 AP(Distro) CP(Raft)
变更通知 推送实例列表 推送配置内容

第三部分:使用教程与实战指南

第十章:快速开始

10.1 环境准备

10.1.1 系统要求
  • 操作系统:64 bit OS,支持 Linux/Unix/Mac/Windows
  • Java 环境:64 bit JDK 17+
  • 硬件配置:至少 2C4G 60G(推荐 4C8G)
10.1.2 下载 Nacos

方式一:官网下载

访问 Nacos 官网下载页面:Nacos Server 下载 | Nacos 官网

方式二:GitHub 下载

# 下载最新稳定版本
wget https://github.com/alibaba/nacos/releases/download/2.3.2/nacos-server-2.3.2.tar.gz

# 解压
tar -zxvf nacos-server-2.3.2.tar.gz

# 进入目录
cd nacos/bin

10.2 启动 Nacos

10.2.1 单机模式启动

Linux/Unix/Mac

# 启动命令(standalone 表示单机模式)
sh startup.sh -m standalone

Windows

# 启动命令
startup.cmd -m standalone

首次启动会提示设置鉴权配置

`nacos.core.auth.plugin.nacos.token.secret.key` is missing, please set: ${your_input_token_secret_key}

`nacos.core.auth.server.identity.key` is missing, please set: ${your_input_server_identity_key}

`nacos.core.auth.server.identity.value` is missing, please set: ${your_input_server_identity_value}

说明:请输入自定义的密钥和标识,确保所有节点一致。

10.2.2 验证启动

查看日志

# 进入日志目录
cd nacos/logs

# 查看启动日志
tail -f start.out

成功标志

Nacos started successfully in stand alone mode. use embedded storage
10.2.3 访问控制台

打开浏览器,访问:http://127.0.0.1:8848/nacos

  • 默认用户名:nacos
  • 默认密码:nacos(首次登录需要修改密码)

10.3 快速验证功能

10.3.1 服务注册
# 注册服务实例
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=quickstart.test.service&ip=127.0.0.1&port=8080'
10.3.2 服务发现
# 查询服务实例列表
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=quickstart.test.service'
10.3.3 发布配置
# 登录获取 access token
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/login' -d 'username=nacos' -d 'password=nacos'

# 发布配置(使用 access token)
curl -X POST 'http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=quickstart.test.config&group=DEFAULT_GROUP&content=HelloWorld' -H "accessToken:${your_access_token}"
10.3.4 获取配置
# 获取配置
curl -X GET 'http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=quickstart.test.config&group=DEFAULT_GROUP'

10.4 关闭 Nacos

Linux/Unix/Mac

sh shutdown.sh

Windows

shutdown.cmd

第十一章:Spring Cloud 集成实战

11.1 依赖配置

11.1.1 添加 Maven 依赖
<!-- Spring Cloud Alibaba BOM -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2022.0.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Nacos 配置中心 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

    <!-- Nacos 服务发现 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- Spring Cloud OpenFeign(服务间调用) -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
11.1.2 版本兼容性
Spring Cloud Alibaba Spring Cloud Spring Boot
2022.0.0.0 2022.0.0 3.0.0
2021.0.5.0 2021.0.5 2.6.13
2021.0.4.0 2021.0.4 2.6.11

重要:版本必须匹配,否则可能启动失败!

11.2 配置文件

11.2.1 bootstrap.yml(核心配置)
spring:
  application:
    name: user-service  # 应用名称
  cloud:
    nacos:
      # Nacos Server 地址
      server-addr: 127.0.0.1:8848

      # 配置中心配置
      config:
        namespace: dev              # 命名空间
        group: DEFAULT_GROUP        # 分组
        file-extension: yaml        # 配置文件格式
        refresh-enabled: true       # 开启自动刷新

      # 服务发现配置
      discovery:
        namespace: dev              # 命名空间
        group: DEFAULT_GROUP        # 分组
        service: ${spring.application.name}  # 服务名
        ephemeral: true             # 临时实例(AP 模式)
11.2.2 application.yml(本地配置)
server:
  port: 8080

spring:
  profiles:
    active: dev  # 激活的环境

11.3 服务注册与发现

11.3.1 启动类
@SpringBootApplication
@EnableDiscoveryClient  // 开启服务发现
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}
11.3.2 控制器
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // 业务逻辑
        return new User(id, "张三", 25);
    }
}
11.3.3 验证服务注册

启动应用后,访问 Nacos 控制台:http://127.0.0.1:8848/nacos

在"服务管理" → "服务列表"中,可以看到注册的服务。

11.4 服务调用(OpenFeign)

11.4.1 定义 Feign 客户端
// 订单服务调用用户服务
@FeignClient(name = "user-service")  // 服务名
public interface UserFeignClient {

    @GetMapping("/user/{id}")
    User getUser(@PathVariable("id") Long id);
}
11.4.2 使用 Feign 客户端
@Service
public class OrderService {

    @Autowired
    private UserFeignClient userFeignClient;

    public Order createOrder(Long userId) {
        // 调用用户服务
        User user = userFeignClient.getUser(userId);

        // 创建订单
        Order order = new Order();
        order.setUserId(userId);
        order.setUserName(user.getName());
        // ...
        return order;
    }
}
11.4.3 启用 Feign
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients  // 启用 Feign
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

11.5 动态配置管理

11.5.1 在 Nacos 中创建配置

在 Nacos 控制台创建配置:

  • Data IDuser-service-dev.yaml
  • GroupDEFAULT_GROUP
  • 配置格式YAML
  • 配置内容
app:
  feature:
    enabled: true
  timeout: 3000

database:
  url: jdbc:mysql://localhost:3306/user_db
  username: root
  password: password
11.5.2 使用配置
@RestController
@RefreshScope  // 开启动态刷新
public class ConfigController {

    @Value("${app.feature.enabled:false}")
    private boolean featureEnabled;

    @Value("${app.timeout:3000}")
    private int timeout;

    @GetMapping("/config")
    public Map<String, Object> getConfig() {
        Map<String, Object> config = new HashMap<>();
        config.put("featureEnabled", featureEnabled);
        config.put("timeout", timeout);
        return config;
    }
}
11.5.3 配置对象(推荐)
@Component
@ConfigurationProperties(prefix = "app")
@RefreshScope
@Data
public class AppConfig {
    private Feature feature;
    private int timeout;

    @Data
    public static class Feature {
        private boolean enabled;
    }
}

使用配置对象

@RestController
public class UserController {

    @Autowired
    private AppConfig appConfig;

    @GetMapping("/feature")
    public boolean isFeatureEnabled() {
        return appConfig.getFeature().isEnabled();
    }
}

11.6 配置监听

11.6.1 监听配置变更
@Component
public class ConfigChangeListener {

    @NacosConfigListener(dataId = "user-service-dev.yaml", groupId = "DEFAULT_GROUP")
    public void onConfigChange(String config) {
        System.out.println("配置变更了:" + config);
        // 处理配置变更
    }
}
11.6.2 监听特定配置项
@Component
public class FeatureConfigListener {

    @Value("${app.feature.enabled:false}")
    private boolean featureEnabled;

    @Bean
    @RefreshScope
    public ApplicationListener<RefreshEvent> refreshEventListener() {
        return event -> {
            System.out.println("配置刷新了,featureEnabled = " + featureEnabled);
        };
    }
}

第十二章:生产环境部署

12.1 部署架构

12.1.1 推荐架构
                    负载均衡器(Nginx/SLB)
                           ↓
        ┌──────────────────┼──────────────────┐
        ↓                  ↓                  ↓
   Nacos Node 1       Nacos Node 2       Nacos Node 3
        ↓                  ↓                  ↓
        └──────────────────┼──────────────────┘
                           ↓
                    MySQL 集群(主从)

说明

  • 至少 3 个节点:满足 Raft 选举条件
  • MySQL 持久化:保证数据不丢失
  • 负载均衡:统一入口,故障转移
12.1.2 端口规划
端口 偏移量 说明
8848 0 主端口(HTTP)
9848 +1000 客户端 gRPC 端口
9849 +1001 服务端 gRPC 端口
7848 -1000 Raft 选举端口

防火墙配置:开放 8848 和 9848 端口,其他端口仅内网开放。

12.2 数据库准备

12.2.1 创建数据库
-- 创建数据库
CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 创建用户
CREATE USER 'nacos'@'%' IDENTIFIED BY 'your_password';

-- 授权
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;
12.2.2 导入表结构

执行 Nacos 提供的 SQL 脚本:nacos/conf/mysql-schema.sql

mysql -u nacos -p nacos_config < nacos/conf/mysql-schema.sql

12.3 集群配置

12.3.1 配置集群节点

在每个 Nacos 节点上,编辑 conf/cluster.conf

# 格式:ip:port
192.168.1.101:8848
192.168.1.102:8848
192.168.1.103:8848
12.3.2 配置数据库连接

编辑 conf/application.properties

# 数据库配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.1.200:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=nacos
db.password.0=your_password

# 鉴权配置
nacos.core.auth.enabled=true
nacos.core.auth.console.enabled=true
nacos.core.auth.system.type=nacos
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security

重要

  • 所有节点的数据库配置必须一致
  • 所有节点的鉴权密钥必须一致
12.3.3 启动集群

在每个节点上执行:

# Linux/Unix/Mac
sh startup.sh

# Windows
startup.cmd

12.4 负载均衡配置

12.4.1 Nginx 配置
upstream nacos-cluster {
    server 192.168.1.101:8848;
    server 192.168.1.102:8848;
    server 192.168.1.103:8848;
}

server {
    listen 8848;
    server_name nacos.example.com;

    location / {
        proxy_pass http://nacos-cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
12.4.2 客户端配置
spring:
  cloud:
    nacos:
      server-addr: nacos.example.com:8848  # 使用域名或 VIP

12.5 高可用验证

12.5.1 验证集群状态

访问 Nacos 控制台,查看集群节点状态:

http://nacos.example.com:8848/nacos

在"集群管理"中,可以看到所有节点的状态。

12.5.2 故障测试

测试场景

  1. 停止一个节点,验证服务是否正常
  2. 停止两个节点,验证是否还能提供服务(AP 模式)
  3. 恢复节点,验证数据是否同步

12.6 Docker 部署

12.6.1 Docker Compose 配置
version: '3.8'

services:
  nacos1:
    image: nacos/nacos-server:v2.3.2
    container_name: nacos1
    environment:
      - MODE=cluster
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=your_password
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
      - NACOS_AUTH_IDENTITY_KEY=serverIdentity
      - NACOS_AUTH_IDENTITY_VALUE=security
    ports:
      - "8848:8848"
      - "9848:9848"
    depends_on:
      - mysql

  nacos2:
    image: nacos/nacos-server:v2.3.2
    container_name: nacos2
    environment:
      - MODE=cluster
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=your_password
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
      - NACOS_AUTH_IDENTITY_KEY=serverIdentity
      - NACOS_AUTH_IDENTITY_VALUE=security
    ports:
      - "8849:8848"
      - "9849:9848"
    depends_on:
      - mysql

  nacos3:
    image: nacos/nacos-server:v2.3.2
    container_name: nacos3
    environment:
      - MODE=cluster
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=your_password
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
      - NACOS_AUTH_IDENTITY_KEY=serverIdentity
      - NACOS_AUTH_IDENTITY_VALUE=security
    ports:
      - "8850:8848"
      - "9850:9848"
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=nacos_config
      - MYSQL_USER=nacos
      - MYSQL_PASSWORD=your_password
    ports:
      - "3306:3306"
    volumes:
      - ./mysql-data:/var/lib/mysql
      - ./nacos/conf/mysql-schema.sql:/docker-entrypoint-initdb.d/mysql-schema.sql
12.6.2 启动集群
docker-compose up -d

第十三章:最佳实践与避坑指南

13.1 安全最佳实践

13.1.1 绝不让 Nacos 暴露公网

错误做法

  • 直接将 Nacos 的 8848 端口开放到公网
  • 使用默认密码

正确做法

  • Nacos 仅部署在内网/VPC 中
  • 所有端口禁止对外暴露
  • 使用防火墙/安全组限制访问
13.1.2 开启鉴权
# 开启鉴权
nacos.core.auth.enabled=true
nacos.core.auth.console.enabled=true

# 设置强密钥
nacos.core.auth.plugin.nacos.token.secret.key=${自定义强密钥}
nacos.core.auth.server.identity.key=${自定义标识}
nacos.core.auth.server.identity.value=${自定义值}
13.1.3 修改默认密码
-- 修改管理员密码
UPDATE users SET password='$2a$10$...' WHERE username='nacos';

-- 创建只读用户
INSERT INTO users (username, password, enabled) VALUES ('readonly', '$2a$10$...', true);
INSERT INTO roles (username, role) VALUES ('readonly', 'ROLE_READONLY');
13.1.4 敏感配置加密
// 使用 Jasypt 加密配置
@Value("${db.password}")
private String encryptedPassword;

public String getPassword() {
    return AESUtil.decrypt(encryptedPassword);
}

13.2 性能优化

13.2.1 JVM 参数调优
# 启动脚本中设置 JVM 参数
JAVA_OPT="${JAVA_OPT} -Xms2g -Xmx2g -Xmn1g"
JAVA_OPT="${JAVA_OPT} -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
13.2.2 数据库优化
-- 创建索引
CREATE INDEX idx_data_id_group ON config_info(data_id, group_id);
CREATE INDEX idx_service_name ON instances(service_name);

-- 定期清理历史数据
DELETE FROM his_config_info WHERE gmt_create < DATE_SUB(NOW(), INTERVAL 30 DAY);
13.2.3 连接池优化
# 数据库连接池配置
db.pool.config.driverClassName=com.mysql.cj.jdbc.Driver
db.pool.config.initialSize=10
db.pool.config.minIdle=10
db.pool.config.maxActive=100
db.pool.config.maxWait=60000

13.3 监控与告警

13.3.1 Prometheus 监控

Nacos 暴露了 Prometheus 指标:

# prometheus.yml
scrape_configs:
  - job_name: 'nacos'
    static_configs:
      - targets: ['nacos1:8848', 'nacos2:8848', 'nacos3:8848']
13.3.2 关键指标
  • 服务注册数nacos_naming_service_count
  • 配置数nacos_config_count
  • 心跳 QPSnacos_naming_heartbeat_qps
  • 配置推送延迟nacos_config_push_latency
13.3.3 告警规则
groups:
  - name: nacos
    rules:
      - alert: NacosDown
        expr: up{job="nacos"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Nacos 节点宕机"

      - alert: NacosHighLoad
        expr: nacos_naming_heartbeat_qps > 10000
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Nacos 负载过高"

13.4 常见问题与解决方案

问题 1:服务未注册到 Nacos

现象:服务启动后,在 Nacos 控制台看不到服务

排查步骤

  1. 检查配置文件是否正确
  2. 检查 Nacos Server 是否启动
  3. 检查网络是否连通
  4. 查看应用日志

解决方案

# 确认配置
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  # 确认地址正确
        enabled: true                # 确认开启服务发现
问题 2:配置无法动态刷新

现象:修改配置后,应用未生效

排查步骤

  1. 检查是否添加了 @RefreshScope 注解
  2. 检查配置的 Data ID 和 Group 是否正确
  3. 检查是否使用了 @Value@ConfigurationProperties

解决方案

// 确保添加 @RefreshScope
@RestController
@RefreshScope  // 必须添加
public class ConfigController {

    @Value("${app.feature.enabled}")
    private boolean featureEnabled;
}
问题 3:找不到配置(404)

现象:启动时报错,找不到配置

排查步骤

  1. 检查 Data ID 是否正确
  2. 检查 Group 是否正确
  3. 检查 Namespace 是否正确
  4. 在 Nacos 控制台确认配置是否存在

解决方案

# 确认配置
spring:
  cloud:
    nacos:
      config:
        namespace: dev              # 确认命名空间
        group: DEFAULT_GROUP        # 确认分组
        file-extension: yaml        # 确认文件格式
问题 4:集群无法选主

现象:集群启动后,无法选举 Leader

排查步骤

  1. 检查 cluster.conf 配置是否正确
  2. 检查节点间网络是否连通
  3. 检查端口是否开放(7848 端口)
  4. 查看日志

解决方案

# 确认端口开放
telnet 192.168.1.101 7848
telnet 192.168.1.101 8848
telnet 192.168.1.101 9848
问题 5:配置数据丢失

现象:重启 Nacos 后,配置丢失

原因:使用了内嵌数据库(Derby)

解决方案:使用 MySQL 数据库持久化

# 配置 MySQL
spring.datasource.platform=mysql
db.url.0=jdbc:mysql://localhost:3306/nacos_config
db.user.0=nacos
db.password.0=your_password

13.5 备份与恢复

13.5.1 配置备份
# 导出配置
curl -X GET "http://nacos:8848/nacos/v1/cs/configs?export=true" -o config_export.zip

# 或者备份 MySQL 数据库
mysqldump -u nacos -p nacos_config > nacos_backup.sql
13.5.2 配置恢复
# 导入配置
curl -X POST "http://nacos:8848/nacos/v1/cs/configs?import=true" -F "file=@config_export.zip"

# 或者恢复 MySQL 数据库
mysql -u nacos -p nacos_config < nacos_backup.sql

13.6 版本升级

13.6.1 升级步骤
  1. 备份数据:导出配置和数据库
  2. 停止服务:逐个停止 Nacos 节点
  3. 替换程序:下载新版本,替换程序文件
  4. 更新配置:更新配置文件(如有变化)
  5. 启动服务:逐个启动 Nacos 节点
  6. 验证功能:验证服务注册发现和配置管理
13.6.2 注意事项
  • 禁止跨大版本升级:如 1.4 → 2.2,需先升级到 2.0
  • 灰度升级:逐个替换节点,观察稳定性
  • 回滚准备:准备好回滚方案,出现问题时快速回滚

结语

Nacos 作为阿里巴巴开源的微服务基础设施,凭借其"服务发现 + 配置管理"一体化的设计、强大的性能和丰富的功能,已成为国内微服务生态的事实标准之一。

本文从项目概览、技术原理、实战教程三个维度,全面介绍了 Nacos 的核心功能、架构设计、使用方法和最佳实践。希望通过本文,读者能够:

  1. 理解 Nacos 的核心价值:解决微服务架构中的服务发现和配置管理问题
  2. 掌握 Nacos 的技术原理:AP/CP 模式、一致性协议、数据模型
  3. 学会 Nacos 的实战应用:Spring Cloud 集成、生产环境部署、最佳实践

在实际使用中,建议:

  • 从小规模开始:先在测试环境验证,再推广到生产环境
  • 重视安全:开启鉴权、修改默认密码、不暴露公网
  • 监控告警:建立完善的监控体系,及时发现问题
  • 持续学习:关注 Nacos 社区动态,学习最佳实践

愿 Nacos 成为您微服务架构的得力助手,助力业务快速发展!


参考资料

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐