目录
zookeeper操控节点
连接zookeeper
public static void main(String[] args) throws Exception {
//计数器对象
final CountDownLatch latch = new CountDownLatch(1);
//创建连接是一个异步的过程,因此需要计数器进行线程等待,创建成功后释放线程
ZooKeeper zooKeeper = new ZooKeeper("你的zkIP", 5000, new Watcher() {
//创建连接成功后
public void process(WatchedEvent event) {
if(event.getState() ==Watcher.Event.KeeperState.SyncConnected){
System.out.println("连接创建成功");
latch.countDown();
}
}
});
//主线程阻塞等待连接对象的创建成功
latch.await();
System.out.println("----"+zooKeeper.getSessionId()+"----");
zooKeeper.close();
}
新建节点
新建节点同步方式:
create(String path, byte data[], List acl,CreateMode createMode)
新建节点异步方式:
create(String path, byte data[], List acl,CreateMode createMode, StringCallback cb, Object ctx)
参数说明:
path:-znode路径
data:节点数据内容
acl:访问控制列表
createMode:节点的类型,枚举类
cb:异步回调接口
ctx:传递上下文参数(回调函数会将ctx返回)
world授权
//节点路径 /create
//节点数据 create
//权限列表: world:anyone:adrwa
//节点类型:持久化节点
//cdrwa权限
zooKeeper.create("/create","create".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
ZooDefs.Ids的类别:
OPEN_ACL_UNSAFE : 完全开放的ACL,任何连接的客户端都可以操作该属性znode
CREATOR_ALL_ACL : 只有创建者才有ACL权限
READ_ACL_UNSAFE:只能读取ACL
CreateMode类型:
PERSISTENT–持久型
PERSISTENT_SEQUENTIAL–持久顺序型
EPHEMERAL–临时型
EPHEMERAL_SEQUENTIAL–临时顺序型
List<ACL> acls = new ArrayList<ACL>();
Id id = new Id("world", "anyone");
//rw权限
acls.add(new ACL(ZooDefs.Perms.READ,id));
acls.add(new ACL(ZooDefs.Perms.WRITE,id));
zooKeeper.create("/create/node2","node2".getBytes(), acls, CreateMode.PERSISTENT);
IP授权
List<ACL> acls = new ArrayList<ACL>();
Id id = new Id("ip", "192.168.10.132");
acls.add(new ACL(ZooDefs.Perms.ALL,id));
zooKeeper.create("/create/node3","node3".getBytes(), acls, CreateMode.PERSISTENT);
Auth授权
//添加授权用户
zooKeeper.addAuthInfo("digest","admin:admin".getBytes());<br> //给予所有权限
zooKeeper.create("/create/node4","node4".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
digest授权
//授权模式和授权对象
Id id = new Id("digest", "wj:64ibjjwm94195LPhuzhUdkIjOl0=");
//所有权限
acls.add(new ACL(ZooDefs.Perms.ALL,id));
zooKeeper.create("/create/node5","node5".getBytes(), acls, CreateMode.PERSISTENT);
异步方式创建节点
//异步方式创建节点
zooKeeper.create("/create/node6", "node6".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback() {
public void processResult(int rc, String path, Object ctx, String name) {
//rc=0表示创建成功
//path,name都表示路径
//ctx:回调函数上下文context....
System.out.println(rc+"=="+path+"=="+ctx+"=="+name);
}
},"context....");
Thread.sleep(10000);
System.out.println("end...");
修改节点
同步
// 修改节点/root/childone下的数据,第三个参数为版本,如果是-1,那会无视被修改的数据版本,直接改掉,但如果输入版本号错误就会修改失败
Stat s= zk.setData("/root/childone", "childonemodify".getBytes(), -1);
异步
zooKeeper.setData("/node_6", "234".getBytes(), -1, new AsyncCallback.StatCallback(){
@Override
public void processResult(int rc, String path, Object ctx, Stat stat) {
StringBuilder sb = new StringBuilder();
sb.append("rc="+rc).append("\n");
sb.append("path"+path).append("\n");
sb.append("ctx="+ctx).append("\n");
sb.append("Stat="+stat).append("\n");
System.out.println(sb.toString());
}
,"context....");
Thread.sleep(10000);
System.out.println("end...");
删除节点
同步
// 删除节点/delete/node1,第二个参数为版本,如果是-1,那会无视被删除的数据版本,直接删掉,但如果输入版本号错误就会删除失败
zooKeeper.delete("/delete/node1",-1);
异步
//VoidCallback:异步回调接口
zooKeeper.delete("/delete/node2", -1, new AsyncCallback.VoidCallback() {
public void processResult(int rc, String path, Object ctx) {
System.out.println(rc);//0表示删除成功
System.out.println(path);//节点路径
System.out.println(ctx);//上下文信息
}
},"ctx");
Thread.sleep(10000);
System.out.println("end...");