源码地址(重点开源码中的 nacos8030 模块):https://download.csdn.net/download/weixin_42950079/87264006
Spring Cloud Alibaba Nacos Config 自定义扩展的 Data Id 配置 - - - > 官方文档
多配置文件 / 共享配置
在一个微服务架构应用系统中可能包含成百上千个微服务。而很多微服务可能都引入相同的中间件,当环境中引入的中间件较多时,集中管理配置/共享配置是非常有必要的,方便管理维护。比如:MySQL数据库、redis缓存、消息队列等。
1. 在 nacos 控制台中,在 dev 命名空间中创建三个共享文件:config-caidong.mysql.properties、config-caidong.redis.properties、config-caidong.rocketmq.properties
2. 注意:要使用 Nacos 配置中心,必需在bootstrap.properties / bootstrap.yml中配置。bootstrap.yml配置文件的加载顺序要优先于application.yml
spring:
cloud:
nacos:
config:
#配置中心
server-addr: 192.168.184.129:8849
#需要配置nacos的 用户名和密码,否则报unknown user!错误
username: nacos
password: nacos
#对于非public命名空间的配置文件,需要指定命名空间ID
namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
#对于非DEFAULT_GROUP分组的配置文件,需要指定分组名称
group: dev
#指定配置文件名(data-id: [file-name].[file-extension])
#prefix: file-name
#如果配置文件扩展名不是properties,则必须指定扩展名(data-id: [file-name].[file-extension])
#file-extension: yaml
#extension-configs 可以支持多配置文件,但是需要在同一个命名空间下,可以不同分组。
extension-configs[0]:
data-id: config-caidong-mysql.properties
group: dev
refresh: true
extension-configs[1]:
data-id: config-caidong-redis.properties
group: dev
refresh: true
extension-configs[2]: #extension-configs[下标]配置中,下标越大,优先级越高
data-id: config-caidong-rocketmq.properties #配置data-id
group: dev #分组名称
refresh: true #开启动态刷新,默认为false
不知道什么原因,多文件配置时,用bootstrap.yml可以,但使用bootstrap.propertie无效
spring.cloud.nacos.config.server-addr=192.168.184.129:8849
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.namespace=29f2547c-ce20-40b4-b76c-e4ae53f481fe
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.shared-configs[0].data-id=config-caidong-mysql.properties
spring.cloud.nacos.config.shared-configs[0].group==dev
spring.cloud.nacos.config.shared-configs[0].refresh=true
spring.cloud.nacos.config.shared-configs[1].data-id=config-caidong-redis.properties
spring.cloud.nacos.config.shared-configs[1].group==dev
spring.cloud.nacos.config.shared-configs[1].refresh=true
spring.cloud.nacos.config.shared-configs[2].data-id=config-caidong-rocketmq.properties
spring.cloud.nacos.config.shared-configs[2].group==dev
spring.cloud.nacos.config.shared-configs[2].refresh=true
3. 创建一个 SpringBoot 应用进行测试。
run 方法执行后,会将所有配置文件的信息加载到环境中。所以可以通过 applicationContext.getEnvironment().getProperty() 获取到配置文件的配置项。
@SpringBootApplication
public class Nacos8030Apllication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(Nacos8030Apllication.class, args);
String mysqlName = applicationContext.getEnvironment().getProperty("com.mysql.name");
System.out.println("mysqlName: " + mysqlName);
String redisName = applicationContext.getEnvironment().getProperty("com.redis.name");
System.out.println("redisName: " + redisName);
String rocketmqName = applicationContext.getEnvironment().getProperty("com.rocketmq.name");
System.out.println("rocketmqName: " + rocketmqName);
}
}
4. 可以看到如下输出结果。
2022-12-09 11:49:08.989 INFO 3424 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-redis.properties, group=dev
2022-12-09 11:49:08.990 INFO 3424 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-rocketmq.properties, group=dev
2022-12-09 11:49:08.991 INFO 3424 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-mysql.properties, group=dev
2022-12-09 11:49:08.992 INFO 3424 --- [ restartedMain] .ConditionEvaluationDeltaLoggingListener : Condition evaluation unchanged
mysqlName: 数据库配置
redisName: 缓存配置
rocketmqName: 消息队列配置
多配置文件 - - > shared-configs 与 extension-configs 都能实现加载多个配置文件
shared-configs 写法
第一种写法
spring:
cloud:
nacos:
config:
#配置中心
server-addr: 192.168.184.129:8849
#需要配置nacos的 用户名和密码,否则报unknown user!错误
username: nacos
password: nacos
#对于非public命名空间的配置文件,需要指定命名空间ID
namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
#对于非DEFAULT_GROUP分组的配置文件,需要指定分组名称
group: dev
#指定配置文件名(data-id: [file-name].[file-extension])
#prefix: file-name
#如果配置文件扩展名不是properties,则必须指定扩展名(data-id: [file-name].[file-extension])
#file-extension: yaml
#shared-configs 可以支持多配置文件,但是需要在同一个命名空间下,可以不同分组。
#shared-configs[下标]配置中,下标越大,优先级越高
shared-configs[0]:
data-id: config-caidong-mysql.properties
group: dev
refresh: true
shared-configs[1]:
data-id: config-caidong-redis.properties
group: dev
refresh: true
shared-configs[2]:
data-id: config-caidong-rocketmq.properties #配置data-id
group: dev #分组名称
refresh: true #开启动态刷新,默认为false
第二种写法
spring:
cloud:
nacos:
config:
#配置中心
server-addr: 192.168.184.129:8849
#需要配置nacos的 用户名和密码,否则报unknown user!错误
username: nacos
password: nacos
#对于非public命名空间的配置文件,需要指定命名空间ID
namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
#对于非DEFAULT_GROUP分组的配置文件,需要指定分组名称
group: dev
#指定配置文件名(data-id: [file-name].[file-extension])
#prefix: file-name
#如果配置文件扩展名不是properties,则必须指定扩展名(data-id: [file-name].[file-extension])
#file-extension: yaml
#shared-configs 可以支持多配置文件,但是需要在同一个命名空间下,可以不同分组。
#后读取到的配置文件优先,即后面配置文件比前面配置文件的优先级高
shared-configs:
- data-id: config-caidong-mysql.properties
group: dev
refresh: true
- data-id: config-caidong-redis.properties
group: dev
refresh: true
- data-id: config-caidong-rocketmq.properties #配置data-id
group: dev #分组名称
refresh: true #开启动态刷新,默认为false
extension-configs 写法
第一种写法
spring:
cloud:
nacos:
config:
#配置中心
server-addr: 192.168.184.129:8849
#需要配置nacos的 用户名和密码,否则报unknown user!错误
username: nacos
password: nacos
#对于非public命名空间的配置文件,需要指定命名空间ID
namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
#对于非DEFAULT_GROUP分组的配置文件,需要指定分组名称
group: dev
#指定配置文件名(data-id: [file-name].[file-extension])
#prefix: file-name
#如果配置文件扩展名不是properties,则必须指定扩展名(data-id: [file-name].[file-extension])
#file-extension: yaml
#extension-configs 可以支持多配置文件,但是需要在同一个命名空间下,可以不同分组。
extension-configs[0]:
data-id: config-caidong-mysql.properties
group: dev
refresh: true
extension-configs[1]:
data-id: config-caidong-redis.properties
group: dev
refresh: true
extension-configs[2]: #extension-configs[下标]配置中,下标越大,优先级越高
data-id: config-caidong-rocketmq.properties #配置data-id
group: dev #分组名称
refresh: true #开启动态刷新,默认为false
第二种写法
spring:
cloud:
nacos:
config:
#配置中心
server-addr: 192.168.184.129:8849
#需要配置nacos的 用户名和密码,否则报unknown user!错误
username: nacos
password: nacos
#对于非public命名空间的配置文件,需要指定命名空间ID
namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
#对于非DEFAULT_GROUP分组的配置文件,需要指定分组名称
group: dev
#指定配置文件名(data-id: [file-name].[file-extension])
#prefix: file-name
#如果配置文件扩展名不是properties,则必须指定扩展名(data-id: [file-name].[file-extension])
#file-extension: yaml
#extension-configs 可以支持多配置文件,但是需要在同一个命名空间下,可以不同分组。
extension-configs:
- data-id: config-caidong-mysql.properties
group: dev
refresh: true
- data-id: config-caidong-redis.properties
group: dev
refresh: true
- data-id: config-caidong-rocketmq.properties #配置data-id
group: dev #分组名称
refresh: true #开启动态刷新,默认为false
总结
配置文件优先级:优先级高的会覆盖优先级低的,并形成互补
shared-configs 与 extension-configs 都能实现加载多个配置文件 :第一种写法中优先级:[0] < [1] 。 第二种写法中优先级: < [1]
profile > 默认配置文件 > extension-configs > shared-configs 的优先级
1)优先级测试:extension-configs > shared-configs 的优先级
1. bootstrap.yml
spring:
cloud:
nacos:
config:
#配置中心
server-addr: 192.168.184.129:8849
#需要配置nacos的 用户名和密码,否则报unknown user!错误
username: nacos
password: nacos
#对于非public命名空间的配置文件,需要指定命名空间ID
namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
#对于非DEFAULT_GROUP分组的配置文件,需要指定分组名称
#group: dev
#指定配置文件名(data-id: [file-name].[file-extension])
#prefix: file-name
#如果配置文件扩展名不是properties,则必须指定扩展名(data-id: [file-name].[file-extension])
#file-extension: yaml
#extension-configs 可以支持多配置文件,但是需要在同一个命名空间下,可以不同分组。
shared-configs:
- data-id: config-caidong-redis.properties
group: dev
refresh: true
extension-configs:
- data-id: config-caidong-mysql.properties
group: dev
refresh: true
- data-id: config-caidong-redis02.properties
group: dev
refresh: true
- data-id: config-caidong-rocketmq.properties #配置data-id
group: dev #分组名称
refresh: true #开启动态刷新,默认为false
2. 在 SpringBoot 应用的启动类中进行测试
@SpringBootApplication
public class Nacos8030Apllication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(Nacos8030Apllication.class, args);
String mysqlName = applicationContext.getEnvironment().getProperty("com.mysql.name");
System.out.println("mysqlName: " + mysqlName);
String redisName = applicationContext.getEnvironment().getProperty("com.redis.name");
System.out.println("redisName: " + redisName);
String rocketmqName = applicationContext.getEnvironment().getProperty("com.rocketmq.name");
System.out.println("rocketmqName: " + rocketmqName);
}
}
3. 可以看到如下输出结果。这是因为 - - > shared-configs
配置 config-caidong-redis.properties 配置文件,extension-configs
配置 config-caidong-redis02.properties 配置文件。由于 extension-configs 优先级高于 shared-configs,所以输出的是redisName: 缓存配置02
而不是 redisName: 缓存配置
2022-12-11 13:45:35.478 INFO 18872 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-redis.properties, group=dev
2022-12-11 13:45:35.479 INFO 18872 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-redis02.properties, group=dev
2022-12-11 13:45:35.480 INFO 18872 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=null.properties, group=DEFAULT_GROUP
2022-12-11 13:45:35.481 INFO 18872 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-rocketmq.properties, group=dev
2022-12-11 13:45:35.482 INFO 18872 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-mysql.properties, group=dev
mysqlName: 数据库配置
redisName: 缓存配置02
rocketmqName: 消息队列配置
2)优先级测试:后读取到的配置文件优先级更高,后读取到的配置文件会覆盖前面读取到的配置文件。
1. 将上面的 bootstrap.yml 配置文件进行修改,内容如下:↓ ↓ ↓
spring:
cloud:
nacos:
config:
#配置中心
server-addr: 192.168.184.129:8849
#需要配置nacos的 用户名和密码,否则报unknown user!错误
username: nacos
password: nacos
#对于非public命名空间的配置文件,需要指定命名空间ID
namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
#对于非DEFAULT_GROUP分组的配置文件,需要指定分组名称
#group: dev
#指定配置文件名(data-id: [file-name].[file-extension])
#prefix: file-name
#如果配置文件扩展名不是properties,则必须指定扩展名(data-id: [file-name].[file-extension])
#file-extension: yaml
#extension-configs 可以支持多配置文件,但是需要在同一个命名空间下,可以不同分组。
extension-configs:
- data-id: config-caidong-mysql.properties
group: dev
refresh: true
- data-id: config-caidong-redis02.properties
group: dev
refresh: true
- data-id: config-caidong-rocketmq.properties #配置data-id
group: dev #分组名称
refresh: true #开启动态刷新,默认为false
- data-id: config-caidong-redis.properties
group: dev
refresh: true
2. 可以看到如下输出结果。这是因为 - - > 在 SpringBoot 应用中,后加载的配置文件 优先级高于 先加载的配置文件,config-caidong-redis.properties 后读取,所以输出的是redisName: 缓存配置
而不是 redisName: 缓存配置02
2022-12-11 14:05:30.878 INFO 1472 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-redis.properties, group=dev
2022-12-11 14:05:30.879 INFO 1472 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-redis02.properties, group=dev
2022-12-11 14:05:30.880 INFO 1472 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=null.properties, group=DEFAULT_GROUP
2022-12-11 14:05:30.881 INFO 1472 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-rocketmq.properties, group=dev
2022-12-11 14:05:30.882 INFO 1472 --- [ restartedMain] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=config-caidong-mysql.properties, group=dev
mysqlName: 数据库配置
redisName: 缓存配置
rocketmqName: 消息队列配置
参考文献
https://blog.csdn.net/qq_32808649/article/details/126967160
https://blog.csdn.net/qq_29229567/article/details/95327423
https://blog.csdn.net/yueyezhufeng/article/details/126285311