# nacos 配置中心

  1. 动态配置服务可以让您以中心化,外部化和动态化的方式管理所有环境的应用配置和服务配置

  2. 动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷.

  3. 配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

  4. Nacos 提供了一个简洁易用的 UI()帮助您管理所有的服务和应用的配置。

  5. Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及苦短配置更新状态跟踪在内的一系列开箱即用的配置管理特性, 帮助您更安全的在生产环境中管理配置变更和减低配置变更带来的风险。

实现:

  1. 添加依赖
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 配置

必须在 bootstrap.yml 中进行配置

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: nacos.jun.com:8848
        file-extension: yaml
server:
  port: 8055

bootstrap.yml中定义的 spring.application.name 会作为nacos中配置列表的serverId

如果此服务还要注册到 nacos 当中,会使用 application.yml 中定义的 spring.application.name 的值作为 serverId

配置注册名称 不冲突

  1. 程序读取变量
@RefreshScope
@RestController
public class RestfulController {
    @Value('${name:张三}')
    private String name;

    @Value('${password:pass}')
    private String password;

    @GetMapping('/name')
    public String getName() {
        return this.name;
    }

    @GetMapping('/password')
    public String getPassword() {
        return this.password;
    }
}

只是配置中心,不需要 EnableDiscoveryClient

说明

配置中心的地址必须在bootstrap.yml文件中声明

file-extension: yaml默认的读取的配置文件后缀是 properties

@RefreshScope用于刷新读取的配置变量信息

# 配置文件隔离

配置文件名称规定:

${prefix}-${spring.profile.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。

  • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot 文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

  • file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

  1. profile

spring.profile.active: dev会加载nacos-config-client.yamlnacos-config-client-dev.yaml的值, 并且nacos-config-client-dev.yaml优先级较高,会覆盖相同的变量

  1. group

默认的 group 名称为DEFAULT_GROUP,可以通过spring.cloud.nacos.config.group: alibaba来指定

  1. namespace

命名空间.配置的时候为命名空间 id,而不是名称

完整示例

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: nacos.jun.com:8848
        file-extension: yaml
        group: alibaba
        namespace: 7623c041-c2d4-4c0f-9fb9-dc1fc859378e
  profiles:
    active: dev
server:
  port: 8055

即会去寻找7623c041-c2d4-4c0f-9fb9-dc1fc859378e命名空间下 group 为alibabanacos-config-client-dev.yaml文件

调试的通过在日志中查找dataId查看加载的配置信息

# 配置文件共享原则

# shared-dataids(2.1.0)

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: nacos.jun.com:8848
        file-extension: yaml
        group: alibaba
        namespace: 7623c041-c2d4-4c0f-9fb9-dc1fc859378e
        shared-dataids: common.yml
        refreshable-dataids: common.yml
  profiles:
    active: dev
server:
  port: 8055

使用shared-dataids定义通用配置,如果需要支持刷新refreshable-dataids: common.yml

nacos-config-client-dev.yaml会将之覆盖.达到通用的目的

存在一个弊端(或者成为 bug)

只能加载DEFAULT_GROUP下的common.yml.即: 组信息是无法传递的.

# ext-config(2.1.0)

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: nacos.jun.com:8848
        file-extension: yaml
        group: alibaba
        namespace: 7623c041-c2d4-4c0f-9fb9-dc1fc859378e
        ext-config:
          - dataId: common.yml
            group: alibaba
            refresh: true
  profiles:
    active: dev
server:
  port: 8055

使用ext-config的方式,可以指定 group 和 dataId 以及是否支持刷新.

# 同时存在(2.1.0)

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: nacos.jun.com:8848
        file-extension: yaml
        group: alibaba
        namespace: 7623c041-c2d4-4c0f-9fb9-dc1fc859378e
        ext-config:
          - dataId: common.yml
            group: alibaba
            refresh: true
        shared-dataids: common.yml
        refreshable-dataids: common.yml
  profiles:
    active: dev
server:
  port: 8055

优先读取 ext-config 配置的文件.

如果此时 ext-config 指定的文件修改了,是不能动态刷新的.而且会保留 ext-config 配置的值

所以,同时使用这两种方式不可行

总结:

  1. 使用shared-dataids的方式,指定refreshable-dataids: common.yml支持刷新,但是不支持 group 参数

  2. 使用 ext-config 支持 group,动态刷新

  3. 不能同时使用两种方式.

# 升级到 2.2.0

ext-config,shared-dataids,refreshable-dataids是已经废弃的配置

ext-config 使用 extension-configs代替

shared-dataids,refreshable-dataids使用shared-configs代替

extension-configsshared-configs会使用 spring.cloud.nacos.config.namespace的值

即,必须在该 namespace 下才会生效

extension-configsshared-configs也支持了分组

配置示例:

spring:
  application:
    name: nacos-config-client
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: 192.168.1.6:8848
        file-extension: yaml
        group: alibaba
        namespace: acea6518-0572-4f2d-81ca-bfcddf12f512
        extension-configs:
          - dataId: common.yml
            group: alibaba
            refresh: true
        shared-configs:
          - dataId: shared.yml
            group: alibaba
            refresh: true

此时的配置文件的覆盖策略为:

shared.yml < common.yml < nacos-config-client < nacos-config-client.yaml < nacos-config-client-dev.yaml

5 个文件. nacos-config-client${spring.application.name},yamlfile-extension 的值

file-extension 支持的格式为 properties|yaml|yml|xml|json

# config 数据持久化

config 数据持久化依赖于 nacos 的持久化,选择数据库的方式即可实现.

nacos 运行的数据库设置为mysql 5.6+,不支持 mysql 8,根据 bin 目录下操作即可实现

参照 nacos-deployment