配置中心
在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名称中,获取当前运行环境的配置
。
@Override
public PropertySource<?> locate(Environment env) {
nacosConfigProperties.setEnvironment(env);
// 获取ConfigService
ConfigService 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