Spring Cloud Alibaba Nacos Config - - - >多配置文件/共享配置

源码地址(重点开源码中的 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

cd
cd


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 的优先级

cd
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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Cloud Alibaba Nacos 是一个服务注册中心和配置中心,可以实现服务的注册与发现、配置的动态管理等功能,同时还提供了容灾和高可用的支持。下面简单介绍如何使用 Nacos 实现 Spring Cloud配置容灾。 首先,在应用的 `pom.xml` 文件中添加如下依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.3.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.3.RELEASE</version> </dependency> ``` 然后在 `application.properties` 中配置 Nacos 的地址和应用的名称: ```properties spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.namespace=your-namespace spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=your-namespace spring.cloud.nacos.config.file-extension=properties spring.application.name=your-application-name ``` 其中 `server-addr` 是 Nacos 的地址,`namespace` 是命名空间,`file-extension` 是配置文件的扩展名,`application.name` 是应用的名称。 接着在 `bootstrap.properties` 中配置应用的环境和配置来源: ```properties spring.profiles.active=dev spring.cloud.nacos.config.prefix=${spring.application.name}-${spring.profiles.active} spring.cloud.nacos.config.group=DEFAULT_GROUP spring.cloud.nacos.config.shared-dataids=${spring.application.name}-${spring.profiles.active}.properties ``` 其中 `spring.profiles.active` 是应用的环境,`prefix` 是配置文件的前缀,`group` 是配置文件所在的分组,`shared-dataids` 是配置文件的名称。 最后,在代码中使用 `@Value` 注解来获取配置项的值: ```java @RestController public class ConfigController { @Value("${config.key}") private String configValue; @GetMapping("/config") public String getConfig() { return configValue; } } ``` 其中 `config.key` 是配置项的名称。 以上就是使用 Nacos 实现 Spring Cloud配置容灾的简单示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家师曹先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值