1、Nacos配置中心使用
官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
Nacos提供用于存储配置和其他元数据的key/value存储,为分布式系统中的外部化配置提供服务器和客户端支持。使用Spring Cloud Alibaba Nacos Config,你可以在Nacos Server集中管理你Spring Cloud 应用的外部属性配置。
springcloud config 对比:
三大优势:
- springcloud config大部分场景结合git使用,动态变更还需要依赖Spring Cloud Bus 消息总线来通过所有的客户端变化。
- springclound config不提供可视化界面
- nacos config使用长轮询配置,一旦配置变更,通知Provide的过程非常的迅速,从速度上秒杀springcloud config几条街
1.1、快速开始
准备配置,nacos server中新建nacos-config.properties
Data ID: nacos-config.properties Group : DEFAULT_GROUP 配置格式: Properties 配置内容: user.name=齐菁菁 user.age=123456
注意:dataid是以properties(默认的文件扩展名方式)为扩展名
客户端使用方式
创建一个标准的SpringBoot项目,并引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
启动项:
@SpringBootApplication public class ConfigApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args); String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); System.err.println("user name :"+userName+"; age: "+userAge); } }
在运行此 Example 之前, 必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址,例如:
bootstrap.properties
spring.application.name=nacos-config spring.cloud.nacos.config.server-addr=127.0.0.1:8848
启动这个 Example,可以看到如下输出结果:
user name :齐菁菁; age: 123456
2、基于 dataid 为 yaml 的文件扩展名配置方式
spring-cloud-starter-alibaba-nacos-config 对于 yaml
格式也是完美支持的。这个时候只需要完成以下两步:
1、在应用的 bootstrap.properties
配置文件中显示的声明 dataid 文件扩展名。如下所示
spring: cloud: nacos: config: #修改默认配置文件扩展名(默认是properties) file-extension: yaml
2、新建一个dataid为yml的配置
Data ID: nacos-config.yaml Group : DEFAULT_GROUP 配置格式: YAML 配置内容: user: name: nacos-config.yaml age: 68
这两步完成后,重启测试程序,可以看到如下输出结果。
2018-11-02 14:59:00.484 INFO 32928 --- [main] user name :nacos-config-yaml; age: 68 2018-11-02 14:59:00.529 INFO 32928 --- [-127.0.0.1:8848]
3、支持配置的动态更新
spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,启动 Spring Boot 应用测试的代码如下:
@SpringBootApplication public class ConfigApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args); while(true) { //当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置 String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); System.err.println("user name :" + userName + "; age: " + userAge); TimeUnit.SECONDS.sleep(1); } } }
如下所示,当变更user.name时,应用程序中能够获取到最新的值:
user name :齐菁菁; age: 123456 user name :齐菁菁; age: 123456 2022-06-26 20:11:16.652 WARN 10812 --- [34.254.160_8847] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [user.name] user name :qijingjing; age: 123456 user name :qijingjing; age: 123456 user name :qijingjing; age: 123456 user name :qijingjing; age: 123456
你可以通过配置
spring.cloud.nacos.config.refresh.enabled=false
来关闭动态刷新
4、可支持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: develop
Nacos 上新增一个dataid为:nacos-config-develop.yaml
的基础配置,如下所示:
Data ID: nacos-config-develop.yaml Group : DEFAULT_GROUP 配置格式: YAML 配置内容: current.env: develop-env
启动 Spring Boot 应用测试的代码如下:
@SpringBootApplication public class ConfigApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args); while(true) { String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); //获取当前部署的环境 String currentEnv = applicationContext.getEnvironment().getProperty("current.env"); System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge); TimeUnit.SECONDS.sleep(1); } } }
启动后,可见控制台的输出结果:
in develop-env enviroment; user name :nacos-config.yaml; age: 68
结论:我们的nacos-config.yaml
和nacos-config-develop.yaml
都起到了作用
知识补充:profile>默认配置文件,优先级大的会覆盖优先级小的,然后形成互补
如果需要切换环境(例如生产环境),只需要更改${spring.profiles.active}参数配置即可。同时在Nacos添加dataid为:nacos-config-product.yaml的配置即可
5、支持自定义 namespace 的配置
最佳配置:
- namespace:代表不同环境,如开发、测试、生产环境
- group: 代表项目,如XX医疗项目,XX电商项目
- dataid:每个项目下面有若干个微服务,每个配置集(dataid)是一个微服务的主配置文件
在nacos server里面创建一个新的命名空间,例如dev
在没有明确指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring: cloud: nacos: config: # 默认命名空间是public,这里需要填写dev命名空间的环境值 namespace: f5fa5d97-b3df-4e3e-8aa6-6ad7bc3640bf
然后克隆几个配置文件到dev环境,启动类测试运行即可。
注意:该配置必须放在 bootstrap.yml文件中。此外 spring.cloud.nacos.config.namespace
的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致读取不到正确的配置。
6、支持自定义 Group 的配置
在没有明确指定 ${spring.cloud.nacos.config.group}
配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring: cloud: nacos: config: # 组(默认是DEFAULT_GROUP) group: STORE_GROUP
克隆配置文件到这个STORE_GROUP
组即可
注意:该配置必须放在 bootstrap.yml文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group
的配置值一致。
7、支持自定义扩展的 Data Id 配置
在之前的基础上加入新的代码:
spring: cloud: nacos: config: shared-configs: - data-id: com.lili.store.properties #不指定的话默认为DEFAULT_GROUP group: STORE_GROUP # 自定读取刷新配置 refresh: true extension-configs[0]: data-id: com.lili.store1.properties #不指定的话默认为DEFAULT_GROUP group: STORE_GROUP # 自定读取刷新配置 refresh: true
添加两个配置:
Data ID: com.lili.store.properties Group : STORE_GROUP 配置格式: properties 配置内容: user.sex=男
Data ID: com.lili.store1.properties Group : STORE_GROUP 配置格式: properties 配置内容: user.sex=女
启动测试类
@SpringBootApplication public class ConfigApplication { public static void main(String[] args) throws InterruptedException { ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args); while(true) { String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); String userSex = applicationContext.getEnvironment().getProperty("user.sex"); //获取当前部署的环境 String currentEnv = applicationContext.getEnvironment().getProperty("current.env"); System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge + ";sex: "+ userSex); TimeUnit.SECONDS.sleep(1); } } }
结果:
in dev-namespace enviroment; user name :nacos-namespace.yaml; age: 68;sex: 女
8、配置的优先级
profile > 默认配置文件 > extension-configs(下标越大优先级越大) > shard-configs(下标越大优先级越大)
9、补充@RefreshScope
@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解即可
@RestController @RefreshScope public class HelloController { @Value("${user.name}") private String name; @RequestMapping("/show") public String hello(){ return this.name; } }