springcloudalibabanacosclient⾃动获取配置启动流程springcloudalibaba nacos客户端 ⾃动获取配置 启动流程
1.spring.factories中有引导程序配置项:org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration,\
org.springframework.fig.PropertySourceBootstrapConfiguration
引导程序配置项相当于application中的autoconfiguration配置,在bootstrap中使⽤。
2.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration会注册2个bean
nacosConfigProperties
nacosPropertySourceLocator
3.nacosConfigProperties会⾃动加载spring.fig的配置项⽬,这⾥定义了nacos config服务器的连接信息, 需访问的配置项信息
4.nacosPropertySourceLocator的locate⽅法会实例化⼀个configService(),创建nacosPropertySourc
eBuilder,nacosPropertySourceBuilder⾥封装了对nacos config服务器的访问,通过配置属性⽣成nacos配置项名称
locate⽅法由bootstrap上下⽂的SpringApplication.prepareContext⽅法中的applyInitializers⾥的PropertySourceBootstrapConfiguration.initialize调⽤
4.1实例化⼀个configService
创建⼀个httpagent
启动agent,这⾥如果只配置了endpoint,会启动定时器访问地址服务器来刷新服务器地址列表
创建⼀个ClientWorker,这⾥后⾯会⽤到
4.1.1实例化ClientWorker
clinetworker⾥创建了2个调度线程池,并启动 固定延迟策略(上⼀个任务执⾏完之后延迟多少时间) 调度长轮询管理器线程
长轮询管理器线程池,通过执⾏checkConfigInfo来管理 长轮询线程池 执⾏longPolling线程,(线程数量=cacheMap的配置数量/每个长轮询线程处理的配置数量)
cacheMap在ApplicationReader事件中由NacosContextRefresher监听修改,这⾥为空,暂时不会启动长轮询线程
长轮询线程池,执⾏longPolling线程(⾃注册的线程,每次执⾏完会重新注册⼀个任务),检测配置变更,并更新缓cacheMap
1.checkLocalConfig
2.checkUpdateDataIds
先获取有变化的ID,checkUpdateDataIds
然后轮询获取配置,getServerConfig
长轮询管理器线程池线程名
com.alibaba.nacos.client.Worker.${agentName}
长轮询线程池线程名
com.alibaba.nacos.client.Worker.longPolling.${agentName}
5.分别加载配置
loadSharedConfiguration(composite);  // 加载nacos共享配置
loadExtConfiguration(composite); //加载ext配置
loadApplicationConfiguration(composite, dataIdPrefix, nacosConfigProperties, env);//加载应⽤配置,默认是刷新的
最终调⽤loadNacosDataIfPresent访问nacos服务器获取配置项(不可刷新的NacosPropertySourceRepository优先,这⾥刚启动肯定为空)
以上加载的配置项⽬保存在composite(CompositePropertySource)中,名字为NACOS
6.loadNacosDataIfPresent
通过nacosPropertySourceBuilder.build获取nacosPropertySource并添加到composite的最前⾯
7.nacosPropertySourceBuilder.buildbootstrap项目
通过loadNacosData获取Properties创建nacosPropertySource,并添加到仓库中
8.loadNacosData
通过Config获取配置数据,并根据扩展名解析配置数据得到Properties
优先读取本地配置(故障转移⽂件nacos/config/${agentName}_nacos/data/config-
data/${group}/${dataId})Failover,⾮空就返回
读取nacos服务器配置
如果是鉴权失败就抛出异常,其他失败则读取快照 (快照⽂件nacos/config/${agentName}_nacos/snapshot/${group}/${dataId}) Snapshot,返回
ServerConfig
读取nacos服务器配置 /v1/cs/configs,写快照⽂件