Zookeeper-Zookeeper应用场景实战

本文详细介绍了Zookeeper在Java环境下的客户端使用,包括原生客户端和Curator客户端的实例,如创建、获取、更新和删除节点,以及异步操作和监听器设置。此外,还探讨了Zookeeper在分布式命名服务中的应用,如实现分布式API目录和SnowFlakeID算法,以及设计分布式队列的思路。
摘要由CSDN通过智能技术生成

1. Zookeeper Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 可供选择的Java客户端API有:
        ZooKeeper官方的Java客户端API。
        第三方的Java客户端API,比如Curator。
ZooKeeper官方的客户端API提供了基本的操作。例如,创建会话、创建节点、读取节点、更新数据、 删除节点和检查节点是否存在等。不过,对于实际开发来说,ZooKeeper官方API有一些不足之处,具 体如下:
       1. ZooKeeper的Watcher监测是一次性的,每次触发之后都需要重新进行注册。
        2.会话超时之后没有实现重连机制。
        3.异常处理烦琐,ZooKeeper提供了很多异常,对于开发人员来说可能根本不知道应该如何处理这些抛出的异常。
       4. 仅提供了简单的byte[]数组类型的接口,没有提供Java POJO级别的序列化数据处理接口。
       5. 创建节点时如果抛出异常,需要自行检查节点是否存在。
        6.无法实现级联删除。
总之, ZooKeeper官方API功能比较简单,在实际开发过程中比较笨重,一般不推荐使用。

1.1 Zookeeper 原生Java客户端使用

引入zookeeper client依赖
<!-- zookeeper client -->
 <dependency>
 <groupId>org.apache.zookeeper</groupId>
 <artifactId>zookeeper</artifactId>
 <version>3.8.0</version>
</dependency>
注意:保持与服务端版本一致,不然会有很多兼容性的问题。
ZooKeeper原生客户端主要使用org.apache.zookeeper.ZooKeeper这个类来使用ZooKeeper服务。
ZooKeeper常用构造器
ZooKeeper (connectString, sessionTimeout, watcher)
        1.connectString:使用逗号分隔的列表,每个ZooKeeper节点是一个host.port对,host 是机器名或者IP地址,port是ZooKeeper节点对客户端提供服务的端口号。客户端会任意选connectString 中的一个节点建立连接。
        2.sessionTimeout : session timeout时间。
        3.watcher:用于接收到来自ZooKeeper集群的事件。 使用 zookeeper 原生 API,连接zookeeper集群
public class ZkClientDemo {

 private static final String CONNECT_STR="localhost:2181";
 private final static String
CLUSTER_CONNECT_STR="192.168.65.156:2181,192.168.65.190:2181,192.168.65.200:2181";

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

 final CountDownLatch countDownLatch=new CountDownLatch(1);
 ZooKeeper zooKeeper = new ZooKeeper(CLUSTER_CONNECT_STR,
 4000, new Watcher() {
 @Override
 public void process(WatchedEvent event) {
 if(Event.KeeperState.SyncConnected==event.getState()
 && event.getType()== Event.EventType.None){
 //如果收到了服务端的响应事件,连接成功
 countDownLatch.countDown();
 System.out.println("连接建立");
 }
 }
 });
 System.out.printf("连接中");
 countDownLatch.await();
 //CONNECTED

System.out.println(zooKeeper.getState());

//创建持久节点
 zooKeeper.create("/user","fox".getBytes(),
 ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

 }

}
Zookeeper主要方法
        create(path, data, acl,createMode): 创建一个给定路径的 znode,并在 znode 保存 data[]的 数据, createMode指定 znode 的类型。
        delete(path, version):如果给定 path 上的 znode 的版本和给定的 version 匹配, 删除 znode。
        exists(path, watch):判断给定 path 上的 znode 是否存在,并在 znode 设置一个 watch。
        getData(path, watch):返回给定 path 上的 znode 数据,并在 znode 设置一个 watch。
        setData(path, data, version):如果给定 path 上的 znode 的版本和给定的 version 匹配,设置 znode 数据。
        getChildren(path, watch):返回给定 path 上的 znode 的孩子 znode 名字,并在 znode 设置一个 watch。
        sync(path):把客户端 session 连接节点和 leader 节点进行同步。
方法特点:
        所有获取 znode 数据的 API 都可以设置一个 watch 用来监控 znode 的变化。
        所有更新 znode 数据的 API 都有两个版本: 无条件更新版本和条件更新版本。 如果 version 为 -1,更新为无条 件更新。否则只有给定的 version 和 znode 当前的 version 一样,才会进行更新,这样的更新是条件更新。
        所有的方法都有同步和异步两个版本。 同步版本的方法发送请求给 ZooKeeper 并等待服务器的响 应。异步版本 把请求放入客户端的请求队列,然后马上返回。异步版本通过 callback 来接受来 自服务端的响应。
同步创建节点:
@Test
public void createTest() throws KeeperException, InterruptedException {
String path = zooKeeper.create(ZK_NODE, "data".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
 log.info("created path: {}",path);
 }
异步创建节点:
@Test
 public void createAsycTest() throws InterruptedException {
 zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
        CreateMode.PERSISTENT,
        (rc, path, ctx, name) -> log.info("rc {},path {},ctx {},name
{}",rc,path,ctx,name),"context");
    TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
 }
修改节点数据:
@Test
 public void setTest() throws KeeperException, InterruptedException {

 Stat stat = new Stat();
 byte[] data = zooKeeper.getData(ZK_NODE, false, stat);
 log.info("修改前: {}",new String(data));
 zooKeeper.setData(ZK_NODE, "changed!".getBytes(), stat.getVersion());
 byte[] dataAfter = zooKeeper.getData(ZK_NODE, false, stat);
 log.info("修改后: {}",new String(dataAfter));
 }

1.2 Curator开源客户端使用

        Curator是Netflix公司开源的一套ZooKeeper客户端框架,和ZkClient一样它解决了非常底层的细节 开发工作,包括连接、重连、反复注册Watcher的问题以及NodeExistsException异常等。
Curator是Apache基金会的顶级项目之一,Curator具有更加完善的文档,另外还提供了一套易用性和 可读性更强的Fluent风格的客户端API框架。
        Curator还为ZooKeeper客户端框架提供了一些比较普遍的、开箱即用的、分布式开发用的解决方案, 例如Recipe、共享锁服务、Master选举机制和分布式计算器等,帮助开发者避免了“重复造轮子”的无效开发工作。
Guava is to Java that Curator to ZooKeeper
在实际
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长情知热爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值