1.如何連接zookeeper客戶端
package com.arcln.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* 原生的 zookeeper API
*/
public class ConnectionDemo {
public static void main(String[] args) throws Exception {
final CountDownLatch downLatch = new CountDownLatch(1);
final ZooKeeper zookeeper = new ZooKeeper("192.168.1.128:2181,192.168.1.129:2181,192.168.1.130:2181",
4000,
new Watcher() {
@Override
public void process(WatchedEvent event) {
if(event.getState() == Event.KeeperState.SyncConnected){
downLatch.countDown();
}
}
});
downLatch.await(); //爲了等待zooKeeper連接成功
System.out.println("連接狀態--------->"+zookeeper.getState()+" <--------------");
String nodeName = "/zk-persis-TEST";
/** 創建節點
* @param String path, 節點路徑
* @param byte[] data, value值
* @param List<ACL> acl, 開放權限
* @param CreateMode createMode,存儲模式
*/
zookeeper.create(nodeName,"0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//Stat中保存了zookeeper節點中對應的所有信息
Stat stat = new Stat();
//得到當前的節點
byte[] bytes = zookeeper.getData(nodeName,null,stat);
System.out.println("創建時的值:"+new String(bytes)+" ");
//修改節點
zookeeper.setData(nodeName,"1".getBytes(),stat.getVersion());
//得到當前的節點
byte[] bytes1 = zookeeper.getData(nodeName,null,stat);
System.out.println("修改後的值:"+new String(bytes1)+" ");
//刪除
zookeeper.delete(nodeName,stat.getVersion());
zookeeper.close();
// System.in.read();
}
}
2.事件機制
Watcher監聽機制是Zookeeper中非常重要的特性,基於Zookeeper上創建的節點,可以對這些節點綁定監聽事體,比如監聽節點數據的變更,節點刪除,子節點狀態變更,通過這個事件機制,可以基於zookeeper實現分佈式鎖,集羣管理功能
watcher特性:當數據發生變化的時候,zookeeper會產生一個watcher事件,並且會發送到客戶端,但是客戶端只會收到一次通知,如果後續這個節點再次發生變化,那麼之前設置watcher的客戶端面不會再次收到消息(可能通過循環監聽達到永久監聽的效果)。
如何註冊事件機制
通過這三個操作來綁定事件:getData、Exists、getChildren
如何觸發事件?
凡是事務類型的操作,都會觸發監聽事件。create /delete/setDatawatcher
package com.arcln.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.util.concurrent.CountDownLatch;
public class WatcherDemo {
public static void main(String[] args) throws Exception {
final CountDownLatch downLatch = new CountDownLatch(1);
final ZooKeeper zookeeper = new ZooKeeper(
"192.168.1.128:2181,192.168.1.129:2181,192.168.1.130:2181", 4000,
new Watcher() {
@Override
public void process(WatchedEvent event) {
//全局默認事
if(event.getState() == Event.KeeperState.SyncConnected)
downLatch.countDown();
}
});
downLatch.await();
String path = "/zk-persis-b";
zookeeper.create(path,"x".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//通過 exists getData getchildren 綁定事件
//通過 exists綁定事件,watcher只會綁定一次事件
Stat stat = zookeeper.exists(path, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent.getType()+"->"+watchedEvent.getPath());
try {
zookeeper.exists(watchedEvent.getPath(),true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//通過修改值 ,來觸發事件
stat = zookeeper.setData(path,"y".getBytes(),stat.getVersion());
//通過刪除值 ,來觸發事件
zookeeper.delete(path,stat.getVersion());
}
}