版权声明:未经本人同意不能转载。可联系 ( [email protected] ) https://blog.csdn.net/jaryn_fang/article/details/81545615
Java客户端
- 首先我们需要搭建相应的zookeeper的环境,我们现在使用序【2】中利用docker的host模式搭建的zookeeper集群来测试客户端的连接。
JavaApi
1. 测试java连接zookeeper
1.1 maven配置
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
1.2 测试连接java代码
public class App
{
private final static String CONN = "192.168.1.10:2001,192.168.1.10:2004,192.168.1.10:2007";
private static CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main( String[] args ) throws IOException, InterruptedException {
ZooKeeper zooKeeper = new ZooKeeper(CONN, 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
countDownLatch.countDown();
System.out.println(watchedEvent.getState());
}
});
countDownLatch.await();
System.out.println(zooKeeper.getState());
}
}
1.3 测试的结果如下
2. 节点增删改查(节点的增删改查、监听)
package cn.jaryn.javaApi;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* Hello world!
*
*/
public class ZookeeperOp implements Watcher
{
private static String CONN = "192.168.1.10:2001,192.168.1.10:2004,192.168.1.10:2007";
private static CountDownLatch countDownLatch = new CountDownLatch(1);
private static ZooKeeper zookeeper;
private static Stat stat = new Stat();
public static void main( String[] args ) throws IOException, InterruptedException, KeeperException {
zookeeper = new ZooKeeper(CONN, 5000, new ZookeeperOp());
countDownLatch.await();
System.out.println(zookeeper.getState());
//创建节点
zookeeper.create("/test1", "aaa".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
byte[] dataBytes = zookeeper.getData("/test1", new ZookeeperOp(), stat);
//改变数据
zookeeper.setData("/test1", "bbb".getBytes(), -1);
// ......
}
//监听操作
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
if(watchedEvent.getType() == Event.EventType.None && watchedEvent.getPath() == null) {
countDownLatch.countDown();
System.out.println(watchedEvent.getState());
}else {
switch (watchedEvent.getType()) {
case NodeCreated:
System.out.println("创建");
break;
case NodeDataChanged:
System.out.println("数据改变");
break;
case NodeChildrenChanged:
System.out.println("子节点数据改变");
break;
case NodeDeleted:
System.out.println("节点删除");
break;
}
}
}
}
}
权限操作
package cn.jaryn.javaApi;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
public class AuthOp implements Watcher {
private static String CONN = "192.168.1.10:2001,192.168.1.10:2004,192.168.1.10:2007";
private static CountDownLatch countDownLatch = new CountDownLatch(2);
// 有权限的客户端
private static ZooKeeper zookeeperAuth;
// 没有权限的客户端
private static ZooKeeper zookeeperAuthNone;
private static Stat stat = new Stat();
public static void main( String[] args ) throws IOException, InterruptedException, KeeperException {
zookeeperAuth = new ZooKeeper(CONN, 5000, new AuthOp());
//具体的模式可参考序【1】权限模型
zookeeperAuth.addAuthInfo("digest", "root:root".getBytes());
zookeeperAuthNone = new ZooKeeper(CONN, 5000, new AuthOp());
countDownLatch.await();
//使用有权限的客户端进行创建节点
zookeeperAuth.create("/auth1", "123".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
//使用没有权限的客户端重新设置他的值
zookeeperAuthNone.setData("/auth1", "222".getBytes(), -1);
//注意!!!,即使没有权限也可以对节点进行删除操作
//zookeeperAuthNone.delete("/auth1", -1);
}
//监听操作
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
if(watchedEvent.getType() == Event.EventType.None && watchedEvent.getPath() == null) {
countDownLatch.countDown();
System.out.println(watchedEvent.getState());
}
}
}
}
3.1 结果
会出现没有权限操作的提示,如下:
3.2 zookeeper客户端
使用zookeeperCli会得到以下结果:
# 看节点权限内容
getAcl 节点
# 设置节点内容
set 节点 内容