文档章节

diamond源码阅读-diamond-client

穿林度水
 穿林度水
发布于 2016/11/07 14:27
字数 544
阅读 11
收藏 0

读取数据

DiamondManager manager = new DefaultDiamondManager("DEFAULT_GROUP", "zml", new ManagerListener() {
         public void receiveConfigInfo(String configInfo) {
             System.out.println("changed config: " + configInfo);
         }
 
         public Executor getExecutor() {
             return null;
         }
     }, "127.0.0.1");
     //设置diamond-server服务的端口
     manager.getDiamondConfigure().setPort(8080);
     String availableConfigureInfomation = manager.getAvailableConfigureInfomation(5000);
     System.out.println("start config: " + availableConfigureInfomation);
 }

1 初始化DefaultDiamondManager 并启动diamondSubscriber

 public DefaultDiamondManager(String group, String dataId, ManagerListener managerListener,String diamondServer) {
        this.dataId = dataId;
        this.group = group;

        diamondSubscriber = DiamondClientFactory.getSingletonDiamondSubscriber();

        this.managerListeners.add(managerListener);
        ((DefaultSubscriberListener) diamondSubscriber.getSubscriberListener()).addManagerListeners(this.dataId,
            this.group, this.managerListeners);
        String s[] = diamondServer.split(",");
        if (s != null && s.length > 0) {
            for (String o : s) {
                if (o != null && !o.trim().equals(""))
                    diamondSubscriber.getDiamondConfigure().getDomainNameList().add(o.trim());
            }
        }
        diamondSubscriber.addDataId(this.dataId, this.group);
        diamondSubscriber.start();
    }

1.1 diamondSubscriber.start();

 /**
     * 启动DiamondSubscriber:<br>
     * 1.阻塞主动获取所有的DataId配置信息<br>
     * 2.启动定时线程定时获取所有的DataId配置信息<br>
     */
    public synchronized void start() {
        if (isRun) {
            return;
        }

        if (null == scheduledExecutor || scheduledExecutor.isTerminated()) {
            scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
        }

        localConfigInfoProcessor.start(this.diamondConfigure.getFilePath() + "/" + DATA_DIR);//创建根目录并监控根目录C:\Users\zhumenglong/diamond/data
        serverAddressProcessor = new ServerAddressProcessor(this.diamondConfigure, this.scheduledExecutor);
        serverAddressProcessor.start();

        this.snapshotConfigInfoProcessor =
                new SnapshotConfigInfoProcessor(this.diamondConfigure.getFilePath() + "/" + SNAPSHOT_DIR);
        // 设置domainNamePos值
        randomDomainNamePos();
        initHttpClient();

        // 初始化完毕
        isRun = true;

        if (log.isInfoEnabled()) {
            log.info("当前使用的域名有:" + this.diamondConfigure.getDomainNameList());
        }

        if (MockServer.isTestMode()) {
            bFirstCheck = false;
        }
        else {
            // 设置轮询间隔时间
            this.diamondConfigure.setPollingIntervalTime(Constants.POLLING_INTERVAL_TIME);
        }
        // 轮询
        rotateCheckConfigInfo();

        addShutdownHook();
    }

1.1.1 http://www.cnblogs.com/clds/p/5997195.html

 localConfigInfoProcessor.start(this.diamondConfigure.getFilePath() + "/" + DATA_DIR);//创建根目录并监控根目录
       目录获取方式 System.getProperty("user.home") + "/diamond"; C:\Users\zhumenglong/diamond/data

//监控代码分析见 //核心思路起一个线程定时监听文件夹及子文件,判断文件是否增加删除//修改,
//保存到 localConfigInfoProcessor 的existFiles Map<String/* filePath */, Long/* version */>

1.1.2 serverAddressProcessor.start(); http://www.cnblogs.com/clds/p/6001396.html

 public synchronized void start() {
        if (isRun) {
            return;
        }
        isRun = true;
        initHttpClient();//初始化HttpClient
        if (this.diamondConfigure.isLocalFirst()) {
            acquireServerAddressFromLocal();//如果是本地,从本地获取服务器列表
        }
        else {
            synAcquireServerAddress();
            //如果不再异步每隔一段通过域名时间去取diamondIpList,注释掉下面这行
            //asynAcquireServerAddress();
            asynAcquireServerAddress();
        }

    }

1.1.3 randomDomainNamePos(); 随机获取服务器地址

   private void randomDomainNamePos() {
        // 随机化起始服务器地址
        Random rand = new Random();
        List<String> domainList = this.diamondConfigure.getDomainNameList();
        if (!domainList.isEmpty()) {
            this.domainNamePos.set(rand.nextInt(domainList.size()));
        }
    }

1.1.4 initHttpClient(); 初始化 httpClient 多线程

1.1.5 rotateCheckConfigInfo(); http://www.cnblogs.com/clds/p/6000771.html

1.1.6 addShutdownHook(); jvm关闭钩子

2 //设置diamond-server服务的端口

 manager.getDiamondConfigure().setPort(8080);

3 获取数据String availableConfigureInfomation = manager.getAvailableConfigureInfomation(5000);

  public String getAvailableConfigureInfomation(String dataId, String group, long timeout) {
        // 尝试先从本地和网络获取配置信息
        try {
            String result = getConfigureInfomation(dataId, group, timeout);
            if (result != null && result.length() > 0) {
                return result;
            }
        }
        catch (Throwable t) {
            log.error(t.getMessage(), t);
        }

        // 测试模式不使用本地dump
        if (MockServer.isTestMode()) {
            return null;
        }
        return getSnapshotConfiginfomation(dataId, group);//本地快照获取
    }

本文转载自:http://www.cnblogs.com/clds/p/6001376.html

穿林度水
粉丝 0
博文 250
码字总数 167120
作品 0
海淀
程序员
私信 提问
super-diamond配置管理系统

super-diamond 配置管理系统提供系统参数配置管理,例如数据库的配置信息等,配置参数修改以后可以实时推送到客户端(基于netty4), 方便系统动态修改运行参数。 可以建多个项目,每个项目分为...

蔡少东
2015/08/29
2.7K
0
分布式数据层-TDDL

注意:tddl2.0是2010年的版本,已经没有人维护了。当前版本是5.1.7,网上能够找到的最新版本。项目地址为:https://www.oschina.net/p/tddl5 淘宝根据自己的业务特点开发了TDDL(Taobao Dist...

匿名
2014/02/24
49.5K
5
ceph监控管理平台calamari

更新时间:20170803 (之前网盘链接被吞了) 前言 各种搜索无果,官方文档是基于Ubuntu,没有找到一篇清晰明朗的适合新手安装的centos7文档,之前测试环境倒腾过2次均不了了之,当集群正式跑出...

linux_wei
2017/07/06
0
0
#研发解决方案介绍#基于持久化配置中心的业务降级

郑昀 最后更新于2014/4/18 关键词:业务降级,配置中心,基本可用性, A.业务降级的背景知识: 淘宝就双十一课题曾经讲过: 『 所谓业务降级,就是牺牲非核心的业务功能,保证核心功能的稳定...

旁观者-郑昀
2015/01/27
164
0
淘宝JAVA中间件Diamond详解(1)-简介&快速使用

淘宝JAVA中间件Diamond详解(一)---简介&快速使用 大家好,今天开始为大家带来我们通用产品团队的产品 —— diamond的专题,本次为大家介绍diamond的概况和快速使用。 一、概况 diamond是淘...

azikaxu
2014/05/29
12.5K
7

没有更多内容

加载失败,请刷新页面

加载更多

thinkphp5.1学习过程四——trait

<?php /** *trait实现了代码的复用 *并且突破了单继承的限制 *trait是类不是类,不能实例化 */ trait Demo1 { public function hello1() { return __METHOD__; } } trait Demo2 { public fu......

大海yht
26分钟前
6
0
DB2 sequence 操作

操作DB2 下 sequence seqName db2数据库一般seq还是比较大的,但是程序在调用的时候还是不可避免的有一些bug, 下面是对于seq一些简单的操作,也作为工作的一些记录 1、命令行取sequence se...

飞雪无痕
34分钟前
6
0
《吊打面试官》系列-秒杀系统设计

你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 絮叨 之前写了很多Redis相关的知识...

敖丙
40分钟前
12
0
Qt编写气体安全管理系统11-数据打印

一、前言 在各种软件系统中,数据打印也是常用的功能之一,一般来说会对查询的数据结果导出到excel,还会对查询的数据结果直接打印,在Qt中提供了打印机类QPrinter,在printsupport组件中,可...

飞扬青云
46分钟前
5
0
初级阶段

#include <stdio.h> #include <stdlib.h> int main(){ int a; int Sn = 0; int i; int tmp = 0; scanf_s("%d", &a); for (i = 1; i <= 5; i++) { tmp = tmp * 10 + a; Sn += tmp; } printf("......

Lxxxxx256
47分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部