有人可能会问zookeeper我知道,但是curator是什么呢?

其实curator是apachede针对zookeeper开发的一个api框架是apache的顶级项目 他与zookeeper原生api相比更加简洁方便使用

特别就是注册watcher这方面.再也不用我们手工去重复注册watcher了.我们只需监听一下然后curator全给我们做了.而且支持递归创建节点

和递归删除节点.

更大的优势是实现分布式锁和分布式计数器以及分布式的同步更加方便.

以前我们基于zk原生的api实现分布式锁相当麻烦,但是我们基于curator去实现分布式锁那就是特别简单的事了.

废话不多说直接上代码

一个简单的demo

/**
* 分布式锁
*/
public class CouratorLock { //初始化url
private static final String url="1.11.11.1:2181,1.11.11.2:2182,1.11.11.3:2183"; private static int count=10; public static void main(String[] args){ for(int i=0;i<10;i++){
new Thread(new Runnable() {
@Override
public void run() {
CuratorFramework zk= CuratorFrameworkFactory.builder()
.sessionTimeoutMs(5000)
.retryPolicy(new RetryNTimes(3,1000))
.connectionTimeoutMs(50000)
.connectString(url)
.build();
zk.start();
//分布式锁
InterProcessMutex lock=new InterProcessMutex(zk,"/lock");
try {
//枷锁
lock.acquire();
get();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
//释放锁
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
public static void get(){
count--;
System.out.println(count);
}
}

  

没错就是这么简单,curator为我们提供了InterProcessMutex这个类来实现分布式的锁

其中.acquire();这个方法就是开始枷锁..release();就是释放锁.

看很简单吧.相比我们用zk原生的api实现起来超级简单

其实底层还是基于临时节点实现的,而且curator支持一个更加强大的功能,就是当你的客户端下线以后再次启动如果再次期间你监听的节点的有变化,

curator的watcher会立马进行回调..

所以使用curator开发相当方便,

我们看下curator的CRUD

下面我们看下curator是怎么实现分布式计数器的

其实也是很简单,以为复杂的curator都提我们做完了

/**
* 分布式的计数器
*/
public class CuratorCounter {
//初始化url
private static final String url="1.11.11.1:2181,1.11.11.2:2182,1.11.11.3:2183"; private static int count=10; public static void main(String[] args) throws Exception { CuratorFramework zk= CuratorFrameworkFactory.builder()
.sessionTimeoutMs(5000)
.retryPolicy(new RetryNTimes(3,1000))
.connectionTimeoutMs(50000)
.connectString(url)
.build();
zk.start();
//分布式计数器
DistributedAtomicInteger counter=new DistributedAtomicInteger(zk,"/super",new RetryNTimes(3,100));
//初始化
//counter.forceSet(0);
AtomicValue<Integer> value = counter.increment();
System.out.println("原值为"+value.preValue());
System.out.println("更改后的值为"+value.postValue());
System.out.println("状态"+value.succeeded()); }
}

  

 

DistributeAtomicInteger就是curator为我们提供的分布式计数器的类

关于分布式同步机制我就不给大家介绍了.其实也是很简单的.你们自行去了解吧

能力有限,有错误之处还望指出

zookeeper之分布式锁以及分布式计数器(通过curator框架实现)的更多相关文章

  1. Redis的n种妙用,分布式锁,分布式唯一id,消息队列,抽奖……

    介绍 redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) Redis用作缓存,主要两个 ...

  2. Redis实现的分布式锁和分布式限流

    随着现在分布式越来越普遍,分布式锁也十分常用,我的上一篇文章解释了使用zookeeper实现分布式锁(传送门),本次咱们说一下如何用Redis实现分布式锁和分布限流. Redis有个事务锁,就是如下的 ...

  3. Redis系列(二)--分布式锁、分布式ID简单实现及思路

    分布式锁: Redis可以实现分布式锁,只是讨论Redis的实现思路,而真的实现分布式锁,Zookeeper更加可靠 为什么使用分布式锁: 单机环境下只存在多线程,通过同步操作就可以实现对并发环境的安 ...

  4. Zookeeper+Curator 分布式锁

    本来想着基于zk临时节点,实现一下分布式锁,结果发现有curator框架.PS:原声API真的难用,连递归创建path都没有? 配置curator maven的时候,md配置了好几个小时,最后发现集中 ...

  5. Zookeeper分布式锁实现Curator十一问

    前面我们剖析了Redisson的源码,主要分析了Redisson实现Redis分布式锁的15问,理清了Redisson是如何实现的分布式锁和一些其它的特性.这篇文章就来接着剖析Zookeeper分布式 ...

  6. 整理分布式锁:业务场景&分布式锁家族&实现原理

    1.引入业务场景 业务场景一出现: 因为小T刚接手项目,正在吭哧吭哧对熟悉着代码.部署架构.在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导 ...

  7. 【zookeeper】Apache curator的使用及zk分布式锁实现

    上篇,本篇主要讲Apache开源的curator的使用,有了curator,利用Java对zookeeper的操作变得极度便捷. 其实在学之前我也有个疑虑,我为啥要学curator,撇开涨薪这些外在的 ...

  8. 分布式锁(Zookeeper实现)

    分布式锁 分布式锁,这个主要得益于 ZooKeeper 为我们保证了数据的强一致性.锁服务可以分为两类,一个是 保持独占,另一个是 控制时序. 1. 所谓保持独占,就是所有试图来获取这个锁的客户端,最 ...

  9. 基于缓存或zookeeper的分布式锁实现

    缓存锁  我们常常将缓存作为分布式锁的解决方案,但是却不能单纯的判断某个 key 是否存在 来作为锁的获得依据,因为无论是 exists 和 get 命名都不是线程安全的,都无法保证只有一个线程可以获 ...

随机推荐

  1. Zabbix安装之路

    这次的教程多半是搬运过来的,但都经过小轩亲自测试与修改了.文章最后将公布原资源地址.此篇算是整合,但又不全是整合. 依旧需求开篇:上头让小轩监控一下服务器的情况,在前几篇也有所提到.于是小轩就到处去找 ...

  2. git忽略文件

    .gitignore文件配置 ###################### # Project Specific ###################### /src/main/webapp/dis ...

  3. Xcode中StoryBoard Reference 新特性的使用

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. Android开发之常见事件响应方式

    常见的事件有   (1)单击事件 onClickListener (2)长按事件 onLongClickListener (3)滑动事件 onTouchListener (4)键盘事件 onKeyLi ...

  5. myeclipse无法导入项目

    MyEclipse无法导入Java项目时常遇到的两种情况: 1.Some projects cannot be imported because they already exist in the w ...

  6. 【二十四】使用mysqli扩展类批量执行多条sql语句

    批量处理多个sql语句 <?php //批量执行多个dml语句 // $mysqli=new mysqli("localhost","root",&quo ...

  7. JavaWeb 例子 JDBC+JSP登陆注册留言板

    注册页面: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  8. 二叉树Bynary_Tree(2):二叉树的递归遍历

    7/18/2017 正在码,理解完就写博 7/21/2017 终于码完,借助链表实现的队列撸一个二叉树对于我来说有难度,撸了两天没有成果,我最后选用的是数组实现的循环队列去撸一个二叉树 正文如下: 以 ...

  9. 完善chrome翻译插件ChaZD,支持有道智云api

    首先放上该项目的github地址:https://github.com/codethereforam/ChaZD 之前想找一个chrome支持划词翻译的插件,最终在知乎上看到了这个回答,推荐的是Cha ...

  10. js scrollTop 事件

    代码: window.onscroll = function() { var t = document.documentElement.scrollTop || document.body.scrol ...