引入nacos config依赖
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> </dependencies>
编写bootstrap.properties 文件内容
spring.application.name=nacosconfig spring.cloud.nacos.config.server-addr=localhost:8848 ${spring.application.name}.${file-extension.properties}
编写nacos config 配置 命名为 nacosconfig.properties
修改StudyNacosConfigApplication 类
package com.jiuge.study; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class StudyNacosConfigApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(StudyNacosConfigApplication.class, args); String userName = applicationContext.getEnvironment().getProperty("common.name"); String userAge = applicationContext.getEnvironment().getProperty("common.age"); System.out.println("common name :"+userName+"; age: "+userAge); } }
启动,测试, 控制台输出一下内容
common name :fox; age: 33
支持配置的动态更新, 修改启动类
package com.jiuge.study; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import java.util.concurrent.TimeUnit; @SpringBootApplication public class StudyNacosConfigApplication { public static void main(String[] args) throws InterruptedException { ConfigurableApplicationContext applicationContext = SpringApplication.run(StudyNacosConfigApplication.class, args); while (true) { String userName = applicationContext.getEnvironment().getProperty("common.name"); String userAge = applicationContext.getEnvironment().getProperty("common.age"); System.err.println("common name :" + userName + "; age: " + userAge); TimeUnit.SECONDS.sleep(1); } } }
启动,测试, 控制台每隔一秒输出内容
common name :haha; age: 22 common name :haha; age: 22 common name :haha; age: 22 common name :aaaa; age: 23 common name :aaaa; age: 23 common name :aaaa; age: 23 common name :aaaa; age: 23 common name :aaaa; age: 23 common name :aaaa; age: 23
支持profile粒度的配置
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。
spring.profiles.active=dev
nacos 注册中心上添加配置 nacosconfig-prod.properties
内容如下
common.name=jiuge common.age=27
修改bootstrap.properties文件
spring.application.name=nacosconfig spring.cloud.nacos.config.server-addr=localhost:8848 # 通过 变量扩展名的方式进行命名 #${spring.application.name}.${file-extension.properties} spring.profiles.active=prod #profile粒度的配置 ${spring.application.name}-${profile}.${file-extension.properties}
变换成yml 配置
spring: cloud: nacos: config: server-addr: localhost:8848 application: name: nacosconfig profiles: active: prod
在nacos 上配置 nacosconfig-prod.properties
内容如下
common.name=jiuge common.age=27
控制台输出
common name :小苗; age: 30 common name :小苗; age: 30
支持自定义namespace的配置
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespace。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=e39f93ae-bcc9-4539-99b8-38b9a9054224
nacos 配置中心上添加命名空间
在新建的命名空间下 新建内容
内容为
common.name=小舞 common.age=19
bootstrap.yml 配置如下
spring: cloud: nacos: config: server-addr: localhost:8848 namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224 application: name: nacosconfig profiles: active: dev
测试,验证,控制台输出
common name :小舞; age: 19 common name :小舞; age: 19 common name :小舞; age: 19
支持自定义Group 的配置
Group是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULTGROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 databaseurl 配置和 MQtopic 配置。在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下,默认是DEFAULTGROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
添加DEVELEOP_GROUP配置
common.name=宁荣荣 common.age=21
修改yml配置
spring: cloud: nacos: config: server-addr: localhost:8848 namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224 group: DEVELOP_GROUP application: name: nacosconfig profiles: active: dev
验证,控制台输出
common name :宁荣荣; age: 21 common name :宁荣荣; age: 21
nacos 配置中心加上 nacosconfig-prod.properties 配置
nacosconfig-prod.properties 的配置内容为
common.name=竹清 common.age=20
修改yml配置
spring: cloud: nacos: config: server-addr: localhost:8848 namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224 group: DEVELOP_GROUP application: name: nacosconfig profiles: active: prod
测试,验证, 控制台输出
common name :竹清; age: 20 common name :竹清; age: 20
支持自定义扩展的Data Id 配置
Data ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
通过自定义扩展的Data Id 配置, 既可以解决多个应用间配置共享的问题, 又可以支持一个应用有多个配置文件
# 自定义 Data Id 的配置 #不同工程的通用配置 支持共享的 DataId spring.cloud.nacos.config.sharedConfigs[0].data-id= common.yaml spring.cloud.nacos.config.sharedConfigs[0].group=REFRESH_GROUP spring.cloud.nacos.config.sharedConfigs[0].refresh=true # config external configuration # 支持一个应用多个 DataId 的配置 spring.cloud.nacos.config.extensionConfigs[0].data-id=ext-config-common01.properties spring.cloud.nacos.config.extensionConfigs[0].group=REFRESH_GROUP spring.cloud.nacos.config.extensionConfigs[0].refresh=true spring.cloud.nacos.config.extensionConfigs[1].data-id=ext-config-common02.properties spring.cloud.nacos.config.extensionConfigs[1].group=REFRESH_GROUP spring.cloud.nacos.config.extensionConfigs[1].refresh=true
nacos 配置中心添加配置 common.yaml 文件
内容如下
common: age: 20 name: 小奥
修改bootstrap.yml 配置文件内容为
spring: cloud: nacos: config: server-addr: localhost:8848 namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224 shared-configs[0].data-id: common.yaml shared-configs[0].group: DEFAULT_GROUP shared-configs[0].refresh: true application: name: studyconfig
在nacos 配置中心上添加配置 文件 common-ext.yaml
common: type: 男生女生 name: helloc
修改bootstrap.yml 配置文件内容为
spring: cloud: nacos: config: server-addr: localhost:8848 namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224 shared-configs[0].data-id: common.yaml shared-configs[0].group: DEFAULT_GROUP shared-configs[0].refresh: true shared-configs[1].data-id: common-ext.yaml shared-configs[1].group: REFRESH_GROUP shared-configs[1].refresh: true shared-configs[2].data-id: common-share.yaml shared-configs[2].group: REFRESH_GROUP shared-configs[2].refresh: true application: name: studyconfig
spring启动程序
package com.jiuge.study; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import java.util.concurrent.TimeUnit; @SpringBootApplication public class StudyNacosConfigApplication { public static void main(String[] args) throws InterruptedException { ConfigurableApplicationContext applicationContext = SpringApplication.run(StudyNacosConfigApplication.class, args); while (true) { String userName = applicationContext.getEnvironment().getProperty("common.name"); String userAge = applicationContext.getEnvironment().getProperty("common.age"); String ddd = applicationContext.getEnvironment().getProperty("common.type"); String eee = applicationContext.getEnvironment().getProperty("common.name"); System.err.println("common name :" + userName + "; age: " + userAge + ", type=" + ddd + " ; eee:=" + eee); TimeUnit.SECONDS.sleep(1); } } }
测试,验证,输出
common name :gaogao; age: 20, type=男生女生 ; eee:=gaogao common name :gaogao; age: 20, type=男生女生 ; eee:=gaogao common name :gaogao; age: 20, type=男生女生 ; eee:=gaogao
配置的优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
A: 通过 spring.cloud.nacos.config.shared-configs 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
优先级从高到低
优先级从高到低: 1) nacos-config-product.yaml 精准配置 2) nacos-config.yaml 同工程不同环境的通用配置 3) ext-config: 不同工程 扩展配置 4) shared-dataids 不同工程通用配置: common2.yml > common1.yml
@RefershScope 注解
@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解
package com.jiuge.study.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class ScopeRefershController { @Value("${common.name}") private String name; @Value("${common.age}") private String age; @GetMapping("/common") public String hello() { return "name =" + name + ",age = " + age; } }
测试,验证
nacos 配置中心的配置如下
common.name=rrw common.age=12
请求接口 http://localhost:8080/common/ 输出
name =rrw,age = 12
修改nacos 的配置
common.name=jiuge common.age=18
请求接口 http://localhost:8080/common/ , 输出
name =jiuge ,age = 18