目录
一.nacos service启动,将配置信息Dump磁盘上,并且推送客户端
nacos config 源码架构图 (完整版)
http://assets.processon.com/chart_image/6378a4d1f346fb01d4141010.png
下文配置为略缩图,完整版点击链接在线查看⬆️⬆️⬆️
一.nacos service启动,将配置信息Dump磁盘上,并且推送客户端
- spring构建bean的过程中会执行ExternalDumpService内的@PostConstruct 的初始化方法
- DumpService# dumpConfigInfo 将数据库configinfo表全量查询出来,根据mysql 主键最大ID ,分页1000 循环查询
- 然后写入磁盘文件中,每隔6h 自动刷新一次,如果本地磁盘已存在则不保存
- updataMd5 方法内,判断md5 是否为空 或者不同,然后更新本地缓存
- 发布本地数据事件, NotifyCenter.publishEvent(new LocalDataChangeEvent(groupKey));
- RpcConfigChangeNotifier#onEvent 监听到数据之后,拉取所以监听到客户端,发布rpc 任务,将最新配置信息 已push模式推送到nacos client
- ClientWorker#notifyListenConfig客户端接收到配置数据之后 会放入阻塞队列内,客户端会在阻塞队列内获取任务执行
二. 用户在nacos-console控制界面修改了配置
1.post请求:/nacos/v1/cs/configs,接收到请求之后,将数据持久化到mysql 上
2.发布ConfigDataChangeEvent 改变事件,将事件放入阻塞队列内,
- 放入nacos 异步执行任务中,
- 如果放入队列失败,会触发notifySubscriber任务 异步通知订阅者
- 通知客户端配置发生了变更,同时通知集群内其他节点
- 刷新本地磁盘
获取配置流程 本地缓存 <<--- 本地磁盘 ----<< mysql 库
三 . nacos client 启动
1.spring Application.run 开启java.awt.headless模式,获取启动类,然后启动监听
2.prepareEnvironment 初始化环境.....
3.prepareContext 准备环境,获取nacos配置中心服务,加载共享配置文件,加载扩展配置文件,加载当前应用程序配置文件
4. loadNacosPropertySource 去拉取配置信息,查询本地是否有缓存,没有则 rpc远程调用配置中心,获取配置之后保存本地磁盘,且加载到map 缓存中
5.listeners.running(context); 发布 ApplicationReadyEvent 事件
6.NacosContextRefresher.onApplicationEvent 接收到事件之后 会将每个dataId 注册监听,当用户发布新的配置会回调listener
未完待续....
四.nacos 配置中心启动相关的配置
RefreshAutoConfiguration
spring-cloud-context-2.2.9.RELEASE.jar/META-INF/spring.factories
- 在服务启动后 RefreshAutoConfiguration 类 会初始化@bean ,RefreshEventListener用于处理RefreshEvent事件,
- 把之前的Environment里面的参数放到一个新建的spring context 容器下重新加载,完事之后关闭容器,获取参数的新值
- 然后发布环境参数改变事件
- 清除scope里面的缓存,会获取到新的一个实例
NacosConfigAutoConfiguration
spring-cloud-starter-alibaba-nacos-config-2.2.8.RELEASE.jar/META-INF/spring.factories
1.服务启动时初始化 NacosContextRefresher , 注册nacos 监听,
NacosConfigBootstarpConfig
spring-cloud-starter-alibaba-nacos-config-2.2.8.RElEASE.jar/META-INF/spring.factories
- 初始化NacosConfigProperties、 NacosConfigManager、NacosPropertySourceLocator...
- NacosConfigManager 初始化,通过反射调用NacosConfigService 的构造器
- startInternal(); 通过线程池执行延时任务,while +阻塞队列实现轮训
- 根据根据变化的dataid 调用nacos config 服务端获取配置信息,并跟更新本地快照
- 通过listener.receiveConfigInfo(contentTmp);对有变化的配置进行监听
- 发布发布RefreshEvent事件