对于Nacos作为配置中心的使用,通过之前的几篇文章,我们已经介绍了如何在Nacos中创建配置内容、Nacos配置内容与Spring应用配置之间的对应关系以及实战中多环境下的配置管理方案。

但是,我们实际应用过程中还会经常碰到这样的问题:有时候我们会对应用配置根据具体作用做一些拆分,存储在不同的配置文件中,除了归类不同的配置之外,也可以便于共享配置给不同的应用。对于这样的需求,Nacos也可以很好的支持,下面就来具体介绍一下,当使用Nacos时,如何加载多个配置,以及如何共享配置。

加载多个配置

通过之前的学习,我们已经知道Spring应用对Nacos中配置内容的对应关系是通过下面的三个参数来控制的:

spring.cloud.nacos.config.prefix spring.cloud.nacos.config.file-extension spring.cloud.nacos.config.group 默认情况下,会加载 DataID=${spring.application.name}.properties,Group=DEFAULT_GROUP的配置。 假设现在有这样一个需求:我们想对所有应用的Actutor模块以及日志输出做统一的配置管理。所以,我们希望可以将Actuator模块的配置放在独立的配置文件 log.properties文件中。通过拆分这个两类配置内容,希望可以做到配置的共享加载与统一管理。

这里,我们在默认Namespace Public下完成这个实验,当然你也可以在我们之前建立的 DEV 、 TEST 的Namespace下完成。

第一步:

在Nacos中创建 Data ID=actuator.properties,Group=DEFAULT_GROUPData ID=log.properties,Group=DEFAULT_GROUP的配置内容。

nacos.webp

第二步:

在Spring Cloud应用中通过使用spring.cloud.nacos.config.ext-config参数配置来加载这两个配置内容:

# actuator.properties
spring.cloud.nacos.config.ext-config[0].dataId=actuator.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
# log.properties
spring.cloud.nacos.config.ext-config[1].dataId=log.properties
spring.cloud.nacos.config.ext-config[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[1].refresh=true

可以看到,spring.cloud.nacos.config.ext-confi配置是一个数组List类型。每组配置都包含三个参数:dataId、group、refresh; 这里需要说明的是 refresh 参数,它主要用来控制配置文件的内容支持自动刷新,默认情况下,只有默认的配置项(alibaba-nacos-config-client.properties)才会自动刷新,对于这些扩展的配置项,如果需要实时刷新配置,这个参数必须加上。

共享配置

通过上面的加载多个配置的实现,实际上我们已经可以实现不同应用的共享配置了(当然,不同的Namespace是相互隔离的)。而Nacos除了上面这种配置方式外,还提过了了另一种更加简便的配置方式:下面的方式和上面的效果是等价的:

# 配置多个共享的 Data ID
spring.cloud.nacos.config.shared-dataids=actuator.properties,log.properties

# 指定需要自动刷新的Data ID
spring.cloud.nacos.config.refreshable-dataids=actuator.properties,log.properties
  • spring.cloud.nacos.config.shared-dataids 参数用来配置多个共享配置的 Data ID,多个的时候使用逗号分隔
  • spring.cloud.nacos.config.refreshable-dataids 参数用来定义那些共享配置的 Data ID在配置变化时,应用中可以动态刷新,多个 Data ID之间用逗号隔开。如果没有明确配置,默认情况下所有共享配置都不支持动态刷新。

配置加载优先级

当我们加载多个配置文件时,如果存在相同的key时,需要了解下有关配置加载优先级关系问题。

在使用Nacos配置的时候,只要有以下三类配置:

  • A:通过spring.cloud.nacos.config.shared-dataids定义的共享配置
  • B:通过spring.cloud.nacos.config.ext-config[n]定义的加载配置
  • C:通过内部规则(spring.cloud.nacos.config.prefixspring.cloud.nacos.config.file-extensionspring.cloud.nacos.config.group这几个参数)拼接出来的配置 想用弄清楚这个几个配置的优先级,我们做一个简单的实验,从实验日志中我们可以很清晰的看到结果:
# A 类
spring.cloud.nacos.config.shared-dataids=log.properties
spring.cloud.nacos.config.refreshable-dataids=log.properties

# B 类
spring.cloud.nacos.config.ext-config[0].dataId=actuator.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true

# C 类 我们这里省略,系统默认会自动配置

根据上面的配置,应用分别会去加载三类不同的配置文件,启动应用的时候,将会在日志中看到如下输出:

2019-07-11 15:26:28.827  INFO 2224 --- [-localhost_8848] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'log.properties', group: 'DEFAULT_GROUP'
2019-07-11 15:26:28.831  INFO 2224 --- [-localhost_8848] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'actuator.properties', group: 'DEFAULT_GROUP'
2019-07-11 15:26:28.834  INFO 2224 --- [-localhost_8848] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'alibaba-nacos-config-client.properties', group: 'DEFAULT_GROUP'

实验证明后面加载的配置内容会覆盖之前的配置,所以优先级关系:C > B > A

注:这里的优先级和配置代码书写前后位置无关,同学们不要被误导了!