springcloudalibaba nacosclient自动获取配置 启动流程
springcloudalibaba nacos客户端 自动获取配置 启动流程 1.spring.factories中有引导程序配置项:org.springframework.cloud.bootstrap.BootstrapConfiguration= com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration, org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration 引导程序配置项相当于application中的autoconfiguration配置,在bootstrap中使用。
2.com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration会注册2个bean nacosConfigProperties nacosPropertySourceLocator 3.nacosConfigProperties会自动加载spring.cloud.nacos.config的配置项目,这里定义了nacos config服务器的连接信息, 需访问的配置项信息 4.nacosPropertySourceLocator的locate方法会实例化一个configService(),创建nacosPropertySourceBuilder, 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.build 通过loadNacosData获取Properties创建nacosPropertySource,并添加到仓库中 8.loadNacosData 通过configService.getConfig获取配置数据,并根据扩展名解析配置数据得到Properties 9.getConfigInner 优先读取本地配置(故障转移文件nacos/config/${agentName}_nacos/data/config-data/${group}/${dataId})LocalConfigInfoProcessor.getFailover,非空就返回 读取nacos服务器配置 worker.getServerConfig 成功就返回 如果是鉴权失败就抛出异常,其他失败则读取快照 (快照文件nacos/config/${agentName}_nacos/snapshot/${group}/${dataId}) LocalConfigInfoProcessor.getSnapshot,返回
10.worker.getServerConfig 读取nacos服务器配置 /v1/cs/configs,写快照文件
