阿里開源配置服務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<ManagerListener> managerListeners = new LinkedList<ManagerListener>();
    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. 服務端第一次啓動會從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. 如果沒有使用本地緩存,且獲取服務端配置信息失敗時,則檢查快照文件配置信息是否發生變化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章