自定义 RPC框架3——JAVA实现Zookeeper节点增删改查

Zookeeper安装

zookeeper的安装在之前的文章中已经写过:https://blog.csdn.net/qq_45587153/article/details/123630361?spm=1001.2014.3001.5502

导入POM依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.10</version>
</dependency>

测试方法

package com.shen.zk;

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

import java.io.IOException;
import java.util.List;

public class TestZookeeper {
    public static void main (String[] args) throws Exception {
        //create();
        //list();
        //get();
        delete();
    }

    /**
     * 删除节点
     * 删除节点前,需要先查询节点的状态cversion,通过getData来查询这个版本
     * 设计的目的是保证删除的节点是自己想删除的那个
     */
    public static void delete() throws Exception{
        ZooKeeper zooKeeper = new ZooKeeper("129.211.65.241:2181", 10000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("delete监听");
            }
        });
        Stat  stat = new Stat();
        System.out.println(stat);
        zooKeeper.getData("/parent/sequence0000000001",false,stat);
        System.out.println(stat);
        zooKeeper.delete("/parent/sequence0000000001", stat.getCversion());

    }

    /**
     * 查询节点中存储的数据,相当于根据key获取value
     */
    public static void get() throws Exception{
        ZooKeeper zooKeeper = new ZooKeeper("129.211.65.241:2181", 10000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("get方法监听");
            }
        });
        //获取数据
        byte[] datas = zooKeeper.getData("/parent",false,null);
        System.out.println("节点/parent中存储的数据是:" + new String(datas));
    }

    /**
     * 查询节点相当于遍历
     * @throws Exception
     */
    public static void list() throws Exception{
        ZooKeeper zooKeeper = new ZooKeeper("129.211.65.241:2181", 10000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("list方法监听");
            }
        });
        listAll(zooKeeper,"/");
        //遍历zk中所有节点
        List<String> res = zooKeeper.getChildren("/",false);
        for (String str : res){
            System.out.println(str);
        }
    }

    /**
     * 递归遍历所有节点
     */
    private static void listAll(ZooKeeper zooKeeper,String path) throws Exception{
        //获取当前节点所有字节点
        List<String> children = zooKeeper.getChildren(path,false);
        for(String child : children){
            String currentNodeName = "/".equals(path) ? (path + child) : (path + "/" + child);
            System.out.println(currentNodeName);
            listAll(zooKeeper,currentNodeName);
        }
    }

    /**
     * 创建节点
     * 什么是会话?
     * 持久,长期,有状态的对象,多次请求响应
     * 使用java远程访问zk,步骤:
     * 1,创建客户端
     * 2,使用客户端发送命令
     * 3,处理返回结果
     * 4,回收资源
     */
    public static void create() throws IOException, InterruptedException, KeeperException {
        //客户端对象
        ZooKeeper zooKeeper = new ZooKeeper("129.211.65.241:2181", 10000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("watch方法执行");
            }
        });
        //创建一个节点
        String result = zooKeeper.create("/parent","parent data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建parent节点结果:"+ result);

        //创建一个临时节点
        String tmpResult = zooKeeper.create("/parent/tmp",null,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
        System.out.println("创建/parent/tmp节点结果:" + tmpResult);

        //创建一个带序号的节点
        String seqResult = zooKeeper.create("/parent/sequence",null,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT_SEQUENTIAL);
        System.out.println("创建/parent/sequence节点结果:" + seqResult);

        Thread.sleep(6000);

        //关闭客户端
        zooKeeper.close();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值