zoukankan      html  css  js  c++  java
  • Zookeeper原生Java API、ZKClient和Apache Curator 区别对比

    zookeeper 常用的3种java客户端:

    • zookeeper原生Java API
    • ZkClient
    • Apache curator

    1、zookeeper原生Java API

    Zookeeper客户端提供了基本的操作,比如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。但对于开发人员来说,Zookeeper提供的基本操纵还是有一些不足之处。

    Zookeeper API不足之处

    (1)Session超时之后没有实现重连机制,需要手动操作;
    (2)Watcher注册是一次性的,每次触发之后都需要重新进行注册;
    (3)不支持递归创建节点;
    (4)异常处理繁琐,Zookeeper提供了很多异常,对于开发人员来说可能根本不知道该如何处理这些异常信息;
    (5)只提供了简单的byte[]数组的接口,没有提供针对对象级别的序列化;
    (6)创建节点时如果节点存在抛出异常,需要自行检查节点是否存在;
    (7)删除节点无法实现级联删除;

    基于以上原因,直接使用Zookeeper原生API的人并不多。

    2、ZkClient

    <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.11</version>
    </dependency>

    ZkClient是一个开源客户端,在Zookeeper原生API接口的基础上进行了包装,更便于开发人员使用。解决如下问题:

    1)session会话超时重连
    2)解决Watcher反复注册
    3)简化API开发

    虽然 ZkClient 对原生 API 进行了封装,但也有它自身的不足之处:

    • 几乎没有参考文档;
    • 异常处理简化(抛出RuntimeException);
    • 重试机制比较难用;
    • 没有提供各种使用场景的实现;

    3、Apache Curator

    Curator是Netflix公司开源的一套Zookeeper客户端框架,和ZkClient一样,解决了非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等。目前已经成为 Apache 的顶级项目。

    其特点:

    1. Apache 的开源项目
    2. 解决Watch注册一次就会失效的问题
    3. 提供一套Fluent风格的 API 更加简单易用
    4. 提供更多解决方案并且实现简单,例如:分布式锁
    5. 提供常用的ZooKeeper工具类
    6. 编程风格更舒服

    除此之外,Curator中还提供了Zookeeper各种应用场景(Recipe,如共享锁服务、Master选举机制和分布式计算器等)的抽象封装。

    补充说明

    Apache Curator是Apache ZooKeeper的Java / JVM客户端库,Apache ZooKeeper是一种分布式协调服务。

    它包括一个高级API框架和实用程序,使Apache ZooKeeper更容易和更可靠。它还包括常见用例和扩展(如服务发现和Java 8异步DSL)的配方。

    官网:http://curator.apache.org/index.html

    Curator项目组件(下载官方源码就可以看到以下组件)

    Recipes:    Zookeeper典型应用场景的实现,这些实现是基于Curator Framework。
    Framework:  Zookeeper API的高层封装,大大简化Zookeeper客户端编程,添加了例如Zookeeper连接管理、重试机制等。
    Utilities:  为Zookeeper提供的各种实用程序。
    Client:     Zookeeper client的封装,用于取代原生的Zookeeper客户端(ZooKeeper类),提供一些非常有用的客户端特性。
    Errors:  Curator如何处理错误,连接问题,可恢复的例外等。

    Maven依赖(地址:https://search.maven.org/search?q=org.apache.curator)

    GroupID/Org   ArtifactID/Name   描述
    org.apache.curator curator-recipes 所有典型应用场景。需要依赖client和framework,需设置自动获取依赖。
    org.apache.curator curator-framework 同组件中framework介绍。
    org.apache.curator curator-client 同组件中client介绍。
    org.apache.curator curator-test 包含TestingServer、TestingCluster和一些测试工具。
    org.apache.curator curator-examples 各种使用Curator特性的案例。
    org.apache.curator curator-x-discovery 在framework上构建的服务发现实现。
    org.apache.curator curator-x-discoveryserver 可以和Curator Discovery一起使用的RESTful服务器。
    org.apache.curator curator-x-rpc Curator framework和recipes非java环境的桥接。

    分布式锁实现

    <dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>4.1.0</version>
    </dependency>
    public static void main(String[] args) {
    String zookeeperConnectionString = "localhost:2181";
    RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy);
    client.start();
    
    try {
    //创建分布式锁, 锁空间的根节点路径为/curator/lock
    InterProcessMutex lock = new InterProcessMutex(client, "/curator/lock");
    if ( lock.acquire(1000, TimeUnit.SECONDS) )
    {
    try
    {
    // do some work inside of the critical section here
    System.out.println("do some work inside of the critical section here");
    }
    finally
    {
    //完成业务流程, 释放锁
    lock.release();
    }
    }
    
    } catch (Exception e) {
    e.printStackTrace();
    }
    }



    欢迎关注微信公众号:大数据从业者
  • 相关阅读:
    【NumPy】理清Reshape和Transpose
    【NumPy】What does axis/axes mean in Numpy
    【Git】测试部Git使用规范
    NCNN性能测试笔记
    MNN性能测试笔记
    Android Studio 查看SQLite数据库存储位置及文件
    NPOI 设置world表格单元格居中
    NPOI.XWPF.UserModel.XWPFTableCell.SetText()方法不能传入NULL
    a标签不跳转
    mvc 布局页引用布局页 写法
  • 原文地址:https://www.cnblogs.com/felixzh/p/15639247.html
Copyright © 2011-2022 走看看