文章插图
getServerConfig 方法会构造最终的 http 请求参数进行调用 , 如果返回 ok , 则将返回内容写入到本地缓存文件中,并进行返回 。
文章插图
至此,在项目启动的时候(上下文准备阶段)我们就拉到了远程 Nacos 中的配置,并且封装成 NacosPropertySource 放到了 Spring 的环境变量里 。
监听器注册上面章节我们说了服务启动的时候从远程 Nacos 服务端拉到配置,这个章节我们来说下配置变动怎么实时通知到客户端,首先需要注册监听器 。
主要看 NacosContextRefresher 类,该类会监听服务启动发布的 ApplicationReadyEvent 事件,然后进行配置监听器的注册 。
文章插图
registerNacosListenersForApplications 方法里会进行判断,如果自动刷新机制是开启的 , 则进行监听器注册 。上个章节我们说到了会将拉到的配置缓存到 NacosPropertySourceRepository 中,这儿就从缓存中获取所有的配置 , 然后循环进行监听器注册(如果配置文件中配置refresh 字段为 false,则不注册监听器) 。
文章插图
我们可以看到 , 监听器是以 dataId + groupId + namespace 为维度进行注册的 , 监听器的主要操作就三步 。
- REFRESH_COUNT ++,在上述说的 loadNacosPropertySource 方法有用到
- 往 NacosRefreshHistory#records 中添加一条刷新记录
- 发布一个 RefreshEvent 事件,该事件是 SpringCloud 提供的,主要就是用来做环境变更刷新用的
文章插图
注册操作经过 ConfigService,在 ClientWorker 中处理,这块会创建一个 CacheData 对象 , 该对象主要就是用来管理监听器的,也是非常重要的一个类 。
文章插图
CacheData 中字段如下图 , ManagerListenerWrap 对 Listener 做层包装,内部会保存 listener、上次变更的 content 以及 md5(用来判断配置有没有变更用) 。
文章插图
文章插图
并且在 addCacheDataIfAbsent 方法中会将刚才创建的 CacheData 缓存到 ClientWorker 中的一个 Map 中,后续会用到 。
文章插图
至此,在服务启动后向每一个需要支持热更新的配置都注册了一个监听器,用来监听远程配置的变动 , 以及做相应的处理
配置热更新上面章节我们讲了服务启动的时候从远程 Nacos 服务端拉到配置 , 以及服务启动后对需要支持热更新的配置都注册了一个监听器,这个章节我们来说下配置变动后具体是怎么处理的 。
回到上述说过的 NacosPropertySourceLocator 的 locate 方法看看,该方法首先会获取一个 ConfigService 。
文章插图
NacosConfigManager 中会进行一个 ConfigService 单例对象的创建 , 创建流程最终会委托给 ConfigFactory,使用反射方式创建一个 NacosConfigService 的实例对象,NacosConfigService 是一个很核心的类,配置的获取 , 监听器的注册都需要经此 。
文章插图
我们看下 NacosConfigService 的构造函数,会去创建一个 ClientWorker 类的对象,这个类是实现配置热更新的核心类 。
文章插图
ClientWorker 的构造函数里会去创建两个线程池,executor 会每隔 10ms 进行一次配置变更的检查 , executorService 主要是用来处理长轮询请求的 。
文章插图
checkConfigInfo 方法中会创建一个长轮询任务丢到 executorService 线程池中去处理 。
文章插图
LongPollingRunnable 的 run 方法代码有点多,主要流程如下:
- 获取上个章节中说到的缓存 cacheMap,然后遍历,判断如果该配置使用的是本地缓存模式,则调用 checkListenerMd5 去检查读到的本地缓存文件中内容的 Md5 跟上次更新的 Md5 是不是一样,不一样则调用 safeNotifyListener 去通知监听器处理,并且更新 listenerWrap 中的 content、Md5
推荐阅读
- 一个 MySQL 隐式转换的坑,差点把服务器整崩溃了
- 七 SpringCloud - 微信支付
- 05 uniapp/微信小程序 项目day05
- 第2-1-5章 docker安装MinIO实现文件存储服务-springboot整合minio-minio全网最全的资料
- 04 uniapp/微信小程序 项目day04
- 上 我服了!SpringBoot升级后这服务我一个星期都没跑起来!
- 微信小程序canvas 证件照制作
- uniapp/微信小程序 项目day03
- 第2-1-4章 SpringBoot整合FastDFS文件存储服务
- applewatchseries7可以微信支付吗_applewatch微信支付怎么用