【Spring Cloud Alibaba系列】深入 Nacos Config 核心源码

427 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

PropertySourceLocator

接着开始进行配置加载,回到启动类的run方法,调用PropertySourceContext

public configurableApplicationContext run(String... args){
	prepareContext(context,environment,listeners,applicationArguments,printedBanner);
}

prepareContext 刷新应用上下文的准备阶段,然后调用applyInitializers

private void prepareContext(ConfigurableApplication context,ConfigurableEnvironment environment,SpringApplicationListeners,ApplicationArguments applicationArguments,Banner printedBanner){
	applyInitializers(context);
}

applyInitializers方法主要执行容器中的ApplicationContextInitializer,它的作用是在应用上下文初始化时做一系列操作。

protect void applyInitializers(ConfigurableApplicationContext context){
	for(ApplicationContextInitializer initializer:getInitializers()){
	Class<?>  type = GenericTypeResolver.resolveTypeArgument(initializer.getClass(),ApplicationContextInitializer.class);
	Assert.isInstanceOf(type,context,"unable to initializer!");
    initializer.initialize(context);
    }
}

PropertySourceBootstrapConfiguration 实现ApplicationContextInitializer接口,在applyInitializers方法调用initialize方法,最后调用PropertySourceBootstrapConfiguration中的initialize方法。

public void initialize(ConfigurableApplicationContext applicationContext){
 	Iterator iterator = this.propertySourceLocators.iterator();
 	while(iterator.hasNext()){
 		PropertySourceLocator propertySourceLocator =(PropertySourceLocator)iterator.next();
 		PropertySource<?> source= propertySourceLocator.locate(environment);
 	}
}

PropertySourceLocator 接口作用是实现应用外部化配置可动态加载,而NacosPropertySourceLocator实现了这个接口,locator.locate调用的是NacosPropertySourceLocator的locate方法。

在NacosPropertySourceLocator的locate方法中将存放在NacosServer中的配置信息读取,把相关的配置信息存到PropertySource实例并返回。

深入 Nacos Config 核心源码

Spring Cloud Alibaba Nacos Config 中通过Context.getEnvironment.getProperty("Key")获取Nacos Config服务器上的数据,重点的实现类是NacosPropertySourceLocator,方法中包含locate(),

它的作用:

  • 初始化ConfigService对象,它是Nacos客户端提供的用于访问实现配置中心基本操作的类。
  • 加载配置、扩展配置、应用名称对应的配置
public PropertySource<?> locate(Environment environment){
	ConfigService configService=nacosConfigProperties.configServiceInstance();
	nacosPropertySourceBuilder=new NacosPropertyBuilder(ConfigService,timeout);
	loadSharedConfiguration(composite);
	loadExtConfiguration(composite);
	loadApplicationConfiguration(composite,dataIdPrefix,nacosCOnfigProperties,environment);
}

接着查看loadApplicationConfiguration方法深入

private Properties loadNacosData(String dataId,String group,String fileExtension){
	String data = null;
	try{
	data = configService.getConfig(dataId,group,timeout);
	Properties properties=NacosDataParserHandler.getInstance().parseNacosData(data,fileExtension);
	return properties == null? EMPTY_PROPERTIES:properties;
	}
	return EMPTY_PROPERTIES;
}