開源配置中心xxl-conf的核心原理分析


XXL-CONF是一款輕量級的開源配置中心項目,由國內大牛許雪里開發.下面是官方對其優點作出的描述:

一個輕量級分布式配置管理平台,擁有"輕量級、秒級動態推送、多環境、跨語言、跨機房、配置監聽、權限控制、版本回滾"等特性。現已開放源代碼,開箱即用。

開源項目地址:

鄙人有幸拜讀了大神的源碼,分享一下自己的理解:

項目分為配置中心服務端和客戶端兩個部分.
客戶端與服務端通過http接口進行通信. 服務端為客戶端提供了兩個http接口: 一個查詢配置的接口,一個監控配置是否發生變更的接口. 查詢配置的接口,只會從本地磁盤快照中獲取配置,不會查詢數據庫. 監控接口返回的是一個DeferredResult對象,它是SpringMVC提供的一種技術, 可以實現服務器端向客戶端推送數據,不過調用該接口時,配置中心並不會直接給客戶端返回數據, 而是先將客戶端請求和對應的DeferredResult對象緩存起來.
配置中心在啟動時,會創建一個線程池,並啟動兩個線程:
    其中一個線程用來監控配置是否發生變更,具體是查詢數據庫中的一張表,
    該表只記錄最近剛發生變化的數據,為保證實時性,線程會每隔1秒就查詢一次該表,
    如果該表中有數據,就說明配置有變化,就立即更新本地快照,並廣播給所有客戶端;
    另一個線程用於從數據庫加載全量數據,考慮到數據量可能比較大,
    線程會間隔30秒查詢一次數據庫.如果數據有變化,就立即更新本地快照並廣播給所有客戶端.
配置中心廣播機制:
    配置中心的廣播機制是利用了SpringMCU提供的DeferredResult對象特性實現的.
    配置發生變更,配置中心不會直接將變更的數據推送給客戶端,而是告訴客戶端數據有變化,
    需要客戶端主動發起http請求調用配置中心的查詢接口獲取最新的配置.
    DeferredResult對象默認的超時時間是30秒,如果配置沒有發生變化,則等待超時返回.
客戶端在啟動的時候:
    首先會創建一個本地緩存用於保存配置數據,剛創建時本地緩存是空的.
    然后會啟動一個守護線程,每隔3秒鍾查看一下本地緩存是否有數據,線程會在此阻塞.
    同時客戶端會去解析所有加了@XxlConf注解的字段或使用$XxlConf{}占位符配置,拿到key,
    向配置中心發送http請求查詢數據,先將查詢到的數據放入本地緩存,然后再給這些字段賦值.

    當客戶端本地緩存中有數據的時候,會被守護線程掃描到,
    會向配置中心發送http請求查詢自己需要的配置信息,查詢到配置后,
    它會先比對一下配置中心的配置項和本地緩存中配置項是否相同,
    如果相同就直接忽略不處理,如果不相同,說明有變化,
    如果本地緩存倉庫中沒有該key,或該key的值為空,或該key的值有變化,
    則更新本地緩存;最后將緩存中的配置同步到鏡像文件.
客戶會通過守護線程與服務端保持長連接:
    客戶端會循環調用配置中心的監控接口,
    如果配置中心數據有變化,會立刻通知客戶端,
    客戶端接收到通知會立刻調用配置中心的查詢接口獲取數據;
    如果配置中心的數據沒有變更,則默認30秒后再調用查詢接口;

 

客戶端和配置中心的快照文件:
    客戶端和配置中心都有使用快照文件來保證數據的安全性,
    快照文件都是一些properties文件,考慮到value的值可能比較大,
    為了提高檢索效率,每一個配置項用一個單獨的文件來保存.
    文件名由環境+項目名+key組成,這樣做便於查詢的時候能夠快速精准定位.
    
    配置中心的快照文件是在配置中心啟動30秒左右被創建,
    前面提到過配置中啟動的時候會啟動一個線程,負責每隔30秒,
    會從數據庫加載全量的配置數據,更新到快照文件.
    如果某個配置項有變更就覆蓋其對應的快照文件,
    配置中心第一次啟動的時候,快照文件是不存在的,
    快照文件不存在的話,會直接被創建.
    
    客戶端的快照文件由客戶端啟動后開啟的那個守護線程創建.
    守護線程會循環調用配置中心的監控接口,
    每隔30秒拉取一次配置,更新到快照文件.

 

注意:
    如果配置中心增加了新的配置,客戶端是不會收到通知的,
    因為客戶端每次請求接口只拉取自己所使用到的配置,
    自己所使用到的配置,是在客戶端啟動的時候通過掃描
    @XxlConf注解和$XxlConf{}占位符時就已經確定了的.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM