nacos — 配置管理

1. Nacos 配置管理简介

Nacos 不仅是一个服务注册与发现平台,还提供了功能强大的 配置管理 服务。Nacos 的配置管理能够帮助开发者集中管理配置,并支持动态更新,以简化微服务的配置变更过程,减少应用重启次数,确保应用实时响应配置变更。

Nacos 配置管理的主要功能:

  1. 集中管理配置:将分散的配置文件集中到 Nacos 进行管理。
  2. 动态刷新配置:支持在应用运行时更新配置,无需重启服务。
  3. 多环境支持:支持分环境管理配置,如开发、测试和生产环境等。
  4. 权限控制:提供权限管理和审计功能,保障配置的安全性。

2. 配置管理的基本概念

2.1 Data ID 和 Group

  • Data ID:用于标识配置的唯一标识符,相当于每一个配置文件的名称。
  • Group:配置的分组,用于区分不同的配置分类。例如可以将开发、测试、生产的配置划分到不同的 Group 中。

2.2 Namespace

Namespace(命名空间)用于隔离不同项目的配置。例如在同一个 Nacos 集群上可以配置多个项目,每个项目的配置通过 Namespace 隔离,互不影响。

2.3 配置文件格式

Nacos 支持多种配置格式,包括:

  • Properties 文件(常见的 key=value 格式)
  • YAML 文件(结构化的层级配置)
  • JSON 文件XML 文件

3. Nacos 配置管理的基本操作

3.1 在 Nacos 控制台添加配置

  1. 打开 Nacos 控制台,在“配置管理”菜单下选择“配置列表”。
  2. 点击“新增配置”,填写以下信息:
    • Data ID:配置的唯一标识符,例如 application-dev.yml
    • Group:配置所属的分组,例如 DEV(开发环境)。
    • 配置格式:例如 YAML。
    • 配置内容:填写具体的配置项,例如数据库连接配置等。

3.2 修改和删除配置

  • 修改配置:在配置列表中找到需要修改的配置项,点击编辑,更新配置内容并保存。Nacos 会自动通知依赖该配置的服务更新。
  • 删除配置:在配置列表中选择需要删除的配置项,点击删除按钮,配置将被彻底清除。

3.3 配置历史版本管理

Nacos 提供配置的历史版本管理功能,可以查看每次变更记录,并支持回滚到之前的版本,方便错误配置的恢复。

4. 配置共享

我们可以把微服务共享的配置抽取到Nacos中统一管理,这样就不需要每个微服务都重复配置了。分为两步:

  • 在Nacos中添加共享配置

  • 微服务拉取配置

4.1 添加共享配置

例如jdbc相关配置、日志配置、swagger以及OpenFeign的配置等。

4.2 拉取共享配置

接下来,我们要在微服务拉取共享配置。将拉取到的共享配置与本地的application.yaml配置合并,完成项目上下文的初始化。

不过,需要注意的是,读取Nacos配置是SpringCloud上下文(ApplicationContext)初始化时处理的,发生在项目的引导阶段。然后才会初始化SpringBoot上下文,去读取application.yaml

也就是说引导阶段,application.yaml文件尚未读取,根本不知道nacos 地址,该如何去加载nacos中的配置文件呢?

SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml(或者bootstrap.properties)的文件,如果我们将nacos地址配置到bootstrap.yaml中,那么在项目引导阶段就可以读取nacos中的配置了。

4.2.1 引入依赖

  <!--nacos配置管理-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>
  <!--读取bootstrap文件-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>

4.2.2 新建bootstrap.yaml

配置nacos地址和相关的共享配置。

spring:
  application:
    name: cart-service # 应用的服务名称,用于在 Nacos 或其他注册中心中标识此服务。
  cloud:
    nacos:
      server-addr: 192.168.1.101 # Nacos 配置中心的地址,用于指定连接到 Nacos 的服务器地址。
      config:
        file-extension: yaml # 配置文件的后缀名,表示配置的文件格式。常见的文件格式有 properties、yaml、json 等。
        shared-configs: # 共享配置,可以让多个服务共享相同的配置文件,以便于统一管理。
          - dataId: shared-jdbc.yaml # 第一个共享配置的 dataId,通常用于配置数据库连接(例如 MyBatis 配置)。
          - dataId: shared-log.yaml # 第二个共享配置的 dataId,用于日志配置文件的共享,便于多个服务统一日志输出格式、日志级别等。
          - dataId: shared-swagger.yaml # 第三个共享配置的 dataId,用于 Swagger 配置的共享,以便于多个服务统一 API 文档配置。

5. 配置热更新

有很多的业务相关参数,将来可能会根据实际情况临时调整。例如购物车业务,购物车数量有一个上限,默认是8。购物车是写死的固定值,我们应该将其配置在配置文件中,方便后期修改。

5.1 添加配置到Nacos

首先,我们在nacos中添加一个配置文件,将购物车的上限数量添加到配置中。

注意文件的dataId格式:

[服务名]-[spring.active.profile].[后缀名]

(例如:cart-service.yaml)

  • spring.active.profile:就是spring boot中的spring.active.profile,可以省略,则所有profile共享该配置

这里我们直接使用cart-service.yaml这个名称,则不管是dev还是local环境都可以共享该配置。

5.2 配置热更新

接着,我们在微服务中读取配置,实现配置热更新。

可以使用@ConfigurationProperties注解将配置文件中内容读取到配置属性类中。