序【3-1】:zookeeper客户端-JavaApi

版权声明:未经本人同意不能转载。可联系 ( [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 节点 内容

猜你喜欢

转载自blog.csdn.net/jaryn_fang/article/details/81545615