第 15 章:Nacos 配置中心
学习目标
- 启动 Nacos Server
- 在 Nacos 控制台发布配置
- Spring Boot 动态读取 + 自动刷新
- 掌握 namespace / group / dataId 体系
一、Nacos 是什么
Nacos(Naming + Configuration Service)是阿里开源的服务发现 + 配置中心,Spring Cloud Alibaba 默认组件。
两个核心功能:
- 配置中心:集中管理配置,支持动态刷新
- 注册中心:服务注册与发现(下章讲)
二、安装
bash
docker run -d --name nacos \
-p 8848:8848 -p 9848:9848 \
-e MODE=standalone \
-e JVM_XMS=256m -e JVM_XMX=256m \
nacos/nacos-server:v2.3.1访问 http://localhost:8848/nacos,默认账号 nacos / nacos。
⚠️ 坑 1:Nacos 2.x 多了 9848 / 9849 端口(GRPC),记得开,不然客户端连不上。
三、核心概念
| 概念 | 含义 |
|---|---|
| Namespace | 命名空间,最强隔离(不同环境用不同 namespace) |
| Group | 分组,中等隔离(订单/支付/会员分组) |
| DataId | 配置集 ID,最细粒度(每个配置文件一份) |
经典实践:
text
namespace = dev / test / prod
group = DEFAULT_GROUP / ORDER_GROUP
dataId = application.yaml / order-service.yaml四、发布配置
在 Nacos 控制台:
- 创建 Namespace:
dev - 在
dev下新建配置:- DataId:
order-service.yaml - Group:
DEFAULT_GROUP - 配置内容:yaml
order: timeout: 5000 retry: 3
- DataId:
五、Spring Boot 整合
依赖
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>bootstrap.yml(注意是 bootstrap,不是 application)
yaml
spring:
application:
name: order-service
cloud:
nacos:
server-addr: localhost:8848
namespace: dev # 命名空间 ID
group: DEFAULT_GROUP
file-extension: yaml
refresh-enabled: true # ⚠️ 开启自动刷新⚠️ 坑 2:
spring-cloud-starter-alibaba-nacos-config必须用 bootstrap.yml,且加spring-cloud-starter-bootstrap依赖(Spring Cloud 2020+ 需要手动加)。
读取配置
java
@RestController
@RefreshScope // ⚠️ 关键注解,配置变更自动刷新
public class OrderController {
@Value("${order.timeout:3000}") // 默认值
private Integer orderTimeout;
@GetMapping("/timeout")
public Integer getTimeout() {
return orderTimeout;
}
}⚠️ 坑 3:不加
@RefreshScope,改 Nacos 配置不会生效(值是启动时缓存的)。
配置对象
java
@Data
@Component
@ConfigurationProperties(prefix = "order")
@RefreshScope
public class OrderProperties {
private Integer timeout;
private Integer retry;
}六、多环境管理
yaml
# bootstrap.yml
spring:
profiles:
active: dev
cloud:
nacos:
namespace: ${spring.profiles.active}启动时加 --spring.profiles.active=prod 自动切到 prod namespace。
⚠️ 坑 4:
namespace用命名空间 ID(不是名称),UUID 形式。在控制台"命名空间"页面复制。
七、配置监听
java
@NacosValue(value = "${order.timeout:3000}", autoRefreshed = true)
private Integer orderTimeout;
// 或者用 NacosConfigListener 监听变更
@NacosConfigListener(dataId = "order-service.yaml")
public void onChange(String newConfig) {
log.info("新配置:{}", newConfig);
}八、配置回滚
Nacos 控制台 → 配置列表 → "历史版本" → 一键回滚。
或者用 OpenAPI:
bash
curl -X POST "http://localhost:8848/nacos/v1/cs/history/config" \
-d "dataId=order-service.yaml&group=DEFAULT_GROUP&namespaceId=dev"九、注意事项
| 场景 | 建议 |
|---|---|
| 敏感配置(密码) | 用 Nacos 加密插件 / Vault,不要明文 |
| 配置变更审计 | 开启 Nacos 操作日志 |
| 大配置 | 拆分多个 DataId,按需加载 |
| 启动依赖配置 | 加 @DependsOn 或默认值,避免启动失败 |
⚠️ 坑 5:Nacos 配置强依赖网络,启动时连不上会启动失败。生产必须配
spring.cloud.nacos.config.timeout重试。
十、本章小结
| 要点 | 关键 |
|---|---|
| 三层隔离 | Namespace → Group → DataId |
| bootstrap.yml | 客户端配置入口 |
| @RefreshScope | 实现动态刷新 |
| 命名空间 | 用 ID 不是名称 |
| 多环境 | profiles + namespace 切换 |
| 启动失败 | Nacos 不可用会导致应用启动失败,生产必配重试 |
动手练习
- 用 Docker 启动 Nacos,创建
devnamespace - 发布
order-service.yaml,Spring Boot 应用读order.timeout - 改 Nacos 配置,验证
@RefreshScope自动刷新(看日志)
下一章:第 16 章:Nacos 注册中心 →