Springcloud-Nacos
配置中心
参考掘金内容
简书
简书实时配置
在springboot项目启动生命周期中preapareContext,完成容器的前置处理。里面有个步骤,遍历ApplicationContextInitializer的实现,调用其初始化方法。
我们可以看到,在spring-cloud-context的项目中,自动注入了BootstrapConfiguration的实现。
在springcloud规范中,提供了PropertySourceBootstrapConfiguration 继承ApplicationContextInitializer。另外还提供了PropertySourceLocator,两者配合完成配置中心的接入。
看这个initialize初始化逻辑,会获取容器中所有PropertySourceLocator实现。然后调用其locateCollection方法进行配置的获取。获取到配置后,调用insertPropertySouorces方法将所有的PropertySource添加到Spring的环境变量environment中。
项目引入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
注解注入BootStrapConfiguration
的实现类。NacosConfigBootstrapConfiguration
。
NacosConfigBootstrapConfiguration
我们可以发现,在这个配置类中,向容器中注入了NacosPropertySourceLocator
,它实现PropertySourceLocator接口。
NacosPropertySourceLocator#locate方法如下。 nacosConfigProperties配置类,读取前缀spring.cloud.nacos.config的配置项。
ConfigService是通过nacosConfigProperties创建的对象。默认是NacosConfigService。
loadSharedConfiguration
加载spring.cloud.nacos.config.shared-configs下面配置dataId,group对应的nacos上的配置数据。
loadExtConfiguration
加载spring.cloud.nacos.config.extension-configs下面配置dataId,group对应的nacos上的配置数据。
loadApplicationConfiguration
加载应用配置。根据spring.cloud.nacos.config下配置的文件名,group,后缀名等取nacos获取配置。
还会从environment中获取profile,拼接到dataId名称中,获取当前运行环境的配置
。
@Overridepublic PropertySource<?> locate(Environment env) {nacosConfigProperties.setEnvironment(env);// 获取ConfigServiceConfigService configService = nacosConfigManager.getConfigService();if (null == configService) {log.warn("no instance of config service found, can't load config from nacos");return null;}long timeout = nacosConfigProperties.getTimeout();nacosPropertySourceBuilder = new NacosPropertySourceBuilder(configService,timeout);String name = nacosConfigProperties.getName();// 构建应用配置的名称前缀String dataIdPrefix = nacosConfigProperties.getPrefix();if (StringUtils.isEmpty(dataIdPrefix)) {// spring.cloud.nacos.config.p