一、配置中心源码解析
1.首先找到nacos读取配置的入口
1)找到nacos-config包下的spring.factories中的NacosConfigBootstrapConfiguration
2)NacosConfigBootstrapConfiguration会做两件事情,加载完成两个bean,一个是NacosConfigManager,另外一个是NacosPropertySourceLocator
先看NacosConfigManager是如何完成实例化操作的
然后再看createConfigService方法,该方法主要是为了创建ConfigService实例,创建的方式是通过反射来实现,对应的属性填充是由nacosConfigProperties来完成。
1>反射创建实例
2>nacosConfigProperties的assembleConfigServiceProperties方法来完成实例属性的填充
再看NacosPropertySourceLocator是如何实例化
该bean的实例化,是将上面生成好的nacosConfigManager以及nacosConfigProperites填充到当前类中
然后NacosPropertySourceLocator是继承了PropertySourceLocator类,重写了locate方法,此方法是由bootstrap上下文的SpringApplication.prepareContext方法中的applyInitializers里的PropertySourceBootstrapConfiguration.initialize调用
这个类是在SpringBoot启动的时候会去执行。找到SpringBoot启动的run方法,其中NacosPropertySourceLocator就是在prepareContext中开始执行。
然后找到prepareContext方法中的applyInitializers方法
找到PropertySourceBootstrapConfiguration类对应的initalize方法
initalize方法中遍历所有的PropertySourceLocator,然后再调用locateCollection,然后再调用PropertySourceLocator的子类NacosPropertySourceLocator的locate方法
然后再找到locate方法中的loadApplicationConfiguration方法,此方法就是开始准备要配置文件中的数据了。
然后找到loadNacosDataIfPresent方法,其中loadNacosPropertySource方法是最重要的一个方法,此方法中包含了获取配置的流程。
再找到NacosPropertySourceBuilder中的build方法
上图中真正加载配置数据的方法是loadNacosData方法
其中通过我们之前实例化好的ConfigService类,调用其getConfig方法获取配置数据
首先是通过dataId和group 来获取nacos本地配置
如果nacos的本地配置为空,则需要向服务端发送请求,获取服务配置。nacos 1.x 版本是通过http请求,在nacos 2.x 已经改为gRpc方式。
通过ClientWorker类的getServiceConfig来向服务端发送请求获取配置信息,其中ClientWorker在实例化的过程中也处理了一部分逻辑,这个后续来解释。
真正发送请求的是下图的代码
如果请求成功,则保存一份到本地,再返回。