一、基础概念
disconf是一个分布式配置管理平台(Distributed Configuration Management Platform),专注于各种 分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务,是一套完整的基于zookeeper的分布式配置统一解决方案。
目前disconf包含了 客户端disconf-Client和 管理端disconf-Web两个模块,均由java实现。
1.1 功能特点
- 支持配置(配置项/配置文件)分布式管理
- 配置发布统一化
- 配置发布、更新统一化,同一个上线包 无须改动配置 即可在 多个环境中(RD/QA/PRODUCTION) 上线
- 配置更新自动化:用户在平台更新配置,使用该配置的系统会自动发现该情况,并应用新配置。特殊地,如果用户为此配置定义了回调函数类,则此函数类会被自动调用
- 上手简单,基于注解或者xml配置方式
功能架构如下
二、架构原理
代码架构如下
2.1.动态更新机制
disconf的配置动态更新借助于zk的watch机制(watch机制是zk 3大重要内容之一,其余两个是zk协议和node存储模型)实现的,初始化流程会中会对配置文件注册watch,这样当配置文件更新时,会通知到discnof-client,然后disconf-client再从disconf-web中获取最新的配置并更新到本地,这样就完成了配置动态更新。
更新流程:
开发人员在前端更新配置 -> disconf-web保存数据并更新zookeeper -> zookeeper通知disconf-client -> discnof-client 从 disconf-web下载对应配置 -> 更新仓库和bean属性 -> 调用回调 -> 更新配置完成。
2.2.disconf-client 初始化流程
关于disconf-client的初始化,联想到Spring IoC流程,我们先不看代码,可以猜想一下其大致流程,disconf-client首先需要从disconf服务端获取配置,然后等到IoC流程中创建好对应的bean之后,将对应的配置值设置到bean中,这样基本上就完成了初始化流程,其实disconf的初始化实现就是这样的。
disconf-client的初始化开始于BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(Spring IoC初始化时,对于BeanDefinitionRegistryPostProcessor的实现类,会调用其postProcessBeanDefinitionRegistry方法),disconf的DisconfMgrBean类就是BeanDefinitionRegistryPostProcessor的实现类,DisconfMgrBean类的bean配置在哪里呢?其实就是disconf.xml中的配置,该配置是必须的,示例如下:
<!-- 使用disconf必须添加以下配置 -->
<bean id="disconfMgrBean" class="com.baidu.disconf.client.DisconfMgrBean"
destroy-method="destroy">
<property name="scanPackage" value="com.luo.demo"/>
</bean>
<bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond"
init-method="init" destroy-method="destroy">
</bean>
参考文献
1.disconf原理 “入坑”指南。https://www.cnblogs.com/xiangnanl/p/9865269.html
2.官方文档 https://disconf.readthedocs.io/zh_CN/latest/