Zookeeper API操作Demo

命令行操作ZK

##### 客户端登录zk
bash bin/zkCli.sh -server 192.168.31.162:2181

##### 执行 help 查看帮助说明
create /rest hello  >>> 创建/rest节点,并设置hello数据信息
create /test null   >>> 创建/test节点,并设置为空
create /test/child null    >>> 创建/test/child子节点
set /rest abc123    >>> 给/rest节点设置数据信息
delete /rest  >>> 删除/rest节点,被删除的节点必须是空节点,不能有子节点,可以有数据
rmr /rest     >>> 删除/rest节点
quit          >>> 退出客户端

Apache 官方接口API

引入maven依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.14</version>
</dependency>
package com.pwx.test;

import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;

/**
 * Desc: Apache Zookeeper API 使用
 * Creator: pengweixiang
 * Date: 2019-06-14
 */
public class ZkClientDemo
{
    private static final Logger LOGGER = LoggerFactory.getLogger(ZkClientDemo.class);

    private static final int SESSION_TIME_OUT = 6000;
    private static final String CONNECT_STRING = "192.168.31.162:2181";
    private static final String WATCH_PATH = "/test";
    private ZooKeeper zkClient;
    private CountDownLatch connectedSemaphore = new CountDownLatch(1);

    @Before
    public void init() throws Exception
    {
        zkClient = new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, new Watcher()
        {
            @Override
            public void process(WatchedEvent event)
            {
                if (connectedSemaphore.getCount() > 0 && event.getState() == Watcher.Event.KeeperState.SyncConnected)
                {
                    // 已连接ZK
                    connectedSemaphore.countDown();
                }
                if (event.getType() == Watcher.Event.EventType.NodeDataChanged && WATCH_PATH.equals(event.getPath()))
                {
                    System.out.println("Path: " + event.getPath());
                    try
                    {
                        byte[] data = zkClient.getData(WATCH_PATH, true, null);
                        System.out.println("New data: " + new String(data));
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        });
        //等待zk连接
        connectedSemaphore.await();
    }

    /**
     * 创建znode节点
     * @throws Exception exception
     */
    @Test
    public void create() throws Exception
    {
        zkClient.create(WATCH_PATH, "null".getBytes("UTF-8"), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }

    /**
     * 修改znode的值
     * @throws Exception exception
     */
    @Test
    public void setData() throws Exception
    {
        zkClient.setData(WATCH_PATH, "ShenZhen".getBytes("UTF-8"), -1);
    }

    /**
     * 获取znode的值
     * @throws Exception exception
     */
    @Test
    public void getData() throws Exception
    {
        byte[] data = zkClient.getData(WATCH_PATH, false, null);
        LOGGER.info("Read znode data: {}", new String(data));
    }
}

I0Itec zk 第三方客户端

引入maven依赖

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>
package com.pwx.test;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.BytesPushThroughSerializer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Desc: I0Itec zk 第三方客户端
 * Creator: pengweixiang
 * Date: 2019-06-16
 */
public class ZKClient3rdDemo
{
    private static final Logger LOGGER = LoggerFactory.getLogger(ZKClient3rdDemo.class);

    private static final int SESSION_TIME_OUT = 6000;
    private static final int CONNECT_TIME_OUT = 6000;
    private static final String CONNECT_STRING = "192.168.31.162:2181";
    private static final String WATCH_PATH = "/rest";
    private static final String WATCH_PATH_DIR1 = "/rest/dir1";
    private static final String WATCH_PATH_DIR2 = "/rest/dir2";

    private ZkClient zkClient;

    @Before
    public void init()
    {
        //注意Kafka中使用的是BytesPushThroughSerializer序列化,读取写入时byte数组
        zkClient = new ZkClient(CONNECT_STRING, SESSION_TIME_OUT, CONNECT_TIME_OUT, new BytesPushThroughSerializer());
    }

    @Test
    public void createZnode()
    {
        if (zkClient.exists(WATCH_PATH_DIR1))
        {
            LOGGER.warn("Znode exist: {}", WATCH_PATH_DIR1);
            return;
        }
        //创建递归节点,不担心不存在父节点
        zkClient.createPersistent(WATCH_PATH_DIR1, true);


        if (zkClient.exists(WATCH_PATH_DIR2))
        {
            LOGGER.warn("Znode exist: {}", WATCH_PATH_DIR2);
            return;
        }
        //创建递归节点,不担心不存在父节点
        zkClient.createPersistent(WATCH_PATH_DIR2, true);
    }

    @Test
    public void readZnode()
    {
        byte[] data = zkClient.readData(WATCH_PATH_DIR1);
        try
        {
            LOGGER.info("Read znode value: {}", new String(data, "UTF-8"));
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
    }

    @Test
    public void writeZnode()
    {
        try
        {
            //可将JavaBean序列化成json字符串写入
            zkClient.writeData(WATCH_PATH_DIR1, String.valueOf("hello world!").getBytes("UTF-8"));
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
    }

    @Test
    public void queryChildren()
    {
        List<String> children = zkClient.getChildren("/rest");
        children.forEach(path -> LOGGER.info("Children path: {}", path));
    }

    @Test
    public void deleteZnode()
    {
        zkClient.delete(WATCH_PATH_DIR1);
        zkClient.delete(WATCH_PATH_DIR2);
    }

    /**
     * 监听znode节点
     * @throws Exception exception
     */
    @Test
    public void watchZnode() throws Exception
    {
        zkClient.subscribeChildChanges(WATCH_PATH, new IZkChildListener()
        {
            @Override
            public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception
            {
                LOGGER.info("Parent path: {}, children path: {}", parentPath, currentChilds);
            }
        });

        zkClient.subscribeDataChanges(WATCH_PATH_DIR1, new IZkDataListener()
        {
            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception
            {
                LOGGER.info("Data path: {}, new value: {}", dataPath, data);
            }

            @Override
            public void handleDataDeleted(String dataPath) throws Exception
            {
                LOGGER.info("Delete data path: {}", dataPath);
            }
        });

        zkClient.subscribeDataChanges(WATCH_PATH_DIR2, new IZkDataListener()
        {
            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception
            {
                LOGGER.info("Data path: {}, new value: {}", dataPath, data);
            }

            @Override
            public void handleDataDeleted(String dataPath) throws Exception
            {
                LOGGER.info("Delete data path: {}", dataPath);
            }
        });

        Thread.sleep(TimeUnit.SECONDS.toMillis(1));
        zkClient.createPersistent(WATCH_PATH_DIR1, true);
        zkClient.createPersistent(WATCH_PATH_DIR2, true);

        Thread.sleep(TimeUnit.SECONDS.toMillis(1));
        zkClient.writeData(WATCH_PATH_DIR1, "dir1");
        zkClient.writeData(WATCH_PATH_DIR2, "dir2");

        Thread.sleep(TimeUnit.SECONDS.toMillis(1));
        zkClient.delete(WATCH_PATH_DIR1);
        zkClient.delete(WATCH_PATH_DIR2);

        Thread.sleep(TimeUnit.SECONDS.toMillis(1000));
    }

    @After
    public void closeZkClient()
    {
        zkClient.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值