Disconf (version : 2.6.21)
通常我们会做如下配置:(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 (version : 2.6.21)的更多相关文章
- SQL Server中TempDB管理(version store的逻辑结构)
原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ...
- MyBatis 支持的扩展点(version:3.2.7)
从 [MyBatis 原码解析(version:3.2.7)] 中,我们得知,MyBatis去执行SQL都是通过 DefaultSqlSession 中的工具方法去执行的. 那么问题来了,MyBati ...
- Dubbo原码解析(version:2.5.3)
一.启动dubbo借助spring的schemas来启动(dubbo.jar/META-INF/spring.schemas).在dubbo.jar/META-INF/spring.handlers里 ...
- 编译最新linux内核(version 4.4.2)
环境:centos6.4 内核版本为2.6.32 目标:编译4.4.2内核,升级到 4.4.2 准备工作: 安装开发库和ncurses库 # yum groupinstall "Develo ...
- MyBatis 原码解析(version:3.2.7)
mybatis-plus 实践及架构原理.pdf mybatis-plus思维导图 首先,我们看使用原生的JDBC来操作数据库的方式: // 1. 获取JDBC Connection Connecti ...
- Elastic-Job原理分析(version:2.1.4)
当当的Elastic-Job开源出了两种分布式Job的解决方案:1. elastic-job-lite,这是一个无中心节点的调度: Elastic-Job-Lite定位为轻量级无中心化解决方案,使用j ...
- 从零开始CSS(一 2016/9/21)
1.基础语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector {declaration1; declaration2; ... declarationN } 选择器通 ...
- LTS原理分析(version:1.6.9)
LTS做到分布式唯一执行的原理:LTS采用类似Hadoop作业提交的方式,由JobClient submit作业任务给JobTracker,然后JobTracker会预生成一批作业任务的执行时间记录( ...
- 数据分析First week(7.15~7.21)
描述统计学 当我们面对大量信息的时候,经常会出现数据越多,事实越模糊的情况,因此我们需要对数据进行简化,描述统计学就是用几个关键的数字来描述数据集的整体情况. 1.集中趋势 1.1 众数 众数是样本观 ...
随机推荐
- jquery 中 $ 符的意义
$()就是一个函数名,别把它想得这么神奇.$就是一个字符,比如function a(){};function $(){};是一样的.只是jquery中习惯用$函数来作为对象化的入口而已.你也可以把jq ...
- WebRTC网关服务器单端口方案实现
标准WebRTC连接建立流程 这里描述的是Trickle ICE过程,并且省略了通话发起与接受的信令部分.流程如下: 1) WebRTC A通过Signal Server转发SDP OFFER到Web ...
- js学习(一)-对象和函数概念
//-----------------------js代码-------------------- function class1(){ //类成员的定义及构造函数 this.name = ...
- Java设计模式(9)适配器模式(Adapter模式)
适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用 ...
- A SIMPLE LIBRARY TO BUILD A DEEP ZOOM IMAGE
My current project requires a lot of work with Deep Zoom images. We recently received some very high ...
- HOW-TO GEEK SCHOOL
This How-To Geek School class is intended for people who want to learn more about security when usin ...
- 【Qt开发】QThread 实用技巧、误区----但文档中没有提到
本文主要内容: 在任务一中,用 四 种方式实现:点击界面按钮,开线程运行一段程序,结果显示在一个Label上.1. 用不正确的方式得到看似正确的结果2. 用Qt Manual 和 例子中使用的方法3. ...
- (笔记)Mysql命令select:当前选择(连接)的数据库
select命令表示当前选择(连接)的数据库. select命令格式:mysql> select database(); MySQL中SELECT命令类似于其他编程语言里的print或者writ ...
- substitute 命令与 global 命令
他们是很强大的EX命令: substitute的格式: :[range]s[ubstitute]/{pattern}/{string}/{flags} 其中的patttern 指的是正则表达式的匹配: ...
- Java如何处理已检查异常?
在Java编程中,如何处理已检查异常? 此示例显示如何使用catch块处理已检查的异常. package com.yiibai; public class HandleCheckedException ...