• diamond源码阅读-循环探测配置信息是否变化rotateCheckConfigInfo


    rotateCheckConfigInfo 这是一个定时任务,循环调用

     /**
         * 循环探测配置信息是否变化,如果变化,则再次向DiamondServer请求获取对应的配置信息
         */
        private void rotateCheckConfigInfo() {
            scheduledExecutor.schedule(new Runnable() {
                public void run() {
                    if (!isRun) {
                        log.warn("DiamondSubscriber不在运行状态中,退出查询循环");
                        return;
                    }
                    try {
                        checkLocalConfigInfo();
                        checkDiamondServerConfigInfo();
                        checkSnapshot();
                    }
                    catch (Exception e) {
                        e.printStackTrace();
                        log.error("循环探测发生异常", e);
                    }
                    finally {
                        rotateCheckConfigInfo();
                    }
                }
    
            }, bFirstCheck ? 20 : diamondConfigure.getPollingIntervalTime(), TimeUnit.SECONDS);
            bFirstCheck = false;
        }
    

    1.从本地读取配置信息checkLocalConfigInfo

    1.1 读取配置信息

    String configInfo = getLocalConfigureInfomation(cacheData);
    

    1.2 将订阅信息抛给客户的监听器

    popConfigInfo(cacheData, configInfo);
    

    1.2.1 核心代码

    subscriberListener.receiveConfigInfo(configureInfomation);
    //发送http请求到服务器获取订阅信息
    //取得DefaultDiamondManager的ManagerListener,回调Listener
    //并将结果抛给客户的监听器
    saveSnapshot(dataId, group, configInfo);
    //保存快照到本地
    

    2 从服务器获取配置信息checkDiamondServerConfigInfo

    2.1 从DiamondServer获取值变化了的DataID列表

    Set<String> updateDataIdGroupPairs =        checkUpdateDataIds(diamondConfigure.getReceiveWaitTime());
    

    2.2 向DiamondServer请求dataId对应的配置信息,并将结果抛给客户的监听器 receiveConfigInfo。以下代码在线程池处理

    String configInfo =getConfigureInfomation(cacheData.getDataId(), cacheData.getGroup(),diamondConfigure.getReceiveWaitTime(), true);
    popConfigInfo(cacheData, configInfo);
    

    2.2.1 getConfigureInfomation

     String getConfigureInfomation(String dataId, String group, long timeout, boolean skipContentCache) //554行
    

    2.2.1.1 start(); 又调用了一遍。getConfigureInfomation就是在start()里调用的,不明白了。注释掉也正常,因为取数据没有异常。

    可能是重新初始化信息,不会使用过期的东西
    

    2.2.1.2 缓存获取到直接返回

    使用带有TTL的cache,

    2.2.1.3 缓存获取不到从服务器获取,有重试次数

    http请求:路径/diamond-server/config.co

    • 200 getSuccess
      获取配置信息,MD5校验,lastModifiedHeader等,放到本地缓存contentCache,设置新的消息轮询间隔时间
    • 304 MD5校验 设置新的消息轮询间隔时间
    • 404 删除本地快照
    • 503 获取下一个服务器地址

    3 检查本地快照,从本地快照获取信息checkSnapshot,触发监听器

    4 重复以上过程,循环检测rotateCheckConfigInfo();

  • 相关阅读:
    keepalived两台机器同时出现vip问题
    consul概念及架构方式
    haproxy+keepalived
    Hadoop、Spark——完全分布式HA集群搭建
    hadoop集群+spark集群部署
    hadoop原理分析
    RedisCluster集群
    配置透明代理squid支持https与http
    kubernetes的Kubeproxy的iptables转发规则
    【转】阿里技术专家Java零售Saas岗位两个小时面试经验
  • 原文地址:https://www.cnblogs.com/clds/p/6000771.html
Copyright © 2020-2023  润新知