Nacos——配置中心源码详解
本文基于1.4.3版本
GitHub地址:https://github.com/alibaba/nacos/releases
配置中心
客户端的配置有两种方式来维持,一是客户端主动获取,二是客户端长轮询更新
关于配置文件有几个类型要说明一下:
1.本地配置文件:本地就已经存在的配置文件
2.本地缓存文件:从服务端获取的保存在了本地(本地生成了文件)
3.cacheData缓存数据:内存中缓存的配置文件数据
客户端主动获取
客户端
从ConfigExample中我们可以得知,获取配置的方法为NacosConfigService.getConfig:
1.优先从本地配置中获取
2.本地配置中没有则会去服务端获取
3.服务端异常且异常不是因为鉴权失败,则从本地缓存文件中获取
我们来到ClientWorker.getServerConfig方法里面:
1.发起HTTP请求,URL:/v1/cs/configs
2.请求后不管怎样都会先创建一个本地缓存文件,只不过成功的会带有数据以及文件类型
服务端
ConfigController.getConfig
除去前面的参数校验以及处理,直接看ConfigServletInner.doGetConfig方法:
(里面判断分支太多就不截全部了,文件不是读数据库就是读本地文件)
1.获取读锁,获取不到就自旋重复获取10次
2.根据beta、tag、autoTag来判断读什么配置
3.PropertyUtil.isDirectRead()判断是读mysql还是读文件
4.使用jdk的零拷贝传输直接将文件输入流转response输出流
5.释放读锁
网上找的doGetConfig方法流程图
客户端长轮询更新
客户端
1.入口
在NacosConfigService初始化的时候,会初始化两个组件
- 一是网络组件,也就是http数据处理的(起作用的是ServerHttpAgent)
- 二是客户端的长轮询ClientWorker
ClientWorker在初始化的时候就会初始化两个定时调度线程池,以及启动一个定时任务,该定时任务会执行ClientWorker.checkConfigInfo() 方法(10ms执行一次):