
SpringCloud Alibaba系列——2Nacos配置中心源码分析(下)
作者 | 宇木木兮
来源 |今日头条
承接SpringCloud Alibaba系列——2Nacos核心源码分析(上),学习目标和第1章内容在上一篇文章中,本文只介绍Nacos配置中心的核心流程及原理
第2章 配置中心
2.1 第一次加载
2.1.1 启动环境装载
PropertySourceBootstrapConfiguration
1.spring启动run方法
2.进入prepareEnvironment3.在事件监听中添加
ApplicationEnvironmentPreparedEvent
最终调用ApplicationListener的onApplicationEvent方法
路径为:multicastEvent方法->invokeListener方法->doInvokeListener方法
4.类
BootstrapApplicationListener 为ApplicationEnvironmentPreparedEvent事件后的处理5.bootstrapServiceContext方法中加载配置类
BootstrapImportSelectorConfiguration
进入到BootstrapImportSelectorConfiguration中就有点眼熟了,这实际上就是我们之前springboot里面通过自动装配自动装载的一个配置类。BootstrapImportSelectorConfiguration类如下:
它通过Import注解导入了BootstrapImportSelector类,而BootstrapImportSelector类实际上就是实现了DeferredImportSelector接口。后面的逻辑就是去ClassPath下面找spring.factories文件,然后装配
BootstrapConfiguration.class接口的实现类
6.添加BootstrapImportSelector类7.找BootstrapConfiguration的配置,共2个jar包
NacosConfigBootstrapConfiguration类
PropertySourceBootstrapConfiguration类8.重新回到run方法
9.prepareContext会调用applyInitializers方法10.该方法会执行所有实现了接口
ApplicationContextInitializer的initialize方法,而PropertySourceBootstrapConfiguration刚好为其实现类
2.1.2 initialize
调用
PropertySourceBootstrapConfiguration的initialize方法
1.调用initialize方法2.调用locateCollection方法
3.调用locator.locate(environment);走到实现类
NacosPropertySourceLocator加载循序为共享、扩展、自身,后续加载会替换之前加载,所以优先级为自身>扩展>共享
4.loadSharedConfiguration加载共享配置5.loadNacosConfiguration方法
6.loadNacosDataIfPresent方法
7.nacosPropertySourceBuilder.build方法8.loadNacosData方法
9.getConfigInner方法
10.getServerConfig方法
2.2 动态感应
1.我们刚才讲了再spring.factories里面,还加载了一个类
NacosConfigBootstrapConfiguration
2.NacosConfigBootstrapConfiguration类会把NacosConfigManager作为一个Bean注入3.实例化NacosConfigManager时会实例化NacosConfigService
实例化NacosConfigService
4.实例化NacosConfigService的时候,会调用构造方法
5.我们去看下ClientWorker
6.检查配置
7.LongPollingRunnable方法
checkLocalConfig检查本地配置三种情况:
- 如果isUseLocalConfifigInfo为false,但是本地缓存路径的文件是存在的,那么把isUseLocalConfifigInfo设置为true,并且更新cacheData的内容以及文件的更新时间
- 如果isUseLocalCOnfifigInfo为true,但是本地缓存文件不存在,则设置为false,不通知监听器
- isUseLocalConfifigInfo为true,并且本地缓存文件也存在,但是缓存的的时间和文件的更新时间不一致,则更新cacheData中的内容,并isUseLocalConfifigInfo设置为true
8.检查是否有配置改动
