参考官方文档中描述:
在构建云原生应用时,Nacos是一个易使用的动态服务发现、配置、管理的平台。
使用Spring Cloud Alibaba Nacos Config,可以通过Spring Cloud的编程模型迅速接入Nacos配置管理功能。
Spring Cloud Alibaba Nacos Config是在Spring Cloud Alibaba服务中利用Nacos作为配置中心,可以从中获得配置信息,配置中心配置更新后,可以热更新得到最新的配置信息。
在Nacos中创建配置
上一篇讲Nacos Discovery服务发现时涉及了Nacos的安装、启动、管理页面,这里不再赘述。
Nacos启动后,访问管理页面,在配置管理/配置列表菜单可以新建配置:
我这里按照这个测试填写:
- Data ID,这个相当于配置文件名称,这个名称一会儿需要在我们需要获取这个配置的服务中配置(不配置的话默认是
spring.application.name),文件扩展名在服务中同样可以配置(默认为properties) - Group,直接使用了默认的
DEFAULT_GROUP
依赖引入
Spring Cloud Alibaba提供了Nacos Config相关的依赖,引入后即可根据配置文件从配置中心获取配置及获取配置更新。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
</dependency>
Nacos Config 配置
因为Spring Boot在加载配置文件时,会先加载bootstrap(.yml或.properties)配置文件,再加载application(.yml或.properties)配置。
-
bootstrap,顾名思义,是系统启动级别的配置,
- 先加载
- 其配置的属性不能被覆盖,也用于一些加密解密场景,
- 常用来从额外配置资源中加载配置,可以用于从Spring Cloud Config或Nacos Config等配置中心中加载配置。
-
applicaiton,是应用级别的配置,晚于bootstrap。
所以在这里加一个文件名为bootstrap.yml的配置:
spring:
application:
name: nacos-config
cloud:
nacos:
config:
server-addr: 192.168.162.1:8848
file-extension: yaml
这里的配置中${spring.application.name}.${file-extension:properties}即对应前面在Nacos中添加配置时的DataId,Group不配置默认即为DEFAULT_GROUP
启动读取配置测试
我在启动Spring Boot服务时尝试获取在Nacos配置中心所配置的属性:
ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(ConfigApplication.class, args);
while (true){
TimeUnit.SECONDS.sleep(1);
String property = configurableApplicationContext.getEnvironment().getProperty("itlq.spring.version");
System.out.println("nacos-config property: " + property);
}
这是可以看到控制台打印:
nacos-config property: 0.1
热更新测试
Spring Cloud Nacos Config服务默认会根据Nacos Config配置中心的变化实时加载最新的配置,我们尝试在Nacos管理页面编辑配置信息,将其改为:
不需要重启,可以看到服务的循环中已经得到了最新的配置
nacos-config property: 0.1 #旧配置
2020-06-27 23:13:04.227 INFO 14920 --- [.168.162.1_8848] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'nacos-config.yaml', group: 'DEFAULT_GROUP'
2020-06-27 23:13:04.228 INFO 14920 --- [.168.162.1_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-nacos-config.yaml'}]
2020-06-27 23:13:04.230 INFO 14920 --- [.168.162.1_8848] o.s.boot.SpringApplication : No active profile set, falling back to default profiles: default
2020-06-27 23:13:04.237 INFO 14920 --- [.168.162.1_8848] o.s.boot.SpringApplication : Started application in 3.521 seconds (JVM running for 31.649)
2020-06-27 23:13:04.255 INFO 14920 --- [.168.162.1_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [itlq.spring.version]
nacos-config property: 0.1.3 #已更新
@RefreshScope注解
Spring Cloud提供了一个Bean生命周期相关的注解@RefreshScope,Bean定义时加上它之后,可以在运行时刷新相关配置数据,方式是在数据更新后,重新创建新的Bean,以读取新的配置。用以下代码测试:
@RestController
@RefreshScope
public class VersionController {
@Value("${itlq.spring.version}")
String version;
@RequestMapping("/version")
public String version(){
// 此处打印实际的Bean对象
System.out.println(this);
return version;
}
}
在更改配置前后输出,发现返回的配置信息更新了,同时,打印的Bean对象也有两个:
top.itlq.spring.cloud.config.VersionController@44141779
nacos-config property: 0.1.3
top.itlq.spring.cloud.config.VersionController@1f1aa94d
nacos-config property: 0.1.2
说明配置数据通过创建新的Bean刷新了。
配置profile支持
Spring Cloud Nacos Config服务默认从配置中心读取${spring.application.name}.${file-extension:properties}的同时,也会读取DataId为${spring.application.name}-${profile}.${file-extension:properties}的配置。
-
其中
profile使用spring.profiles.active配置,在服务中配置,必须配置在bootstrap配置文件中。 -
spring.profiles.active也可以使用Java启动参数配置java -Dspring.profiles.active=dev
Nacos命名空间
Nacos命名空间主要的作用是隔离配置,相同的Data Id和Group可以在不同的命名空间中存在,可以在Nacos管理页面的命名空间菜单下进行维护,如下图,维护了一个test,用于测试环境下的配置
在配置管理页面可以配置不同命名空间的配置
在服务中配置命名空间:
spring:
cloud:
nacos:
config:
namespace: c0b7b744-b29b-49d2-bd8d-61a40f2b1e2e
配置完成后,这里将读取名称为test命名空间的配置,如果不配置spring.cloud.nacos.config,将读取默认命名空间pulic下的配置
自定义Group和Data Id
Group
使用spring.cloud.nacos.config.group配置
Data Id
其中nacos-config为服务名,可作为数组配置多组Data Id、Group,默认不可refresh,需要手动指定,data-id中需要直接指定完整的配置id(包括扩展名)
spring.cloud.nacos.config.nacos-config[0].data-id=ext-config-common03.properties
spring.cloud.nacos.config.nacos-config[0].group=REFRESH_GROUP
spring.cloud.nacos.config.nacos-config[0].refresh=true
也可以通过spring.cloud.nacos.config.shared-dataids和spring.cloud.nacos.config.refreshable-dataids指定,后者可以热更新
spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties
Nacos Config端点
Spring Cloud Alibaba Nacos Config服务对外暴露了端点nacos-config,启动服务访问http://ip-addr/actuator/nacos-config(注意要在配置中加关于暴露web端点的配置),可以得到以下内容:
NacosConfigProperties,包含Nacos Config的一些配置信息RefreshHistory,服务启动后配置更新的记录Sources,配置源和同步时间
Nacos Config其它配置
见文档
总结
- Spring Cloud Alibaba Nacos Config可以启动时从Nacos Config配置中心读取配置并在服务中应用
- Spring Cloud Alibaba Nacos Config支持热更新、profile、命名空间、自定义Data Id和Group等配置管理功能
- 只是简单阅读、测试了可以实现的功能,具体实现的原理还需要研究后补充。TODO
参考
Spring Cloud Alibaba:spring-cloud-alibaba-group.github.io/github-page…
spring bootstrap 与 applicaiton配置文件:blog.csdn.net/snow_7/arti…
Nacos:nacos.io/zh-cn/docs/…