jar包:zookeeper-3.4.9.jar,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar,log4j-1.2.15.jarjava
package com.xbq.zookeeper;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
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.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
/**
* @ClassName: ZookeeperDemo
* @Description: TODO zookeeper測試
* @author xbq
* @version 1.0
*/
public class ZookeeperDemo {
private static final int SESSION_TIMEOUT = 3000;
public static void main(String[] args) {
Zookeeper zooKeeper = null;
try {
zooKeeper = new ZooKeeper("192.168.242.128:2183", SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("觸發事件:" + event.getType());
}
});
String path = "/node_xbq";
String data = "TestxbqCoder";
create(zooKeeper, path, data);
// update(zooKeeper, path, data);
// delete(zooKeeper, path);
// aclOper(zooKeeper, path, data);
// aclOper2(zooKeeper, path, data);
// doWatch(zooKeeper, path, data);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(zooKeeper ! = null){
try{
zooKeeper.close();
}catch(Exception e){
}
}
}
}
/**
* @Title: create
* @Description: TODO 增長操做
* @param zooKeeper
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
* @return: void
*/
public static void create(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
if(zooKeeper.exists(path, false) == null){ // 若是不存在節點,就新建
// 第三個參數是 權限,第四個參數 表明持久節點
// 權限分類:OPEN_ACL_UNSAFE:對全部用戶開放 READ_ACL_UNSAFE:只讀 CREATOR_ALL_ACL: 建立者能夠作任何操做
zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
System.out.println(new String(zooKeeper.getData(path, true, null)));
}
/**
* @Title: update
* @Description: TODO 修改操做
* @param zooKeeper
* @return: void
* @throws InterruptedException
* @throws KeeperException
*/
public static void update(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException {
zooKeeper.setData(path, data.getBytes(), -1); // -1標識任何版本號 均可以
System.out.println(new String(zooKeeper.getData(path, true, null)));
}
/**
* @Title: delete
* @Description: TODO 刪除
* @param zooKeeper
* @param path
* @throws KeeperException
* @throws InterruptedException
* @return: void
*/
public static void delete(ZooKeeper zooKeeper, String path) throws KeeperException, InterruptedException{
if(zooKeeper.exists(path, false) != null){
zooKeeper.delete(path, -1);
}
if(zooKeeper.exists(path, false) != null){
System.out.println(new String(zooKeeper.getData(path, true, null)));
}
}
/**
* @Title: aclOper
* @Description: TODO 權限測試 先建立一個只讀權限節點,而後更新該節點
* @param zooKeeper
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
* @return: void
*/
public static void aclOper(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
// 首先建立一個只讀的節點。第三個參數 表明只讀權限
zooKeeper.create(path, data.getBytes(), Ids.READ_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println(new String(zooKeeper.getData(path, true, null)));
// 測試更新節點,由於增長的是 只讀的,因此應該是不能夠修改的。發現報錯:org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /node_xbq
zooKeeper.setData(path, "testRead_ACL".getBytes(), -1);
}
/**
* @Title: aclOper2
* @Description: TODO 自定義權限驗證
* 自定義schema權限類型:digest,world,auth,ip,這裏用 digest舉例
* @param zooKeeper
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
* @throws NoSuchAlgorithmException
* @return: void
*/
public static void aclOper2(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException, NoSuchAlgorithmException{
// 第一個參數是 全部的權限,第二個參數是 經過 用戶名和密碼 驗證
ACL acl = new ACL(ZooDefs.Perms.ALL, new Id("digest", DigestAuthenticationProvider.generateDigest("root:root")));
List<ACL> acls = new ArrayList<ACL>();
acls.add(acl);
if(zooKeeper.exists(path, false) == null){
zooKeeper.create(path, data.getBytes(), acls, CreateMode.PERSISTENT);
}
zooKeeper.addAuthInfo("digest", "root:root".getBytes());
// 經過下面的方式 是能夠取到值的,由於 加了 用戶名和 密碼 驗證 ,須要 加上 zooKeeper.addAuthInfo("digest", "root:root".getBytes());
System.out.println(new String(zooKeeper.getData(path, true, null)));
}
/**
* @Title: doWatch
* @Description: TODO 監聽
* @param zooKeeper
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
* @return: void
*/
public static void doWatch(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
if(zooKeeper.exists(path, false) == null){
zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
// 監聽 path節點
zooKeeper.getData(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("觸發了節點變動事件:" + event.getType());
}
}, null);
// 用更新操做觸發 監聽事件
zooKeeper.setData(path, "updateTest".getBytes(), -1);
}
}
複製代碼