zookeeper客户端操作及JAVA代码操作CURD

总结:zookeeper相当于一个远程平台,我们可以将数据放在上面,他是一个树形结构,每一个节点称为一个Znode

数据模型:每个节点或称为目录,都可以存放数据并且存放节点,有双重功能

重点watch机制:

ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能 。

总的来说可以概括 Watcher 为以下三个过程:客户端向服务端注册 Watcher

服务端事件发生触发 Watcher、客户端回调 Watcher 得到触发事件情况

首先在需要搭建一个zookeeper集群,非常简单,只需要修改tar包里面的配置文件的数据存放位置 ,另外在存放数据位置的文件夹下面新建一个myid用户存放编号,在配置文件中配置3个server.1=XXX:2181 即可

好了,步入正题,开始说明zookeer的相关操作

第一部分:linux搭建的zookeeper集群中利用客户端操作CURD

zookeeper安装目录中有一个客户端/export/servers/zookeeper-3.4.5-cdh5.14.0/bin    zkCli.sh 

启动zkCli.sh   直接输入zkCli.sh即可  ,注意客户端要运行,zookeeper服务器必须运行才可以啊,否则报错

输入help可得到客户端所有的命令

创建节点

create [-s] [-e] path data acl     s表示临时  e表示序号递增

查询节点

ls path [watch]           后面可以跟watch监听某个节点

修改节点

set path data [version]       

删除节点

delete path [version]     

递归删除

rmr path

获取某个节点的详细信息

get path [watch]

第二部分: java代码控制zookeeper的增删改查及watch机制监控

pom.xml文件

引入3个依赖,curator-framework   curator-recipes   google-collections

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>hadoopdemo</artifactId>
        <groupId>cn.itcast.hadoop</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo01_zk</artifactId>


    <repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.collections</groupId>
            <artifactId>google-collections</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>5.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

    </dependencies>
</project>

新增操作

 /**
    * @Description:创建新节点
    * @:Param
    * @:Return
    */
    @Test
    public void createNode() throws Exception {
       //1 创建客户端
        String conneciton="node01:2181,node02:2181,node03:2181";
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 1);
        CuratorFramework client = CuratorFrameworkFactory.newClient(conneciton,3000,3000, retryPolicy);
        //2 开启客户端
        client.start();
        //3 创建节点(createMode可以创建多种形式的)
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/demo01/world");
        client.close();
    }

修改操作

 /**
    * @Description:修改节点数据
    * @:Param
    * @:Return
    */
    @Test
    public void updateNode() throws Exception {
        //创建对象
        String connetion = "node01:2181,node02:2181,node03:2181";
        RetryPolicy retryPolicy=new ExponentialBackoffRetry(5000,1);
        CuratorFramework client = CuratorFrameworkFactory.newClient(connetion, retryPolicy);
        client.start();
        //修改
        client.setData().forPath("/demo01/world","您好啊".getBytes());
        client.close();
    }

查询操作

 /**
    * @Description:查询
    * @:Param
    * @:Return
    */
    @Test
    public void selectNode() throws Exception {
         //创建对象
        String connection ="node01:2181,node02:2181,node03:2181";
        RetryPolicy retryPolicy= new ExponentialBackoffRetry(5000,1);
        CuratorFramework client = CuratorFrameworkFactory.newClient(connection, retryPolicy);
        client.start();
        //查询
        byte[] bytes = client.getData().forPath("/demo01/world");
        System.out.println(new java.lang.String(bytes));
        client.close();

    }

删除操作
    /**
    * @Description:删除
    * @:Param
    * @:Return
    */
     @Test
    public void deleteNode() throws Exception {
        //创建
         String connction="node01:2181,node02:2181,node03:2181";
         RetryPolicy retryPolicy=new RetryForever(5000);
         CuratorFramework client = CuratorFrameworkFactory.newClient(connction, retryPolicy);
         client.start();
         //删除
         client.delete().forPath("/hello5");
         client.close();
     }

watch机制(重点,跟上面的套路是一样的,获取客户端client再操作)

 /**
     * @Description: watch机制
     * @:Param
     * @:Return
     */
    @Test
     public void watchNode() throws Exception {
        String connction="node01:2181,node02:2181,node03:2181";
        RetryPolicy retryPolicy= new RetryForever(5000);
        CuratorFramework client = CuratorFrameworkFactory.newClient(connction, retryPolicy);
        client.start();
        //watch
        //设置节点cache
        TreeCache treeCache = new TreeCache(client,"/");
        //设置监听器
        treeCache.getListenable().addListener(new TreeCacheListener() {
            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                ChildData data = event.getData();
                if(data!=null){
                    //switch 判断各种可能性
                    switch (event.getType()){
                        case NODE_ADDED:
                        System.out.println("节点新增:路径:"+data.getPath()+"数据:"+new String(data.getData()));
                        break;
                        case NODE_REMOVED:
                        System.out.println("节点删除,路径:"+data.getPath()+"数据:"+new String(data.getData()));
                        break;
                        case NODE_UPDATED:
                        System.out.println("节点修改,路径:"+data.getPath()+"数据:"+new String(data.getData()));
                        break;

                    }

                }

            }
        });
        //开始监听
        treeCache.start();
        //让程序不结束,一直监听
        Thread.sleep(900000000);
    }

这样如果zookeeper发生增删改操作,那么watch机制就会及时知道,并且打印出结果

猜你喜欢

转载自blog.csdn.net/weixin_42333583/article/details/83003395
今日推荐