前有了解过disconf,也知道它是基于zookeeper来做的,特意写了文章记录下自己的见解。如有错误,欢迎指正。
1、disconf-web会在启动时,将自身的host和配置文件注册到zookeeper上。配置文件会在zk上生成node。
2、client 端启动时,会有一个BeanDefinitionRegistryPostProcessor的实现类DisconfMgrBean,该类主要你实现了扫描(firstScan,加载系统配置和配置文件,进行包扫描并入库,然后获取获取数据/注入/Watch。)、注册DisconfAspectJ(切面,判断是否启用了ENABLE_DISCONF注解,返回disconf仓库中对应的属性值) 和 bean属性注入(获取仓库中对应的属性值,通过setMethod.invoke或者field.set方法来设置值)。
3、disconf的配置动态更新借助于zk的watch机制(watch机制是zk 3大重要内容之一,其余两个是zk协议和node存储模型)实现的,初始化流程会中会对配置文件注册watch,这样当配置文件更新时,zk会通知到client,然后disconf-client再从disconf-web中获取最新的配置并更新到本地,这样就完成了配置动态更新。
小结:disconf更新配置 -> disconf-web保存配置到DB->更新zookeeper上node信息 -> zookeeper通知client有配置更新 -> client 从 disconf-web下载对应配置 -> 更新仓库和bean属性 -> 调用回调信息到ZK,让ZK知道已经更新了node -> 更新配置完成。