Disconf
通常我们会做如下配置:(disconf 2.6.21)
<!-- 一次扫描 -->
<bean id="disconfMgrBean" class="com.baidu.disconf.client.DisconfMgrBean"
destroy-method="destory">
<property name="scanPackage" value="com.cn.biz.config" />
</bean>
<!-- 二次扫描 -->
<bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond"
init-method="init" destroy-method="destory">
</bean>
一次扫描:
0. ConfigMgr.init();初始化disconf-client端基础配置。
disconf_sys.properties注入到DisClientSysConfig (文件下载路径等等.....)
disconf.properties注入到DisClientConfig (环境信息等等)
1. 静态解析:解析scanPackage包下面的java类,将client端的Disconf pojo对象利用反射进行解析(Reflections工具包),组装成数据结构ScanStaticModel
/**
* 扫描静态存储的对象
*/
public class ScanStaticModel { private Reflections reflections; // 所有的@DisconfFile标记的类
private Set<Class<?>> disconfFileClassSet; // 所有的@DisconfFileItem标记的method
private Set<Method> disconfFileItemMethodSet; // @DisconfFile与@DisconfFileItem对应关系的Map
private Map<Class<?>, Set<Method>> disconfFileItemMap; // 配置ITEM
private Set<Method> disconfItemMethodSet; // 主从切换的回调函数类
private Set<Class<?>> disconfActiveBackupServiceClassSet; // 更新 回调函数类
private Set<Class<?>> disconfUpdateService; ..........
}
2. 根据基础配置,将静态解析的ScanStaticModel转换成DisconfCenterFile,为从disconf-web端下载配置文件做准备
3. 连接Zookeeper,使用ConnectionWatcher监控连接事件
4. 根据DisconfCenterFile中的信息,从disconf-web端下载properties文件,解析并存放到DisconfCenterFile.keyMaps <key:配置项名称, value:配置值>
同时,对文件进行监控,变更后通知到NodeWatcher。(NodeWatcher触发时,会更新DisconfCenterFile.keyMaps,并将值重新注入到Disconf pojo属性中),与二次扫描时的第2点类似
------------------------------------
Spring容器启动,注入了切面DisconfAspectJ,所有的带有@DisconfFileItem的public方法,都会被拦截,取DisconfCenterFile.keyMaps中取值(也就是从disconf-web端下载properties文件中取值)进行返回
------------------------------------
二次扫描:
1. 注入回调方法(IDisconfUpdate的实现类)
2. 用一次扫描中DisconfCenterFile.keyMaps中的值,将Disconf pojo属性进行填充赋值,即注入数据至配置实体中
整体感觉数据结构比较混乱
既然有了切面DisconfAspectJ,二次扫描中将Disconf pojo属性进行填充赋值显得没有什么用。
确实,经过测试,去掉二次扫描的Bean DisconfMgrBeanSecond配置,也能够达到配置更改通知的效果。唯一缺少的就是配置更新后的IDisconfUpdate回调
感觉一二次扫描合成一次扫描,配置成一个Spring Bean,二次扫描的功能在bean上配置成一个开关
Disconf NodeWatcher是使用ZooKeeper.getData(String path, Watcher watcher, Stat stat)来实现的,ZooKeeper Watch事件是一个一次性的触发器,Watcher通知后每次又要注册一个新的NodeWatcher。不知有没有永久监听的方案?
这个可以用zkclient.jar curator.jar来做一直监听
--------------------------
disconf 2.6.36:
DisconfDataGetter.java : 获取配置项对应的值的API
Disconf的更多相关文章
- disconf搭建
简介: Distributed Configuration Management Platform(分布式配置管理平台) 它是百度的一套完整的基于zookeeper的分布式配置统一解决方案,具有如下特 ...
- 统一配置管理-百度disconf
之前一直采用properties文件管理配置信息,若是集群则每个机器上都要拷贝一份,每次修改也需要依次修改.一直在寻找统一修改,实时生效,方便修改,分环境分系统的配置管理,自己也在整理设计,若找不到合 ...
- 配置管理服务diamond和disconf横向对比
Diamond则是淘宝开源的一种分布式配置管理服务的实现 disconf是来自百度的分布式配置管理平台,包括百度.滴滴出行.银联.网易.拉勾网.苏宁易购.顺丰科技 等知名互联网公司正在使用! 对比项目 ...
- disconf系列【2】——解决zk部署情况为空的问题
如下图所示,在安装完成之后,发现zk(zookeeper)部署情况为空. 注:承接上篇,环境未发生改变. 1.解决zk没有启动的问题 查看disconf日志,发现zk没有启动. 实际情况是:zk已经启 ...
- disconf系列【1】——百度disconf在ubuntu14.04环境下的安装
disconf官网给出的安装文档默认读者已经非常熟练本文1.2章节给出的依赖软件的原理及使用方法,且官网默认安装环境为linux(windows安装方法只字未提).同时,官网对很多重要的细节语焉不详, ...
- disconf使用
1.创建app,确定version 2.创建配置文件redis.config 3.选择app下env环境,上传redis.config到disconf 4.创建disconf.properties到c ...
- disconf安装部署
1.client pom文件引入 <dependency> <groupId>com.baidu.disconf</groupId> <artifactId& ...
- disconf实践(二)
因为有些系统的配置文件会随着业务更改,如某些控制开关,当大批量集群时,按照上一篇文章的配置就不够啦,需要做到热加载. 研究了一下,还好,比较简单,只要替换上一篇文章第4步的配置文件(spring-di ...
- disconf实践(一)
公司目前的应用基本采用分布式部署,通过F5进行集群管理.分布式应用带来的好处是,随着流量的增加,可以快速扩展应用节点,分摊压力.分布式也会带来一定的挑战,譬如配置文件管理.如果某个配置要修改,那么所有 ...
随机推荐
- jdk环境配置
设置成用户变量就行,无需设置成系统变量. 1.在新弹出窗口上,点系统变量区域下面的新建按钮,弹出新建窗口,变量名为JAVA_HOME,变量值填JDK安装的最终路径,我这里装的地址是D:\Program ...
- 小技巧:addobject: 和 addobjectsFromArray 的区别
NSArray *array1 = [NSArray alloc]init]; NSArray *array2 = [NSArray alloc]init]; [array1 addobject: a ...
- oracle行转列,decode 等用法
DECODE()函数,它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值.函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式.当然,如果未能与任何一个实参序偶匹配成功,则函数也有默 ...
- MVC+UnitOfWork+Repository+EF 之我见
UnitOfWork+Repository模式简介: 每次提交数据库都会打开一个连接,造成结果是:多个连接无法共用一个数据库级别的事务,也就无法保证数据的原子性.一致性.解决办法是:在Reposito ...
- 《The Evolution of Lua》翻译part 2
Lua2 1990年的时候,面向对象迈向巅峰,对于Lua没有面向对象的支持,我们受到了很大的压力.我们不想将Lua变成面向对象,因为我们不想“修复”一种编程范式(fix a programming p ...
- Centos 6.7 安装smokeping (最完整教程)
本教程需要的源码包一并上传了,届时可以直接上传到linux系统里面! 需要编译的fping.echoping.smokeping源码包,链接:http://pan.baidu.com/s/1pL4HL ...
- Oracle 常用修改字段SQL语句
1. 更新字段名称 alter table table_name rename column column_old to column_new; 2. 添加字段 ); 3. 删除字段 alter ta ...
- 随机生成UUID(GUID)的方法
- (NSString *)UUID { CFUUIDRef uuid_ref = CFUUIDCreate(NULL); CFStringRef uuid_string_ref= CFUUIDCre ...
- 调用外部js文件测试
test <p><img id="img" onclick="javascript:var s=document.createElement('scri ...
- Hbuilder与svn快速连接并在手机上测试页面
大家好,今天讲一下Hbuilder怎样与svn连接在一起,并且在移动端上面做真是的页面测试. 1,打开Hbuilder软件,在工具中,安装插件,找到svn插件安装. 2.点击文件,导入,从svn中检测 ...