diamond簡述 - 簡書
http://www.reibang.com/p/213c6c158815
為什么說基于數(shù)據(jù)庫做配置存儲是比較好的方案
典型的多讀少寫(類似傳統(tǒng)的web服務(wù))
數(shù)據(jù)庫的災(zāi)備很成熟蝉衣,master-master或者master-slave都可以
基于數(shù)據(jù)庫比較容易做權(quán)限控制(不只是web界面的權(quán)限偶洋,還要防止惡意讀寫配置)
為什么不存儲Properties文件,或者配置文件恶阴?
因為存儲多個properties文件,或者其它配置文件助泽,會造成比較混亂熬北,用戶不能直觀的得到所有的配置。即使用key沖突也不能及時的發(fā)現(xiàn)璧坟。
在XDiamond里是以key/value方式來存儲值既穆,一個項目里只有一個key/value的map,這樣清晰直觀雀鹃,所見即所得幻工。
需求
為什么需要全局配置中心?
- 公共配置零散
比如有一個memcached集群黎茎,有多個項目同時會用到囊颅,那么對于管理者來說,他搞不清楚誰用了這個集群傅瞻。 對于使用者來說踢代,可能也不清楚一個Memcached Client對象是從哪里來的,使用的是哪個集群嗅骄。
- 公共配置修改的問題
比如有一個memcached集群胳挎,一開始是3個結(jié)點的,后面增加到5個結(jié)點溺森。如果這個地址改變了的話慕爬,需要下游所有的應(yīng)用都要修改窑眯,耗時耗力,而且容易遺漏医窿。
- client jar包里的配置問題
一種常見的情景是: 業(yè)務(wù)方A提供了一個client jar包伸但,業(yè)務(wù)方B想要使用業(yè)務(wù)A的功能時,先把業(yè)務(wù)方A的client jar加到依賴?yán)锪羯Γ缓筮€要import業(yè)務(wù)方A的spring配置文件更胖。 業(yè)務(wù)方A有自己的配置文件,那么業(yè)務(wù)方A要么自己隱式加載了配置隔显,要么需要業(yè)務(wù)方B顯式地為業(yè)務(wù)A增加配置却妨。這兩種方式都不理想,還可能會導(dǎo)致配置的key沖突的問題括眠。
- client jar包升級彪标,配置需要升級的問題
業(yè)務(wù)方B使用了業(yè)務(wù)方A的client jar包,當(dāng)業(yè)務(wù)方A升級了jar掷豺,增加了配置捞烟,業(yè)務(wù)方B是否要跟著修改?這樣導(dǎo)致流程漫長当船,而且容易出錯题画。
- 多個配置文件,導(dǎo)致混亂
項目時間長之后德频,配置文件會越來越多苍息,逐漸混亂。
- 配置的安全問題
生產(chǎn)環(huán)境的數(shù)據(jù)庫連接信息是寫在svn里呢壹置,還是放在生產(chǎn)機器上竞思?能否明確有權(quán)限的人員才能看到敏感的配置信息?
為什么不使用zookeeper/etcd做為存儲钞护?
優(yōu)點:
- 客戶端通過watch監(jiān)聽結(jié)節(jié)盖喷,更新比較方便
缺點:
大量連接時,zookeeper壓力比較大(360通過增加一個proxy解決)
跨機房同步問題
權(quán)限管理
從實際的開源項目來看难咕,基于zookeeper的都沒有實現(xiàn)權(quán)限管理(如果有誤的話课梳,請告之)。如果有應(yīng)用惡意刪除了zookeeper上的配置步藕,將會是一場災(zāi)難惦界,而zookeeper通常是沒有備份的挑格。
為什么說基于數(shù)據(jù)庫做配置存儲是比較好的方案
典型的多讀少寫(類似傳統(tǒng)的web服務(wù))
數(shù)據(jù)庫的災(zāi)備很成熟咙冗,master-master或者master-slave都可以
基于數(shù)據(jù)庫比較容易做權(quán)限控制(不只是web界面的權(quán)限,還要防止惡意讀寫配置)
為什么不存儲Properties文件漂彤,或者配置文件雾消?
因為存儲多個properties文件灾搏,或者其它配置文件,會造成比較混亂立润,用戶不能直觀的得到所有的配置狂窑。即使用key沖突也不能及時的發(fā)現(xiàn)。
在XDiamond里是以key/value方式來存儲值桑腮,一個項目里只有一個key/value的map泉哈,這樣清晰直觀,所見即所得破讨。
XDiamond配置中心的解決方案
類maven的依賴關(guān)系丛晦,抽取公共配置,通過依賴關(guān)系解決公共配置提陶,client jar配置的問題
支持足夠復(fù)雜的維度烫沙,參考maven:groupId, artifactId, version(僅有g(shù)roup維度不夠)
支持多種環(huán)境/profile(實際業(yè)務(wù)是復(fù)雜的,僅支持product/dev/test不夠)
一個應(yīng)用只有一個最終的properties隙笆,界面所見即所得
結(jié)合Spring PropertyPlaceholder 機制锌蓄,應(yīng)用輕松遷移
應(yīng)用啟動時打印配置,避免隱藏加載
通過權(quán)限控制撑柔,結(jié)合Secret key瘸爽,保證配置的安全
配置緩存在本地,防止應(yīng)用因為網(wǎng)絡(luò)問題而不能啟動
權(quán)限設(shè)計Group里的用戶有access等級:owner, master, developer, reporter, guest
Profile可以設(shè)置access等級铅忿,只有owner/master的用戶才可以查看修改product環(huán)境下的配置
組/用戶管理蝶糯,可以同步LDAP數(shù)據(jù)
用secretkey防止惡意訪問
XDiamond Servertcp端口5678,長連接辆沦,主動推送修改的配置
http api
配置以key/value方式保存
XDiamond Client
客戶端用以下的參數(shù)來獲取配置
groupId
artifactId
version
profile
secretkey(可選)
對于應(yīng)用來說昼捍,獲取到的是一個properties對象,結(jié)合Spring的PropertyPlaceholderConfigurer肢扯。
對于應(yīng)用來說妒茬,遷入遷出成本非常低。遷入只要在spring xml里增加一個Bean蔚晨,遷出可以直接改回傳統(tǒng)的加載Properties文件的方式乍钻。應(yīng)用不需要編寫任何代碼,和Spring結(jié)合非常簡單铭腕。