使用場景
當一個對象的改變,需要通知其他對象而且不知道要通知多少個對象,可以使用發布訂閱模式 。在分布式中的應用有配置管理(Configuration Management) 、集群管理(Group Membership)/服務發現。
配置管理
如果集群中的機器的程序配置都是一樣的,而且需要動態修改,我們可以使用發布和訂閱模式,把配置做統一的管理。
故名思議就是一方把數據發布出來,另一方通過某種手段可以得到這些數據。通常數據訂閱有兩種方式:推模式和拉模式。
推模式一般是服務器n主動向客戶端推送信息,拉模式是客戶端主動去服務器獲取數據(通常是采用定時輪詢的方式)。
zk采用兩種方式相結合,發布者將數據發布到zk集群節點上,訂閱者通過一定的方法告訴服務器,我對哪個節點的數據感興趣,那服務器在這些節點的數據發生變化時,就通知客戶端,客戶端得到通知后可以去服務器獲取信息。
集群管理(Group Membership)/服務發現
集群管理,在分布式系統中,我們常常需要知道某個機器是否可用,傳統開發中,可以通過ping某個機器來實現,ping得通說明對方是可用的,相反是不可用的。zk中我們所有的機器都注冊一個臨時節點,我們判斷一個機器是否可用只需要判斷這個節點在zk中是否存在就可以了,不需要直接去連接需要檢查的機器,降低系統的復雜度。
服務發現,對集群中的服務上下線做統一的管理,每個工作服務器都可以作為數據的發布方,向集群注冊自己的基本信息。而讓某些監控服務器作為訂閱方,訂閱工作服務器的基本信息,當工作服務器的信息發生改變時,如服務上下線、服務器的角色等發生變更時,監控服務器可以得到通知,並響應這些變化。
原理解析
架構圖


配置管理
config 節點用於配置管理
Manage Server 發布消息
Work Server 訂閱消息
Control Server 通過command節點寫入命令信息,Manage Server訂閱command節點的數據改變,來接收控制指令。
服務發現
Server 用於服務器發現, Worker 啟動的時候,在Server創建一個臨時節點,Manage Server 通過監控Server節點的子節點的列表的改變,來更新內存中工作服務器列表的信息。
程序流程
Manage Server 程序 工作流程


Work Server程序主體流程


類圖


SubscrbeZkClient 負責驅動WordServer和ManageServer
ServerConfig 記錄WorkServer的配置信息
ServerData 記錄WordServer的基本信息
測試
服務發現
運行: SubscrbeZkClient.main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
start manage server.
start work server.
work server regist to
/server
.
work server regist to
/server
.
manage server : work server list changed, new list is
[192.168.1.0]
start work server.
work server regist to
/server
.
manage server : work server list changed, new list is
[192.168.1.1, 192.168.1.0]
start work server.
work server regist to
/server
.
manage server : work server list changed, new list is
[192.168.1.1, 192.168.1.0, 192.168.1.2]
start work server.
work server regist to
/server
.
manage server : work server list changed, new list is
[192.168.1.1, 192.168.1.0, 192.168.1.3, 192.168.1.2]
start work server.
work server regist to
/server
.
manage server : work server list changed, new list is
[192.168.1.1, 192.168.1.0, 192.168.1.3, 192.168.1.2, 192.168.1.4]
敲回車鍵退出!
|
配置管理
在zkCli.sh 輸入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
[zk: localhost:2181(CONNECTED) 45] create
/commands
list
Created
/commands
[zk: localhost:2181(CONNECTED) 46]
set
/commands
create
cZxid = 0x57ed
ctime = Wed Aug 24 11:44:21 CST 2016
mZxid = 0x57ee
mtime = Wed Aug 24 11:44:28 CST 2016
pZxid = 0x57ed
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 47]
set
/commands
modify
cZxid = 0x57ed
ctime = Wed Aug 24 11:44:21 CST 2016
mZxid = 0x57f0
mtime = Wed Aug 24 11:44:34 CST 2016
pZxid = 0x57ed
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
|
控制台對應輸出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
manage server : cmd = list
[192.168.1.1, 192.168.1.0, 192.168.1.3, 192.168.1.2, 192.168.1.4]
manage server : cmd = create
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root]
manage server : cmd = modify
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root_modify]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root_modify]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root_modify]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root_modify]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql:
//localhost
:3306
/mydb
, dbPwd=123456, dbUser=root_modify]
|
轉載地址:https://blog.csdn.net/jerome_s/article/details/52334946