跳到主要内容

配置管理基础

配置管理是 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

创建配置

通过控制台创建

  1. 登录 Nacos 控制台
  2. 进入「配置管理」->「配置列表」
  3. 点击「+」创建配置
  4. 填写配置信息:
    • 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 会按以下顺序加载配置:

  1. 基础配置:{application}.{file-extension}
  2. 环境配置:{application}-{profile}.{file-extension}
  3. 共享配置:shared-configs 中配置的共享配置
  4. 扩展配置: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 会记录每次配置变更,支持查看历史版本和回滚。

查看历史版本

  1. 进入「配置管理」->「配置列表」
  2. 点击配置的「历史版本」
  3. 查看所有历史版本

回滚配置

  1. 进入历史版本列表
  2. 选择要回滚的版本
  3. 点击「回滚」

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 支持配置的灰度发布,可以将新配置推送给部分实例进行验证。

通过控制台灰度发布

  1. 进入配置详情页
  2. 点击「灰度发布」
  3. 选择灰度实例(通过 IP 或标签筛选)
  4. 编辑灰度配置
  5. 发布灰度配置

灰度配置示例

# 原配置
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 对配置内容有长度限制,如果配置过长,建议:

  • 拆分为多个配置文件
  • 使用配置引用
  • 压缩配置内容

下一步