配置管理基础
配置管理是 Nacos 的核心功能之一,本章介绍 Nacos 配置管理的核心概念和使用方法。
配置管理概述
在传统应用中,配置通常硬编码在代码中或放在配置文件里。这种方式存在以下问题:
- 修改配置需要重新部署:每次修改配置都需要重新打包、部署应用
- 多环境配置管理困难:开发、测试、生产环境的配置难以统一管理
- 配置变更难以追踪:无法记录配置的变更历史,难以回滚
- 配置分散:多个服务的配置分散在各处,难以集中管理
Nacos 配置中心解决了这些问题,提供了集中化、动态化的配置管理能力。
核心能力
- 动态配置:配置修改后实时推送到客户端,无需重启
- 配置版本管理:记录每次配置变更,支持回滚
- 灰度发布:支持配置的灰度推送
- 多环境隔离:通过命名空间实现环境隔离
- 配置监听:客户端可以监听配置变化
配置模型
数据模型
Nacos 的配置由三元组唯一确定:
Namespace(命名空间)+ Group(分组)+ Data ID(配置集ID)
┌─────────────────────────────────────────────────────────────────┐
│ Nacos 配置模型 │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Namespace(命名空间) │ │
│ │ ┌───────────────────────────────────────────────────┐ │ │
│ │ │ Group(分组) │ │ │
│ │ │ ┌─────────────────────────────────────────────┐ │ │ │
│ │ │ │ Data ID(配置集ID) │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ key1=value1 │ │ │ │
│ │ │ │ key2=value2 │ │ │ │
│ │ │ │ key3=value3 │ │ │ │
│ │ │ └─────────────────────────────────────────────┘ │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
命名空间(Namespace)
命名空间用于实现多环境、多租户的配置隔离。最常见的使用场景是区分不同环境:
dev:开发环境test:测试环境prod:生产环境
分组(Group)
分组用于对配置进行逻辑分类,例如:
DEFAULT_GROUP:默认分组DATABASE_GROUP:数据库配置MQ_GROUP:消息队列配置
Data ID
Data ID 是配置集的唯一标识。在 Spring Cloud 中,Data ID 的命名格式为:
${prefix}-${spring.profiles.active}.${file-extension}
例如:user-service-dev.yaml
创建配置
通过控制台创建
- 登录 Nacos 控制台
- 进入「配置管理」->「配置列表」
- 点击「+」创建配置
- 填写配置信息:
- Data ID:配置的唯一标识
- Group:配置所属分组
- 配置格式:支持 Properties、YAML、JSON、Text、XML
- 配置内容:具体的配置内容
通过 API 创建
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs" \
-d "dataId=user-service.yaml" \
-d "group=DEFAULT_GROUP" \
-d "content=spring:
datasource:
url: jdbc:mysql://localhost:3306/user_db
username: root
password: root"
Spring Cloud 集成
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置文件
在 bootstrap.yml 中配置 Nacos 配置中心:
spring:
application:
name: user-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: dev
group: DEFAULT_GROUP
file-extension: yaml
配置加载顺序
Spring Cloud Alibaba Nacos Config 会按以下顺序加载配置:
- 基础配置:
{application}.{file-extension} - 环境配置:
{application}-{profile}.{file-extension} - 共享配置:
shared-configs中配置的共享配置 - 扩展配置:
extension-configs中配置的扩展配置
后加载的配置会覆盖先加载的配置。
配置示例
假设有以下配置:
Data ID: user-service.yaml # 基础配置
Data ID: user-service-dev.yaml # 环境配置
Data ID: common.yaml # 共享配置
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
# 共享配置
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true
# 扩展配置
extension-configs:
- data-id: redis.yaml
group: DATABASE_GROUP
refresh: true
配置热更新
Nacos 支持配置的动态更新,配置修改后无需重启应用即可生效。
使用 @RefreshScope
在需要动态更新的 Bean 上添加 @RefreshScope 注解:
@RestController
@RefreshScope
public class ConfigController {
@Value("${app.config.title:Default Title}")
private String title;
@Value("${app.config.max-connections:100}")
private Integer maxConnections;
@GetMapping("/config")
public Map<String, Object> getConfig() {
Map<String, Object> result = new HashMap<>();
result.put("title", title);
result.put("maxConnections", maxConnections);
return result;
}
}
当 Nacos 中的配置发生变化时,带有 @RefreshScope 注解的 Bean 会被重新创建,注入最新的配置值。
使用 @NacosValue
@RestController
public class NacosConfigController {
@NacosValue(value = "${app.config.title}", autoRefreshed = true)
private String title;
@GetMapping("/nacos-config")
public String getTitle() {
return title;
}
}
配置监听
@Component
public class ConfigListener {
@NacosConfigListener(dataId = "user-service.yaml", groupId = "DEFAULT_GROUP")
public void onConfigChange(String newConfig) {
System.out.println("配置发生变化: " + newConfig);
}
}
配置版本管理
Nacos 会记录每次配置变更,支持查看历史版本和回滚。
查看历史版本
- 进入「配置管理」->「配置列表」
- 点击配置的「历史版本」
- 查看所有历史版本
回滚配置
- 进入历史版本列表
- 选择要回滚的版本
- 点击「回滚」
API 操作
# 获取配置历史版本
curl "http://127.0.0.1:8848/nacos/v1/cs/history?dataId=user-service.yaml&group=DEFAULT_GROUP&pageNo=1&pageSize=10"
# 回滚到指定版本
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=user-service.yaml&group=DEFAULT_GROUP&nid=123"
灰度发布
Nacos 支持配置的灰度发布,可以将新配置推送给部分实例进行验证。
通过控制台灰度发布
- 进入配置详情页
- 点击「灰度发布」
- 选择灰度实例(通过 IP 或标签筛选)
- 编辑灰度配置
- 发布灰度配置
灰度配置示例
# 原配置
app:
feature:
new-feature: false
# 灰度配置(仅对灰度实例生效)
app:
feature:
new-feature: true
多环境管理
使用命名空间隔离环境
# 开发环境配置
spring:
cloud:
nacos:
config:
namespace: dev
group: DEFAULT_GROUP
# 生产环境配置
spring:
cloud:
nacos:
config:
namespace: prod
group: DEFAULT_GROUP
使用 Profile 隔离环境
spring:
profiles:
active: dev
cloud:
nacos:
config:
file-extension: yaml
Nacos 会加载 user-service-dev.yaml 配置文件。
推荐方案
推荐结合命名空间和 Profile 使用:
- 使用命名空间隔离不同环境(dev/test/prod)
- 使用 Profile 区分同一环境下的不同配置(如不同的数据库)
配置最佳实践
1. 配置分类
将配置按功能模块分类:
DEFAULT_GROUP
├── user-service.yaml # 用户服务配置
├── order-service.yaml # 订单服务配置
├── common.yaml # 公共配置
DATABASE_GROUP
├── mysql.yaml # MySQL 配置
├── redis.yaml # Redis 配置
MQ_GROUP
├── kafka.yaml # Kafka 配置
├── rocketmq.yaml # RocketMQ 配置
2. 敏感配置加密
对于敏感配置(如密码),建议使用加密存储:
spring:
datasource:
password: ENC(加密后的密码)
使用 Jasypt 等加密工具进行加解密。
3. 配置变更通知
配置变更后,通过以下方式通知相关人员:
- 配置变更审计日志
- 钉钉/企业微信通知
- 配置变更审批流程
4. 配置备份
定期备份 Nacos 配置:
# 导出配置
curl "http://127.0.0.1:8848/nacos/v1/cs/configs?export=true&dataId=&group=&tenant=dev" -o config.zip
# 导入配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?import=true&tenant=dev" -F "[email protected]"
5. 配置格式规范
推荐使用 YAML 格式,具有更好的可读性:
# 数据库配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/user_db
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# Redis 配置
spring:
redis:
host: localhost
port: 6379
password:
database: 0
常见问题
1. 配置加载顺序问题
如果多个配置文件中有相同的配置项,后加载的会覆盖先加载的。可以通过调整配置加载顺序解决:
spring:
cloud:
nacos:
config:
extension-configs:
- data-id: base.yaml
order: 1
- data-id: override.yaml
order: 2
2. 配置不更新
检查以下几点:
- 是否添加了
@RefreshScope注解 - 配置的
refresh属性是否为true - 检查 Nacos Server 日志是否有推送记录
3. 配置加载失败
检查以下几点:
- Data ID 和 Group 是否正确
- 命名空间是否正确
- 配置格式是否正确
- 查看应用启动日志
4. 配置内容过长
Nacos 对配置内容有长度限制,如果配置过长,建议:
- 拆分为多个配置文件
- 使用配置引用
- 压缩配置内容
下一步
- 集群部署 - 学习 Nacos 集群部署