Zookeeper原生客户端
创建会话
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)
示例代码:
package cn.enjoy.zk.javaapi;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
/**
* zookeeper官方提供的java客户端API;
* @author caojiulu
*
*/
public class CreateSessionDemo1 {
private static final String ConnectingString="192.168.46.133:2181";
private static final CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws Exception {
ZooKeeper zooKeeper = new ZooKeeper(ConnectingString, 5000, new Watcher() {
@Override
public void process(WatchedEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getState() == Event.KeeperState.SyncConnected){
countDownLatch.countDown();//如果当前的连接状态是连接成功的,那么通过计数器去控制
System.out.println(arg0.getState());
}
}
});
countDownLatch.await();
System.out.println(zooKeeper.getState());
}
}
原生客户端增删改查
public class ApiOperatorDemo1 implements Watcher{
private static final String ConnectString = "192.168.46.133:2181";
private static CountDownLatch countDownLatch = new CountDownLatch(1);
private static ZooKeeper zookeeper;
private static Stat stat = new Stat();
public static void main(String[] args) throws Exception {
zookeeper = new ZooKeeper(ConnectString, 5000, new ApiOperatorDemo1());
countDownLatch.await(); //发令枪
//String result = zookeeper.create("/node1", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//System.out.println("创建成功:"+result);
//修改数据
zookeeper.getData("/node1",new ApiOperatorDemo1(),stat);
zookeeper.setData("/node1","deer2".getBytes(),-1);
Thread.sleep(2000);
//删除节点
zookeeper.getData("/node1",new ApiOperatorDemo1(),stat);
zookeeper.delete("/node1",-1);
Thread.sleep(2000);
// 创建节点和子节点
// String path="/node11";
//
// zookeeper.create(path,"123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
// TimeUnit.SECONDS.sleep(1);
//
// Stat stat=zookeeper.exists(path+"/node1",true);
// if(stat==null){//表示节点不存在
// zookeeper.create(path+"/node1","123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
// TimeUnit.SECONDS.sleep(1);
// }
// //修改子路径
// zookeeper.setData(path+"/node1","deer".getBytes(),-1);
// TimeUnit.SECONDS.sleep(1);
//获取指定节点下的子节点
// List<String> childrens=zookeeper.getChildren("/node11",true);
// System.out.println(childrens);
}
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() ==Watcher.Event.KeeperState.SyncConnected){
if(Event.EventType.None ==watchedEvent.getType() && null == watchedEvent.getPath()){
countDownLatch.countDown();
System.out.println(watchedEvent.getState()+"-->"+watchedEvent.getType());
}else if (watchedEvent.getType() == Event.EventType.NodeDataChanged){
try {
System.out.println("数据变更触发路径:"+watchedEvent.getPath()+"->改变后的值:"+new String(zookeeper.getData(watchedEvent.getPath(), true, stat)));
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if (watchedEvent.getType() == Event.EventType.NodeChildrenChanged){
try {
System.out.println("数据变更触发路径:"+watchedEvent.getPath()+"->改变后的值:"+new String(zookeeper.getData(watchedEvent.getPath(), true, stat)));
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if(watchedEvent.getType()== Event.EventType.NodeCreated){//创建子节点的时候会触发
try {
System.out.println("节点创建路径:"+watchedEvent.getPath()+"->节点的值:"+
zookeeper.getData(watchedEvent.getPath(),true,stat));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else if(watchedEvent.getType()== Event.EventType.NodeDeleted){//子节点删除会触发
System.out.println("节点删除路径:"+watchedEvent.getPath());
}
}
}
}
原生客户端权限控制:
public class AuthControlDemo1 implements Watcher{
private final static String CONNECTSTRING="192.168.46.133:2181";
private static CountDownLatch countDownLatch=new CountDownLatch(1);
private static ZooKeeper zookeeper;
public static void main(String[] args) throws Exception {
zookeeper=new ZooKeeper(CONNECTSTRING, 5000, new AuthControlDemo1());
countDownLatch.await();
ACL acl = new ACL(ZooDefs.Perms.ALL, new Id("digest", DigestAuthenticationProvider.generateDigest("root:root")));
ACL acl2 = new ACL(ZooDefs.Perms.CREATE, new Id("ip", "192.168.1.1"));
List<ACL> acls = new ArrayList();
acls.add(acl);
acls.add(acl2);
zookeeper.create("/auth1", "123".getBytes(), acls, CreateMode.PERSISTENT);
zookeeper.addAuthInfo("digest","root:root".getBytes());
zookeeper.create("/auth1/auth1-1","123".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL,CreateMode.EPHEMERAL);
ZooKeeper zooKeeper1=new ZooKeeper(CONNECTSTRING, 5000, new AuthControlDemo());
countDownLatch.await();
zooKeeper1.addAuthInfo("digest","root:root".getBytes());
zooKeeper1.delete("/auth1/auth1-1",-1);
// acl (create /delete /admin /read/write)
//权限模式: ip/Digest(username:password)/world/super
}
public void process(WatchedEvent watchedEvent) {
//如果当前的连接状态是连接成功的,那么通过计数器去控制
if(watchedEvent.getState()==Event.KeeperState.SyncConnected){
if(Event.EventType.None==watchedEvent.getType()&&null==watchedEvent.getPath()){
countDownLatch.countDown();
System.out.println(watchedEvent.getState()+"-->"+watchedEvent.getType());
}
}
}
}