zoukankan      html  css  js  c++  java
  • 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;
    
    ..........
    }
    View Code

    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

  • 相关阅读:
    python笔记
    React+router和react+redux使用过程的记录
    jQuery源码分析随笔
    安装nodejs+ionic+cordova环境心得
    win10系统Nodejs安装包总是失败原因
    silverlight中dialogresult和close
    安卓HTTP访问的两种方式
    安卓Activity跳转的几种方式
    Android开发Content Provider
    web.xml中filter的用法
  • 原文地址:https://www.cnblogs.com/kevin-yuan/p/6188251.html
Copyright © 2011-2022 走看看