package zookeeper;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.data.Stat;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/**
*
*/
public class CreateZNode {
//逾時時間
private static final int SESSION_TIMEOUT = 500000;
private CountDownLatch connectedSignal = new CountDownLatch(1);
public static WatchTest watch = new WatchTest();
public static void main(String[] args) {
try {
Watcher wh = new Watcher() {
public void process(WatchedEvent event) {
String path = event.getPath();
EventType type = event.getType();
System.out.println("----------int---"+type.getIntValue());
System.out.println("----------path---"+path);
System.out.println("----------type---"+type);
// 判斷事件的類型是否是删除了,如果删除就之間傳回程式
if (type == EventType.NodeDeleted) {
System.out.println(path + "節點被删除了,程式需停止" + type);
return;
}
if (type == EventType.NodeDataChanged) {
System.out.println(path + "節點内容有改動" + type);
return;
}
if (type == EventType.NodeCreated) {
System.out.println(path + "建立節點" + type);
return;
}
if (type == EventType.NodeChildrenChanged) {
System.out.println(path + "子節點有變動" + type);
return;
}
// 列印節點變動的資訊
System.out.println(path + "出事了" + type);
}
};
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", SESSION_TIMEOUT, wh);
createNode(zk);
//修改
//updateNode(zk);
//擷取zk清單
//listNode(zk);
//擷取value
// getData(zk);
//删除 節點
//deleteNode(zk);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void updateNode(ZooKeeper zk) throws Exception {
Stat update = zk.setData("/axz/b", "4545346".getBytes(), -1);
System.out.println(update);
}
private static void deleteNode(ZooKeeper zk) throws Exception {
// TODO Auto-generated method stub
zk.delete("/zxz/c", -1);
}
private static void listNode(ZooKeeper zk) throws KeeperException, InterruptedException {
List<String> idList = zk.getChildren("/zxz/b", false);
idList.forEach(s->{
System.out.println(s);
});
}
private static void getData(ZooKeeper zk) throws Exception {
byte[] bytes = zk.getData("/zxz/b", false, new Stat());
System.out.println(new String(bytes));
}
public static void createNode(ZooKeeper zk) throws Exception {
String str1 = zk.create("/axz", "abc".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}
linux連結用戶端的指令
cd /zookeeper/bin
sh zKcli.sh
建立
create -s -e /test
-s:建立順序節點
-e:建立臨時節點
擷取子節點清單
ls /test
擷取節點資訊指令
get /test
修改指令
set /test data
删除指令
delete /test
zookeeper權限控制
在實際應用中,我們搭建一個zookeeper叢集,統一為若幹應用服務,如kafka叢集,dubbo等,為了避免一個應用的資料被其它的應該幹擾,我們需要權限控制。
身份認證模式分為:world,auth,digest,ip
world:預設方式,相當于全世界都能通路
auth:代表已經認證通過的使用者(cli中可以通過addauth digest user:pwd 來添加目前上下文中的授權使用者)
digest:即使用者名:密碼這種方式認證,這也是業務系統中最常用的
ip:使用Ip位址認證
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", SESSION_TIMEOUT, null);
zk.addAuthInfo("digest","foo:true".getBytes());
zk.create("/fff", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
ZooKeeper zk1 = new ZooKeeper("127.0.0.1:2181", SESSION_TIMEOUT, null);
byte[] bytes = zk1.getData("/fff", false, new Stat());
System.out.println(new String(bytes));
此時zk1查詢節點資訊會報錯 :zookeeperException$NoAuthException
我們應該為zk1增權重限
ZooKeeper zk1 = new ZooKeeper("127.0.0.1:2181", SESSION_TIMEOUT, null);
zk1.addAuthInfo("digest","foo:true".getBytes());
byte[] bytes = zk1.getData("/fff", false, new Stat());
System.out.println(new String(bytes));