Java实现ZooKeeper节点增删改查

1、引入pom依赖

这里要注意引入的版本,因为我安装的3.6.0的zk,所有引入的也是这个版本的依赖

	<!-- 引入zookeeper -->
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.6.0</version>
		</dependency>

2、创建节点

新建一个TestZK测试类,这里主要有三个步骤
第一,实现Watcher 接口事件通知回调方法
第二,创建ZooKeeper 连接对象,里面需要3个参数,connectString是zk服务连接串(集群逗号隔开),sessionTimeout 是连接超时时间
第三,编写创建节点的createNode()方法,第一个参数为节点名称,第二为写入节点的数据,第四个指定节点类型(这里是持久化顺序编号节点)

package com.example.demo.utils;

import org.apache.zookeeper.*;

/**
 * zookeeper节点增删改成操作
 */
public class TestZK implements Watcher {

    /**
     * 事件通知回调方法
     * @param watchedEvent
     */
    @Override
    public void process(WatchedEvent watchedEvent) {
        if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
            System.out.println("connection success");
        }
    }

    public static void main(String[] args) throws Exception{

        //1.创建连接对象
        String connectString = "192.168.xx.xxx:2181,192.168.xx.xxx:2182,192.168.xx.xxx:2183"; //服务连接串,集群逗号隔开
        int sessionTimeout = 150000;//连接超时时间 (毫秒)
        ZooKeeper zooKeeper = new ZooKeeper(connectString, sessionTimeout, new TestZK());

       //2.创建一个znode节点
        createNode( zooKeeper);
    }


    /**
     * 创建一个znode节点
     * 在根节点下创建一个 javaTest 节点,写入数据 hello
     * @param zooKeeper
     */
    public static void createNode(ZooKeeper zooKeeper) throws Exception{
        String path = zooKeeper.create("/javaTest","hello".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        System.out.println(path);
    }

}

启动mian方法之前,要先开启3zk服务的端口防火墙,否则连不上,命令如下

[root@localhost zookeepercluster]# firewall-cmd --zone=public --add-port=2181-2183/tcp --permanent
success
[root@localhost zookeepercluster]# firewall-cmd --reload
success

测试,控制台打印connection success,并输出新建的节点路径/javaTest0000000008

connection success
19:50:33.632 [main-SendThread(192.168.xx.128:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x10000dc55e20006, packet:: clientPath:null serverPath:null finished:false header:: 1,1  replyHeader:: 1,8589934623,0  request:: '/javaTest,#68656c6c6f,v{s{31,s{'world,'anyone}}},2  response:: '/javaTest0000000008 
/javaTest0000000008

查看zk服务中的节点,javaTest0000000008已创建成功

[zk: 192.168.xx.xxx:2181(CONNECTED) 5] ls /
[javaTest0000000008, testnodeA, testnodeB0000000002, zookeeper]

3、查询节点

3.1、查询指定节点数据

创建getOneNode()方法,查询javaTest0000000008节点的数据

/**
     * 查询指定节点数据
     * @param zooKeeper
     * @throws Exception
     */
    public static void getOneNode(ZooKeeper zooKeeper) throws Exception{
        byte[] data= zooKeeper.getData("/javaTest0000000008",new TestZK(),new Stat());
        System.out.println(new String(data));
    }

在main方法中调用

getOneNode(zooKeeper);

效果如下,获得了hello值

connection success
20:02:13.384 [main-SendThread(192.168.xx.128:2182)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x20000dc561e0001, packet:: clientPath:null serverPath:null finished:false header:: 1,4  replyHeader:: 1,8589934625,0  request:: '/javaTest0000000008,T  response:: #68656c6c6f,s{8589934623,8589934623,1591530633906,1591530633906,0,0,0,0,5,0,8589934623} 
hello

3.2、查询某个节点下所有子节点数据

创建getNodeList()方法,查询根节点下所有子节点中的数据

/**
     * 查询某个节点下所有子节点数据
     * @param zooKeeper
     * @throws Exception
     */
    public static void getNodeList(ZooKeeper zooKeeper) throws Exception{
        List<String> list = zooKeeper.getChildren("/",new TestZK());
        for(String path :list){
            byte[] data= zooKeeper.getData("/"+path,new TestZK(),null);
            System.out.println(new String(data));
        }
    }

效果如下,获得了多个节点的值

connection success
20:04:40.692 [main-SendThread(192.168.xx.128:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x10000dc55e20007, packet:: clientPath:null serverPath:null finished:false header:: 1,8  replyHeader:: 1,8589934627,0  request:: '/,T  response:: v{'zookeeper,'testnodeA,'testnodeB0000000002,'javaTest0000000008} 
20:04:40.711 [main-SendThread(192.168.xx.128:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x10000dc55e20007, packet:: clientPath:null serverPath:null finished:false header:: 2,4  replyHeader:: 2,8589934627,0  request:: '/zookeeper,T  response:: ,s{0,0,0,0,0,-2,0,0,0,2,0} 

20:04:40.717 [main-SendThread(192.168.xx.128:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x10000dc55e20007, packet:: clientPath:null serverPath:null finished:false header:: 3,4  replyHeader:: 3,8589934627,0  request:: '/testnodeA,T  response:: #68656c6c6f41,s{8589934600,8589934600,1591516136816,1591516136816,0,0,0,0,6,0,8589934600} 
helloA
20:04:40.722 [main-SendThread(192.168.xx.128:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x10000dc55e20007, packet:: clientPath:null serverPath:null finished:false header:: 4,4  replyHeader:: 4,8589934627,0  request:: '/testnodeB0000000002,T  response:: #68656c6c6f42,s{8589934601,8589934601,1591516195796,1591516195796,0,0,0,0,6,0,8589934601} 
helloB
20:04:40.727 [main-SendThread(192.168.xx.128:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x10000dc55e20007, packet:: clientPath:null serverPath:null finished:false header:: 5,4  replyHeader:: 5,8589934627,0  request:: '/javaTest0000000008,T  response:: #68656c6c6f,s{8589934623,8589934623,1591530633906,1591530633906,0,0,0,0,5,0,8589934623} 
hello

4、修改节点

创建setNode()方法,将/javaTest0000000008节点中的值更新为update hello

/**
     * 设置node中的值
     * @param zooKeeper
     * @throws Exception
     */
    public static void setNode(ZooKeeper zooKeeper) throws Exception{
        Stat stat = zooKeeper.setData("/javaTest0000000008","update hello".getBytes(),-1);
        System.out.println(stat);
    }

效果如下,值已被更新

[zk: 192.168.xx.128:2181(CONNECTED) 7] get /javaTest0000000008
update hello

5、删除节点

创建deleteNode()方法,删除/javaTest0000000008节点

/**
     * 删除节点
     * @param zooKeeper
     * @throws Exception
     */
    public static void deleteNode(ZooKeeper zooKeeper) throws Exception{
        zooKeeper.delete("/javaTest0000000008",-1);
    }

6、完整代码

package com.example.demo.utils;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.util.List;

/**
 * zookeeper节点增删改成操作
 * pdfox
 */
public class TestZK implements Watcher {

    /**
     * 事件通知回调方法
     * @param watchedEvent
     */
    @Override
    public void process(WatchedEvent watchedEvent) {
        if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
            System.out.println("connection success");
        }
    }

    public static void main(String[] args) throws Exception{

        //1.创建连接对象
        String connectString = "192.168.xx.128:2181,192.168.xx.128:2182,192.168.xx.128:2183"; //服务连接串,集群逗号隔开
        int sessionTimeout = 150000;//连接超时时间 (毫秒)
        ZooKeeper zooKeeper = new ZooKeeper(connectString, sessionTimeout, new TestZK());

        //2.创建一个znode节点
        createNode( zooKeeper);

        //3.查询指定节点数据
//        getOneNode(zooKeeper);

        //4.查询某个节点下所有子节点数据
//        getNodeList(zooKeeper);

        //5.设置node中的值
//        setNode(zooKeeper);

        //6.删除节点
//        deleteNode(zooKeeper);

    }


    /**
     * 创建一个znode节点
     * 在根节点下创建一个 javaTest 节点,写入数据 hello
     * @param zooKeeper
     */
    public static void createNode(ZooKeeper zooKeeper) throws Exception{
        String path = zooKeeper.create("/javaTest","hello".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        System.out.println(path);
    }

    /**
     * 查询指定节点数据
     * @param zooKeeper
     * @throws Exception
     */
    public static void getOneNode(ZooKeeper zooKeeper) throws Exception{
        byte[] data= zooKeeper.getData("/javaTest0000000008",new TestZK(),new Stat());
        System.out.println(new String(data));
    }


    /**
     * 查询某个节点下所有子节点数据
     * @param zooKeeper
     * @throws Exception
     */
    public static void getNodeList(ZooKeeper zooKeeper) throws Exception{
        List<String> list = zooKeeper.getChildren("/",new TestZK());
        for(String path :list){
            byte[] data= zooKeeper.getData("/"+path,new TestZK(),null);
            System.out.println(new String(data));
        }
    }

    /**
     * 设置node中的值
     * @param zooKeeper
     * @throws Exception
     */
    public static void setNode(ZooKeeper zooKeeper) throws Exception{
        Stat stat = zooKeeper.setData("/javaTest0000000008","update hello".getBytes(),-1);
        System.out.println(stat);
    }

    /**
     * 删除节点
     * @param zooKeeper
     * @throws Exception
     */
    public static void deleteNode(ZooKeeper zooKeeper) throws Exception{
        zooKeeper.delete("/javaTest0000000008",-1);
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值