栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【ZooKeeper】Curator API介绍及基本使用

【ZooKeeper】Curator API介绍及基本使用

目录

介绍

目录

介绍

使用

1.建立连接

 2.节点创建

3.查询节点

4.修改节点

5.删除节点

Watch事件监听

1.概述


介绍

Curator是Apache ZooKeeper的Java客户端库,常见的ZooKeeper Java API有原生的Java API、ZkClient、Curator。Curator框架在zookeeper原生API接口上进行了包装,解决了很多ZooKeeper客户端非常底层的细节开发。提供ZooKeeper各种应用场景如:分布式锁服务、集群领导选举、分布式队列等的抽象封装,是最好用、最流行的zookeeper的客户端。

官网:Apache Curator –

Curator提供的常见操作有建立连接、节点创建、节点查询、节点删除、节点修改、Watch事件监听、分布式锁的实现等。

使用

1.建立连接

首先在IDEA里新建一个空的maven项目,引入相关依赖和插件


        
        
            junit
            junit
            4.13.1
            test
        
        
        
            org.apache.curator
            curator-recipes
            4.2.0
        
        
        
            org.apache.curator
            curator-framework
            4.2.0
        

        
        
            org.slf4j
            slf4j-api
            1.7.21
        
        
            org.slf4j
            slf4j-log4j12
            1.7.21
        

    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                2.3.2
                
                    1.8
                    1.8
                    UTF-8
                
            
        
    

 连接有两种建立方法如下,个人比较推荐使用第二种

//重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
//方法一

Curatorframework client = CuratorframeworkFactory.newClient("192.168.5.156:2181", 60 * 1000, 45 * 1000, retryPolicy);
client.start(); //开启连接
//方法二
Curatorframework client = CuratorframeworkFactory.builder().connectString("192.168.5.156:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(45 * 1000)
                .retryPolicy(retryPolicy)
                .namespace("jason")  //加上namespace可以使每次创建或修改的节点都是在/jason/下进行的
                .build();
client.start();

 2.节点创建

在已建立连接的基础上就可以开始对节点进行一些操作了,此处的client是建立连接时的Curatorframework对象,通过调用create().forPath()创建节点,创建节点默认存储的值是当前客户端的ip地址,若要自定义值需要再加一个值参数(byte数组类型)。与此同时,节点默认也是持久化的,若有需要则可以通过withMode来指定存储类型。

ps:注意forPath异常的抛出

@Test
public void createTest1() throws Exception {
        //默认节点的值是当前客户端的ip地址,自定义时要注意值的类型为byte数组
        client.create().forPath("/app2","hello".getBytes());

}
@Test
public void createTest2() throws Exception {
        //创建节点时默认为持久化节点
        //若要设置其他类型需要使用到withMode方法
        client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");
}

3.查询节点
    
    @Test
    public void getTest() throws Exception {
        //查询节点数据:get
        byte[] data1 = client.getData().forPath("/app1");
        //查询子节点:ls
        List nodes = client.getChildren().forPath("/app1");
        //查询子节点状态信息:ls -s
        Stat status = new Stat();
        client.getData.storingStatIn(status).forPath("/app1");

    }

4.修改节点

普通修改节点数据

    @Test
    public void setTest1() throws Exception {
        client.setData().forPath("/app1","Jason".getBytes());
    }

 通过版本号修改节点数据

首先要查询当前节点的状态信息(参考3.查询节点),然后通过getVersion获取版本号

    @Test
    public void setTest2() throws Exception {
        Stat status = new Stat();
        client.getData().storingStatIn(status).forPath("/app1");
        int version = status.getVersion();
        client.setData().withVersion(version).forPath("/app1","这是修改的数据".getBytes());
    }

5.删除节点

前两行的实现对应了delete和deleteall

由于连接可能出现超时或者网络的波动,通过guaranteed可以保证删除的成功性(尽量加上这个)

要想删除实现回调,则需要调用inBackground,通过匿名内部类或Lambda表达式实现BackgroundCallback接口,重写processResult,执行一些回调任务。

@Test
    public void deleteTest() throws Exception {
        //删除空节点
        client.delete().forPath("/app1");
        //删除非空节点(包含子节点)
        client.delete().deletingChildrenIfNeeded().forPath("/app1");
        //若连接超时或出现异常,以上两种方式可能出现删除失败的情况,于是可以通过以下方式保证删除的成功
        client.delete().guaranteed().forPath("/app1");
        //回调
        client.delete().inBackground(new BackgroundCallback() {
            @Override
            public void processResult(Curatorframework curatorframework, CuratorEvent curatorEvent) throws Exception {
                System.out.println(curatorEvent);
            }
        }).forPath("/app1");
    }

Watch事件监听

1.概述

ZooKeeper允许用户在指定节点上注册一些Watcher,并在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是实现分布式协调服务的重要特性。

ZooKeeper中引入了Watcher机制来实现了发布/订阅功能,可以让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者。

Curator引入了Cache来实现对ZooKeeper服务端事件的监听。

ZooKeeper提供了三种Watcher:

1.NodeCache:只是监听某一个特定节点

2.PathChildrenCache:监控一个ZNode的子节点

3.TreeCache:可以监控整个树上的所有节点,类似于NodeCache和PathChildrenCache的组合

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/342351.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号