Zookeeper解決了分佈式鎖的各種機制,通過它,我們可以將重心放在業務邏輯上,而非併發控制上。
Zookeeper提供了兩個功能:
分佈式鎖;
服務註冊與發現。
Zookeeper的數據模型
Zookeeper的數據存儲是基於節點的,稱作Znode。Znode的引用方式非常類似於文件路徑,例如:當要訪問貓時,需要指定路徑/動物/貓
。Znode包含四個元素:
- data:數據信息,例如服務的IP地址、端口、名字;
- ACL:訪問權限,即那些人或者那些IP可以訪問本節點;
- stat:元數據,例如事務ID、版本號、時間戳、大小等;
- child:子節點引用。
每個Znode節點最多隻能存儲1MB數據。
Zookeeper的基本操作
創建節點:create
刪除節點:delete
判斷節點是否存在:exists
獲取一個節點的數據:getData
設置一個節點的數據:setData
獲取節點下的所有子節點:getChildren
其中,exists、getData、getChildren屬於讀操作,Zookeeper客戶端在請求讀操作的時候,可以選擇是否設置Watch。
Zookeeper的事件通知機制
可以將Watch理解成是註冊在特定Znode上的觸發器,當這個Znode發生改變時,也就是調用了create、delete、setData等方法時,將會觸發Znode上註冊的對應的事件,請求Watch的看客戶端會接收到異步通知。
舉個用戶服務註冊與發現的例子:
當用戶服務1宕機時,用戶服務2將會註冊到API網關,繼續提供服務。原理就是:當用戶通過API網關訪問用戶服務時,實際上只是拿到了用戶服務的IP地址和端口號。而API網關中通過調用getData(/user/reg, watch)
方法,監聽服務的狀態。若出現服務宕機,則Zookeeper服務器將會通過異步通知的方式告知API網關,用戶服務1已經宕機,同時提供可供使用的其他用戶服務的IP地址和端口號並記錄下來,以便於下次有用戶請求到來時使用。