0%

使用Nacos配置中心

使用 Nacos 作为配置中心:动态配置管理的实现

Nacos 不仅是优秀的服务注册中心,还能作为配置中心替代 Spring Cloud Config,支持配置的动态更新、环境隔离、共享配置等功能。本文详细介绍如何使用 Nacos 实现配置中心的核心功能。

Nacos 配置中心的核心概念

在使用 Nacos 配置中心前,需理解三个核心概念,用于精确定位配置:

  • Data ID:配置集的唯一标识,格式为${prefix}-${spring.profiles.active}.${file-extension}
  • Group:配置分组,默认DEFAULT_GROUP,用于区分不同业务场景的配置;
  • Namespace:命名空间,默认public,用于隔离不同环境(如开发、测试、生产)。

快速集成 Nacos 配置中心

1. 引入依赖

在 Spring Boot 项目中添加 Nacos 配置中心依赖:

1
2
3
4
5
6
7
8
9
10
11
12
<!-- Spring Cloud Alibaba Nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<!-- 版本需与Spring Cloud Alibaba版本匹配 -->
</dependency>

<!-- 必要的Web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 配置 Nacos 连接信息

注意:Nacos 配置中心的配置需放在bootstrap.yml(或bootstrap.properties)中,因为配置中心的配置需要在应用启动早期加载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# bootstrap.yml
server:
port: 9001

spring:
application:
name: springcloudalibaba-provider-nacos # 服务名(对应Data ID的prefix)
profiles:
active: dev # 环境标识(对应Data ID的spring.profiles.active)
cloud:
nacos:
# 注册中心配置(可选,若同时作为注册中心)
discovery:
server-addr: localhost:8848
# 配置中心核心配置
config:
server-addr: localhost:8848 # Nacos配置中心地址
file-extension: yaml # 配置文件格式(支持yaml/properties)
# 可选:指定命名空间(环境隔离)
# namespace: dev-namespace
# 可选:指定分组(默认DEFAULT_GROUP)
# group: PROVIDER_GROUP
Data ID 的自动生成规则

根据上述配置,Nacos 会自动拼接 Data ID:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
即:springcloudalibaba-provider-nacos-dev.yaml

3. 在 Nacos 控制台创建配置

  1. 登录 Nacos 控制台(http://localhost:8848/nacos);

  2. 进入「配置管理」→「配置列表」,点击「+」新建配置:

    Nacos添加配置

    • Data IDspringcloudalibaba-provider-nacos-dev.yaml(按上述规则填写);

    • GroupDEFAULT_GROUP(默认,或自定义);

    • 配置格式:YAML;

    • 配置内容:

      1
      2
      3
      4
      config:
      value: "这是dev环境的配置"
      mysql:
      url: "jdbc:mysql://localhost:3306/dev_db"
  3. 点击「发布」保存配置。

4. 编写代码读取配置

通过@Value注解或@ConfigurationProperties读取 Nacos 中的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/config")
@RefreshScope // 启用配置自动刷新
public class ConfigController {

// 读取config.value配置
@Value("${config.value}")
private String configValue;

// 读取mysql.url配置
@Value("${mysql.url}")
private String mysqlUrl;

@GetMapping("/get")
public String getConfig() {
return "config.value: " + configValue + "<br>mysql.url: " + mysqlUrl;
}
}
  • @RefreshScope注解:启用配置自动刷新,当 Nacos 中的配置修改后,无需重启服务即可生效。

5. 测试配置读取与刷新

  1. 启动服务,访问 http://localhost:9001/config/get,应返回:

    1
    2
    config.value: 这是dev环境的配置
    mysql.url: jdbc:mysql://localhost:3306/dev_db
  2. 在 Nacos 控制台修改config.value的值(如改为 “这是更新后的 dev 配置”),点击「发布」;

  3. 再次访问上述接口,发现返回值已更新,证明自动刷新生效。

高级功能:共享配置与扩展配置

在微服务架构中,多个服务可能需要共用一些配置(如数据库连接、Redis 配置)。Nacos 支持通过shared-dataidsext-config配置共享配置。

1. 共享配置(shared-dataids)

适用于同一 Group 内的多个服务共享的配置:

1
2
3
4
5
6
7
8
9
10
11
# bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
# 共享配置(多个用逗号分隔)
shared-dataids: common-mysql.yaml,common-redis.yaml
# 配置是否自动刷新(默认false)
refreshable-dataids: common-mysql.yaml,common-redis.yaml
  • 在 Nacos 中创建common-mysql.yamlcommon-redis.yaml,配置内容为多个服务共用的参数;
  • refreshable-dataids指定哪些共享配置支持自动刷新。

2. 扩展配置(ext-config)

适用于不同 Group 的共享配置,支持自定义优先级(数组越靠后,优先级越高):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
# 扩展配置(数组形式,优先级从低到高)
ext-config:
# 第一个配置(低优先级)
- data-id: common-log.yaml
group: COMMON_GROUP
refresh: true # 支持自动刷新
# 第二个配置(高优先级,会覆盖低优先级同名配置)
- data-id: provider-log.yaml
group: PROVIDER_GROUP
refresh: true
  • 扩展配置的优先级高于共享配置,且后定义的配置会覆盖先定义的同名配置;
  • 可通过group指定不同分组,解决shared-dataids只能同组共享的限制。

配置优先级

Nacos 中配置的优先级从高到低为:
扩展配置(ext-config,后定义的优先) > 当前服务的专属配置 > 共享配置(shared-dataids) > 本地配置文件

  • 同名配置项,高优先级配置会覆盖低优先级;
  • 不同名配置项,会合并为一个完整的配置集。

环境隔离:命名空间(Namespace)

通过命名空间实现不同环境(如 dev、test、prod)的配置隔离:

  1. 在 Nacos 控制台创建命名空间:
    进入「命名空间」→「新建命名空间」,填写名称(如dev)和描述,生成唯一的namespaceId

  2. 在配置中指定命名空间:

    1
    2
    3
    4
    5
    6
    7
    # bootstrap.yml
    spring:
    cloud:
    nacos:
    config:
    server-addr: localhost:8848
    namespace: 36336f33-3f4a-4d8a-9f8e-2f7a809090f1 # 填写命名空间ID
  3. 在对应命名空间下创建配置:
    后续创建的配置会存储在指定命名空间,避免与其他环境的配置混淆。

常见问题与解决方案

  1. 配置不生效?
    • 检查配置是否放在bootstrap.yml中(而非application.yml);
    • 确认 Data ID、Group、Namespace 是否与配置一致;
    • 检查 Nacos 服务地址是否正确,服务是否已启动。
  2. 自动刷新不生效?
    • 确保类上添加了@RefreshScope注解;
    • 检查配置是否在refreshable-dataids中(共享配置);
    • 重启服务尝试(避免缓存影响)。
  3. 共享配置与专属配置冲突?
    • 利用优先级规则,高优先级配置会覆盖低优先级;
    • 避免不同配置中使用同名配置项,或明确优先级。

总结

Nacos 作为配置中心,通过 Data ID、Group、Namespace 实现了配置的精准定位和环境隔离,支持动态刷新、共享配置等高级功能,极大简化了微服务的配置管理。

相比 Spring Cloud Config,Nacos 的优势在于:

  • 配置实时推送,无需依赖 Git 或消息队列;
  • 支持可视化控制台,配置管理更直观;
  • 集成服务注册发现,减少组件依赖。

在实际项目中,建议结合命名空间和分组功能,规范配置管理,同时利用共享配置减少重复配置,提升开发效率

欢迎关注我的其它发布渠道