Nacos:微服务架构的“服务管家“与“配置中心“完全指南
第一部分:项目概览与核心功能
第一章:什么是 Nacos?
1.1 Nacos 的诞生与定位
Nacos(读音:/nɑ:kəʊs/)是 Dynamic Naming and Configuration Service 的首字母简称,翻译过来就是"动态命名与配置服务"。这是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。
用最简单的大白话说:Nacos = 注册中心 + 配置中心。
在微服务架构中,它就像是一个"服务管家",负责:
- 记录所有服务的地址(服务注册与发现)
- 管理所有服务的配置(配置中心)
- 监控服务的健康状态(健康检查)
- 协调服务之间的通信(服务治理)
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.yml或application.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 ID:
user-service-dev.yaml - Group:
DEFAULT_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 故障测试
测试场景:
- 停止一个节点,验证服务是否正常
- 停止两个节点,验证是否还能提供服务(AP 模式)
- 恢复节点,验证数据是否同步
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 - 心跳 QPS:
nacos_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 控制台看不到服务
排查步骤:
- 检查配置文件是否正确
- 检查 Nacos Server 是否启动
- 检查网络是否连通
- 查看应用日志
解决方案:
# 确认配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 确认地址正确
enabled: true # 确认开启服务发现
问题 2:配置无法动态刷新
现象:修改配置后,应用未生效
排查步骤:
- 检查是否添加了
@RefreshScope注解 - 检查配置的 Data ID 和 Group 是否正确
- 检查是否使用了
@Value或@ConfigurationProperties
解决方案:
// 确保添加 @RefreshScope
@RestController
@RefreshScope // 必须添加
public class ConfigController {
@Value("${app.feature.enabled}")
private boolean featureEnabled;
}
问题 3:找不到配置(404)
现象:启动时报错,找不到配置
排查步骤:
- 检查 Data ID 是否正确
- 检查 Group 是否正确
- 检查 Namespace 是否正确
- 在 Nacos 控制台确认配置是否存在
解决方案:
# 确认配置
spring:
cloud:
nacos:
config:
namespace: dev # 确认命名空间
group: DEFAULT_GROUP # 确认分组
file-extension: yaml # 确认文件格式
问题 4:集群无法选主
现象:集群启动后,无法选举 Leader
排查步骤:
- 检查
cluster.conf配置是否正确 - 检查节点间网络是否连通
- 检查端口是否开放(7848 端口)
- 查看日志
解决方案:
# 确认端口开放
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 升级步骤
- 备份数据:导出配置和数据库
- 停止服务:逐个停止 Nacos 节点
- 替换程序:下载新版本,替换程序文件
- 更新配置:更新配置文件(如有变化)
- 启动服务:逐个启动 Nacos 节点
- 验证功能:验证服务注册发现和配置管理
13.6.2 注意事项
- 禁止跨大版本升级:如 1.4 → 2.2,需先升级到 2.0
- 灰度升级:逐个替换节点,观察稳定性
- 回滚准备:准备好回滚方案,出现问题时快速回滚
结语
Nacos 作为阿里巴巴开源的微服务基础设施,凭借其"服务发现 + 配置管理"一体化的设计、强大的性能和丰富的功能,已成为国内微服务生态的事实标准之一。
本文从项目概览、技术原理、实战教程三个维度,全面介绍了 Nacos 的核心功能、架构设计、使用方法和最佳实践。希望通过本文,读者能够:
- 理解 Nacos 的核心价值:解决微服务架构中的服务发现和配置管理问题
- 掌握 Nacos 的技术原理:AP/CP 模式、一致性协议、数据模型
- 学会 Nacos 的实战应用:Spring Cloud 集成、生产环境部署、最佳实践
在实际使用中,建议:
- 从小规模开始:先在测试环境验证,再推广到生产环境
- 重视安全:开启鉴权、修改默认密码、不暴露公网
- 监控告警:建立完善的监控体系,及时发现问题
- 持续学习:关注 Nacos 社区动态,学习最佳实践
愿 Nacos 成为您微服务架构的得力助手,助力业务快速发展!
参考资料
更多推荐



所有评论(0)