阿里开源配置服务diamond分析

diamond简述

diamond是阿里巴巴开源的一款配置中心服务。diamond中文意思是钻石,而钻石的特点有小巧、珍贵、稳定。

  • 小巧:在如今的互联网公司中配置服务作为基础的中间件,其核心功能比较简单就是存储并管理配置数据,功能单一。
  • 珍贵:随着公司业务线增加及规模的扩大,传统的基于配置文件、尤其是多环境下繁杂、易出错的配置和需要动态感知配置变化时,统一化的配置服务显得弥足重要,对开发人员更加友好,也避免了系统频繁上线。
  • 稳定:充分考虑线上环境可能出现由于网络、磁盘等引起各种不确定情况,提供高可用及容灾方案。

diamond使用

    DiamondSubscriber diamondSubscriber = DiamondClientFactory.getSingletonDiamondSubscriber();
    DiamondConfigure diamondConfigure = new DiamondConfigure();
    diamondConfigure.setDomainNameList(diamondUrlList);
    diamondConfigure.setPort(contextParamCfg.getDiamondPort());
    diamondConfigure.setConfigServerAddress(diamondUrlList.get(0));
    diamondConfigure.setConfigServerPort(contextParamCfg.getDiamondPort());
    diamondSubscriber.setDiamondConfigure(diamondConfigure);
    // 同步获取
    String content = diamondSubscriber.getConfigureInfomation(dataId, group, timeout);
    diamondSubscriber.start();
    // 异步回调
    diamondSubscriber.addDataId(dataId, group);
    List managerListeners = new LinkedList();
    managerListeners.add(new ManagerListener() {
        @Override
        public Executor getExecutor() {return null;}
        @Override
        public void receiveConfigInfo(String configInfo) {}
    }    
});
   ((DefaultSubscriberListener) diamondSubscriber.getSubscriberListener()).addManagerListeners(dataId,
    group, managerListeners);
    diamondSubscriber.start();

diamond特性

阿里开源配置服务diamond分析_第1张图片

服务端启动及处理流程
  1. 服务端第一次启动会从DB中加载配置到服务端本地文件中(默认 工程上下文路径/config-data/group/dataId),并以group+dataId为key,以content的md5为value保存到内存中。然后启动一个定时任务,定时(默认10分钟)从DB中加载配置更新服务端文件及缓存。
  2. 当服务端收到添加配置的请求时,首先保存配置到数据库,然后保存到缓存,保存到磁盘(工程上下文路径/config-data/group/dataId),最后发送http请求通知其他server更新(缓存和磁盘)。
  3. 当服务端收到更新配置的请求时,首先更新配置到数据库,然后更新到缓存,更新到磁盘,最后发送http请求通知其他server更新(缓存和磁盘)。
  4. 当服务端收到删除配置的请求时,首先删除磁盘中的配置,然后删除缓存配置,删除数据库配置,最后发送http请求通知其他server更新(缓存和磁盘)。
客户端启动后流程
  1. 监控本地 ~/diamond/data目录。对该目录的子目录及文件注册创建、修改、删除事件,循环监测它们是否有创建、修改及删除操作,并更新existFile缓存,使用最新时间戳标识最新版本(map,只保留最新版本)。

  2. 如果diamondConfigure的localFirst=true,则从客户端本地 ~/diamond/ServerAddress 文件中获取domainNameList,如果还未获取到则从configServerAddress:configServerPort/url获取,如果没有配置configServerAddress则从a.b.c:8080/url或d.e.f:8080/url获取,因为默认这个域名没有配置,所以会报“获取服务器地址列表信息Http异常,如果你是在日常环境,请忽略这个异常,configServerAddress=XXX”,如果获取到则存入本地文件 ~/diamond/ServerAddress
    如果diamondConfigure的localFirst==false(默认),则首先同步获取domainNameList,流程同上,如果没有获取到再异步定时(默认5分钟)按以上流程获取。

  3. 创建快照目录 ~/diamond/snapshot

  4. 若指定使用本地配置,根据监测的客户端缓存文件的目录或者文件的版本号(时间戳)是否发生变化 ~/diamond/data/config-data/group/dataId配置信息是否发生变化,若变化则更新客户端内存缓存,并通知客户端监听器

  5. 根据服务端md5和客户端内存缓存中的md5比较,判断server端配置信息是否发生变化,若变化则先从server获取配置信息,然后更新客户端快照并通知客户端监听器

  6. 如果没有使用本地缓存,且获取服务端配置信息失败时,则检查快照文件配置信息是否发生变化。

你可能感兴趣的:(JAVA)