<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在一個分散式環境中,同型別的服務往往會部署很多範例。這些範例使用了一些設定,為了更好地維護這些設定就產生了設定管理服務。通過這個服務可以輕鬆地管理成千上百個服務範例的設定問題。
王阿晶提出了基於zooKeeper的設定資訊儲存方案的設計與實現[1], 它將所有設定儲存在zookeeper上,這會導致設定的管理不那麼方便,而且他們沒有相關的原始碼實現。淘寶的diamond[2]是淘寶內部使用的一個管理持久設定的系統,它具有完整的開源原始碼實現,它的特點是簡單、可靠、易用,淘寶內部絕大多數系統的設定都採用diamond來進行統一管理。他將所有組態檔裡的設定打散化進行儲存,只支援KV結構,並且設定更新的推播是非實時的。百度內部的BJF設定中心服務[3]採用了類似淘寶diamond的實現,也是設定打散化、只支援KV和非實時推播。
同構系統是市場的主流,特別地,在業界大量使用部署虛擬化(如JPAAS系統,SAE,BAE)的情況下,同一個系統使用同一個部署包的情景會越來越多。但是,異構系統也有一定的存在意義,譬如,對於“拉模式”的多個下游範例,同一時間點只能只有一個下游範例在執行。在這種情景下,就存在多臺範例機器有“主備機”模式的問題。目前國內並沒有很明顯的解決方案來統一解決此問題。
disconf是一套完整的基於zookeeper的分散式設定統一解決方案。
支援設定(設定項+組態檔)的分散式化管理
設定異構系統管理
註解式程式設計,極簡的使用方式:我們追求的是極簡的、使用者程式設計體驗良好的程式設計方式。通過簡單的標註+極簡單的程式碼撰寫,即可完成複雜的設定分散式化。
需要Spring程式設計環境
簡單,使用者體驗良好:
可以託管任何型別的組態檔,這與[2,3]只能支援KV結構的功能有較大的改進。
設定更新實時推播
提供介面良好Web管理功能,可以非常方便的檢視設定被哪些範例使用了。
disconf服務叢集模式:
disconf的模組架構圖:
每個模組的簡單介紹如下:
執行流程詳細介紹:
與2.0版本的主要區別是支援了:主備分配功能/主備切換事件。
disconf-web提供了前後端分離的web架構,具體可見:https://github.com/knightliao/disconf/tree/master/disconf-web
本部分會重點介紹disconf-client的實現方式。
本實現會涉及到 設定倉庫容器模組、掃描模組、下載模組、watch模組,
使用AOP攔截的一個好處是可以比較輕鬆的實現設定控制,比如並行環境下的設定統一生效。
特別地,本方式提供的程式設計模式非常簡單,例如使用以下設定類的程式在使用它時,可以直接@Autowired進來進行呼叫,使用它時就和平常使用普通的JavaBean一樣,但其實它已經分散式化了。設定更新時,設定類亦會自動更新。
@Service @DisconfFile(filename = "redis.properties") public class JedisConfig { // 代表連線地址 private String host; // 代表連線port private int port; /** * 地址, 分散式檔案設定 * * @return */ @DisconfFileItem(name = "redis.host", associateField = "host") public String getHost() { return host; } public void setHost(String host) { this.host = host; } /** * 埠, 分散式檔案設定 * * @return */ @DisconfFileItem(name = "redis.port", associateField = "port") public int getPort() { return port; } public void setPort(int port) { this.port = port; } }
本實現提供了無任何程式碼侵入方式的分散式設定。
ReloadablePropertiesFactoryBean繼承了Spring Properties檔案的PropertiesFactoryBean類,管理所有當設定更新時要進行reload的組態檔。對於被管理的每一個組態檔,都會通過 設定倉庫容器模組、掃描模組、下載模組、watch模組 進行設定獲取至設定倉庫裡。
ReloadingPropertyPlaceholderConfigurer繼承了Spring Bean設定值控制類PropertyPlaceholderConfigurer。在第一次掃描spring bean 時,disconf會記錄組態檔的設定與哪些bean有關聯。
ReloadConfigurationMonitor是一個定時任務,定時check本地組態檔是否有更新。
當設定中心的設定被更新時,組態檔會被下載至範例本地,ReloadConfigurationMonitor即會監控到此行為,並且通知 ReloadingPropertyPlaceholderConfigurer 對相關的bean類進行值更新。
特別的,此種方式無法解決並行情況下設定統一生效的問題。
在實現中,為每個設定提供主備選擇的概念。使用者範例在獲取設定前需要先進行全域性唯一性競爭才能得到設定值。在這裡,我們採用基於zookeeper的全域性唯一性鎖來實現。
淘寶Diamond[2] | Disconf | 比較 | |
---|---|---|---|
資料永續性 | 儲存在mysql上 | 儲存在mysql上 | 都持久化到資料庫裡,都易於管理 |
推拉模型 | 拉模型,每隔15s拉一次全量資料 | 基於Zookeeper的推模型,實時推播 | disconf基於分散式的Zookeeper來實時推播,不斷是在穩定性、實效性、易用性上均優於diamond |
設定讀寫 | 支援範例對設定讀寫。支援某臺範例寫設定資料,並廣播到其它範例上 | 只支援範例對設定讀。通過在disconf-web上更新設定到達到廣播寫到所有應用範例 | 從目前的應用場景來看,範例對設定的寫需求不是那麼明顯。disconf支援的中心化廣播方案可能會與人性思考更加相似。 |
容災 | 多級容災模式,設定資料會dump在本地,避免中心服務掛機時無法使用 | 多級容災模式,優先讀取本地組態檔。 | 雙方均支援在中心服務掛機時設定範例仍然可以使用 |
設定資料模型 | 只支援KV結構的資料,非組態檔模式 | 支援傳統的組態檔模式(組態檔),亦支援KV結構資料(設定項) | 使用組態檔的程式設計方式可能與程式設計師的程式設計習慣更為相似,更易於接受和使用。 |
程式設計模型 | 需要將組態檔拆成多個設定項,沒有明顯的程式設計模型 | 在使用組態檔的基礎上,提供了註解式和基於XML的兩種程式設計模型 | 無 |
並行性 | 多條設定要同時生效時,無法解決並行同時生效的問題 | 基於註解式的設定,可以解決並行性問題 | 無 |
以上就是Disconf實現分散式設定管理的原理與設計的詳細內容,更多關於Disconf分散式設定管理的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45