神奇的博客--测试

使用Curator来控制ZooKeeper
前言
作为一个了解分布式架构的开发者,一定会用到ZooKeeper,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。虽然ZooKeeper功能强大,但是ZooKeeper客户端的调用比较复杂,对我们开发者相对而言还是不够友好的,而Apache Curator 就是为了简化ZooKeeper客户端调用而生,利用它,可以更好的使用ZooKeeper。

正文
Apache Curator
Apache Curator是一个比较完善的ZooKeeper客户端框架,通过封装的一套高级API 简化了ZooKeeper的操作。通过查看官方文档,可以发现Curator主要解决了三类问题:

封装ZooKeeper client与ZooKeeper server之间的连接处理。
提供了一套Fluent风格的操作API。
提供ZooKeeper各种应用场景(recipe, 比如:分布式锁服务、集群领导选举、共享计数器、缓存机制、分布式队列等)的抽象封装。
Curator主要从以下几个方面降低了zk使用的复杂性:

重试机制:提供可插拔的重试机制, 它将给捕获所有可恢复的异常配置一个重试策略,并且内部也提供了几种标准的重试策略(比如指数补偿)
连接状态监控: Curator初始化之后会一直对zk连接进行监听,一旦发现连接状态发生变化将会作出相应的处理
zk客户端实例管理:Curator会对zk客户端到server集群的连接进行管理,并在需要的时候重建zk实例,保证与zk集群连接的可靠性
各种使用场景支持:Curator实现了zk支持的大部分使用场景(甚至包括zk自身不支持的场景),这些实现都遵循了zk的最佳实践,并考虑了各种极端情况
Curator的组件
在这里插入图片描述

Maven的依赖
在这里插入图片描述

我们在实际的应用时,最常用的是curator-recipes,它可以实现:

锁:包括共享锁、共享可重入锁、读写锁等。
选举:Leader选举算法。
Barrier:阻止分布式计算直至某个条件被满足的“栅栏”,可以看做JDK Concurrent包中Barrier的分布式实现。
缓存:三种Cache及监听机制。
持久化结点:连接或Session终止后仍然在ZooKeeper中存在的结点。
队列:分布式队列、分布式优先级队列等。
Maven引入curator-recipes的依赖

org.apache.curator curator-recipes 2.10.0 1 2 3 4 5 三种Cache及监听机制,值得是Curator提供了三种Watcher(Cache)来监听结点的变化:

Path Cache:监视一个路径下1)孩子结点的创建、2)删除,3)以及结点数据的更新。产生的事件会传递给注册的PathChildrenCacheListener。
Node Cache:监视一个结点的创建、更新、删除,并将结点的数据缓存在本地。
Tree Cache:Path Cache和Node Cache的“合体”,监视路径下的创建、更新、删除事件,并缓存路径下所有孩子结点的数据。
我们这里以最常使用的分布式锁的实现为例,来简单感受Curator的魅力。

Curator实现分布式锁
InterProcessMutexDemo.class:一个分布式锁的简单实现

Thread.currentThread().sleep(5000L)这里休眠5秒中,但不释放资源,下一个其他线程必须要在该线程后释放资源后,才能lock.acquire(),即获取分布式锁
同时针对这个分布式锁简单实现引入依赖时要注意curator和ZooKeeper版本关系,否则可能会报错。
public class InterProcessMutexDemo {

public static void main(String[] args) {
    RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    final CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").sessionTimeoutMs(5000).connectionTimeoutMs(10000).retryPolicy(retryPolicy).namespace("text").build();
    client.start();


    InterProcessMutex lock = new InterProcessMutex(client,"/lock");
    try {
        lock.acquire();
        System.err.println("生成订单号");
        Thread.currentThread().sleep(5000L);
    } catch (Exception e) {
    } finally {
        try {
            lock.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    try {
        lock.acquire();
        System.err.println("生成订单号");
        Thread.currentThread().sleep(Long.MAX_VALUE);
    } catch (Exception e) {
    } finally {
        try {
            lock.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值