更新時(shí)間:2020-10-30 來(lái)源:黑馬程序員 瀏覽量:
數(shù)據(jù)發(fā)布/訂閱(Publish/Subscribe)系統(tǒng),即所謂的配置中心,顧名思義就是發(fā)布者將數(shù)據(jù)發(fā)布到ZooKeeper的一個(gè)或一系列節(jié)點(diǎn)上,供訂閱者進(jìn)行數(shù)據(jù)訂閱,進(jìn)而達(dá)到動(dòng)態(tài)獲取數(shù)據(jù)的目的,實(shí)現(xiàn)配置信息的集中式管理和數(shù)據(jù)的動(dòng)態(tài)更新。
發(fā)布/訂閱系統(tǒng)一般有兩種設(shè)計(jì)模式,分別是推(Push)模式和拉(Pull)模式。在推模式中,服務(wù)端主動(dòng)將數(shù)據(jù)更新發(fā)送給所有訂閱的客戶(hù)端;而拉模式則是由客戶(hù)端主動(dòng)發(fā)起請(qǐng)求來(lái)獲取最新數(shù)據(jù),通??蛻?hù)端都采用定時(shí)進(jìn)行輪詢(xún)拉取的方式。
ZooKeeper 采用的是推拉相結(jié)合的方式:客戶(hù)端向服務(wù)端注冊(cè)自己需要關(guān)注的節(jié)點(diǎn),一旦該節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變更,那么服務(wù)端就會(huì)向相應(yīng)的客戶(hù)端發(fā)送Watcher事件通知,客戶(hù)端接收到這個(gè)消息通知之后,需要主動(dòng)到服務(wù)端獲取最新的數(shù)據(jù)。
如果將配置信息存放到ZooKeeper上進(jìn)行集中管理,那么通常情況下,應(yīng)用在啟動(dòng)的時(shí)候都會(huì)主動(dòng)到ZooKeeper服務(wù)端上進(jìn)行一次配置信息的獲取,同時(shí),在指定節(jié)點(diǎn)上注冊(cè)一個(gè)Watcher監(jiān)聽(tīng),這樣一來(lái),但凡配置信息發(fā)生變更,服務(wù)端都會(huì)實(shí)時(shí)通知到所有訂閱的客戶(hù)端,從而達(dá)到實(shí)時(shí)獲取最新配置信息的目的。
下面我們通過(guò)一個(gè)“配置管理”的實(shí)際案例來(lái)展示ZooKeeper在“數(shù)據(jù)發(fā)布/訂閱”場(chǎng)景下的使用方式。
在我們平常的應(yīng)用系統(tǒng)開(kāi)發(fā)中,經(jīng)常會(huì)碰到這樣的需求:系統(tǒng)中需要使用一些通用的配置信息,例如機(jī)器列表信息、運(yùn)行時(shí)的開(kāi)關(guān)配置、數(shù)據(jù)庫(kù)配置信息等。這些全局配置信息通常具備以下3個(gè)特性。
·數(shù)據(jù)量通常比較小。
·數(shù)據(jù)內(nèi)容在運(yùn)行時(shí)會(huì)發(fā)生動(dòng)態(tài)變化。
·集群中各機(jī)器共享,配置一致。
對(duì)于這類(lèi)配置信息,一般的做法通??梢赃x擇將其存儲(chǔ)在本地配置文件或是內(nèi)存變量中。無(wú)論采用哪種方式,其實(shí)都可以簡(jiǎn)單地實(shí)現(xiàn)配置管理,在集群機(jī)器規(guī)模不大、配置變更不是特別頻繁的情況下,無(wú)論剛剛提到的哪種方式,都能夠非常方便地解決配置管理的問(wèn)題。但是,一旦機(jī)器規(guī)模變大,且配置信息變更越來(lái)越頻繁后,我們發(fā)現(xiàn)依靠現(xiàn)有的這兩種方式解決配置管理就變得越來(lái)越困難了。我們既希望能夠快速地做到全局配置信息的變更,同時(shí)希望變更成本足夠小,因此我們必須尋求一種更為分布式化的解決方案
接下來(lái)我們就以一個(gè)“數(shù)據(jù)庫(kù)切換”的應(yīng)用場(chǎng)景展開(kāi),看看如何使用ZooKeeper來(lái)實(shí)現(xiàn)配置管理:
·配置存儲(chǔ)
在進(jìn)行配置管理之前,首先我們需要將初始化配置信息存儲(chǔ)到Zookeeper上去,一般情況下,我們可以在Zookeeper上選取一個(gè)數(shù)據(jù)節(jié)點(diǎn)用于配置信息的存儲(chǔ),例如:/app1/database_config。
配置管理的zookeeper節(jié)點(diǎn)示意圖
我們將需要管理的配置信息寫(xiě)入到該數(shù)據(jù)節(jié)點(diǎn)中去,例如:
#數(shù)據(jù)庫(kù)配置信息 #DBCP dbcp.driverClassName=com.mysql.jdbc.Driver dbcp.dbJDBCUrl=jdbc:mysql://127.0.0.1:3306/lagou-test dbcp.username=zm dbcp.password=1234 dbcp.maxActive=30 dbcp.maxIdle=10
配置獲取
集群中每臺(tái)機(jī)器在啟動(dòng)初始化階段,首先會(huì)從上面提到的ZooKeeper配置節(jié)點(diǎn)上讀取數(shù)據(jù)庫(kù)信息,同時(shí),客戶(hù)端還需要在該配置節(jié)點(diǎn)上注冊(cè)一個(gè)數(shù)據(jù)變更的
Watcher監(jiān)聽(tīng),一旦發(fā)生節(jié)點(diǎn)數(shù)據(jù)變更,所有訂閱的客戶(hù)端都能夠獲取到數(shù)據(jù)變更通知。
配置變更
在系統(tǒng)運(yùn)行過(guò)程中,可能會(huì)出現(xiàn)需要進(jìn)行數(shù)據(jù)庫(kù)切換的情況,這個(gè)時(shí)候就需要進(jìn)行配置變更。借助ZooKeeper,我們只需要對(duì)ZooKeeper上配置節(jié)點(diǎn)的內(nèi)容進(jìn)行更新,ZooKeeper就能夠幫我們將數(shù)據(jù)變更的通知發(fā)送到各個(gè)客戶(hù)端,每個(gè)客戶(hù)端在接收到這個(gè)變更通知后,就可以重新進(jìn)行最新數(shù)據(jù)的獲取。
猜你喜歡: