`
1028826685
  • 浏览: 938855 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

ZookeeperNetflix Curator 使用

 
阅读更多

curator简介

Netflix curator 是Netflix公司开源的一个Zookeeper client library,用于简化zookeeper客户端编程,包含一下几个模块:

  • curator-client - zookeeper client封装,用于取代原生的zookeeper客户端,提供一些非常有用的客户端特性
  • curator-framework - zookeeper api的高层封装,大大简化zookeeper客户端编程,添加了例如zookeeper连接管理、重试机制等
  • curator-recipes - zookeeper recipes 基于curator-framework的实现(除2PC以外)

maven dependency:

 

[html] view plain copy
 
  1. <dependency>  
  2.     <groupId>com.netflix.curator</groupId>  
  3.     <artifactId>curator-recipes</artifactId>  
  4.     <version>0.6.4</version>  
  5. </dependency>  

注意:在www.mvnrepository.com中认为0.32为最新版本,其实迄今为止最新版本为0.64,github trunk中的版本现在是0.65-SNAPSHOT

 

 

 

curator framework 使用

示例代码:

 

[java] view plain copy
 
  1.               String path = "/test_path";  
  2. CuratorFramework client = CuratorFrameworkFactory.builder()  
  3.         .connectString("test:2181").namespace("/test1")  
  4.         .retryPolicy(new RetryNTimes(Integer.MAX_VALUE, 1000))  
  5.         .connectionTimeoutMs(5000).build();  
  6. //create a node  
  7. client.create().forPath("/head"new byte[0]);  
  8.   
  9. //delete a node in background  
  10. client.delete().inBackground().forPath("/head");  
  11.   
  12. // create a EPHEMERAL_SEQUENTIAL  
  13. client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/head/child"new byte[0]);  
  14.   
  15. // get the data   
  16. client.getData().watched().inBackground().forPath("/test");  
  17.   
  18. // check the path exits  
  19. client.checkExists().forPath(path);  


curator framework使用builder模式和类似nio的chain api,代码非常简洁

 

curator recipes 使用

InterProcessMutex

用途:进程间互斥锁

示例代码:

 

[java] view plain copy
 
  1. String lockName = "/lock1";  
  2. InterProcessLock lock1 = new InterProcessMutex(this.curator, lockName);  
  3. InterProcessLock lock2 = new InterProcessMutex(this.curator, lockName);  
  4. lock1.acquire();  
  5. boolean result = lock2.acquire(1, TimeUnit.SECONDS);  
  6. assertFalse(result);  
  7. lock1.release();  
  8. result = lock2.acquire(1, TimeUnit.SECONDS);  
  9. assertTrue(result);  

 

原理:每次调用acquire在/lock1节点节点下使用CreateMode.EPHEMERAL_SEQUENTIAL 创建新的ephemeral节点,然后getChildren获取所有的children,判断刚刚创建的临时节点是否为第一个,如果是,则获取锁成功;如果不是,则删除刚刚创建的临时节点。

注意: 每次accquire操作,成功,则请求zk server 2次(一次写,一次getChildren);如果失败,则请求zk server 3次(一次写,一次getChildren,一次delete)

InterProcessReadWriteLock

示例代码:

 

[java] view plain copy
 
  1. @Test  
  2. public void testReadWriteLock() throws Exception{  
  3.     String readWriteLockPath = "/RWLock";  
  4.     InterProcessReadWriteLock readWriteLock1 = new InterProcessReadWriteLock(this.curator, readWriteLockPath);  
  5.     InterProcessMutex writeLock1 = readWriteLock1.writeLock();  
  6.     InterProcessMutex readLock1 = readWriteLock1.readLock();  
  7.       
  8.     InterProcessReadWriteLock readWriteLock2 = new InterProcessReadWriteLock(this.curator, readWriteLockPath);  
  9.     InterProcessMutex writeLock2 = readWriteLock2.writeLock();  
  10.     InterProcessMutex readLock2 = readWriteLock2.readLock();  
  11.     writeLock1.acquire();  
  12.       
  13.     // same with WriteLock, can read  
  14.     assertTrue(readLock1.acquire(1, TimeUnit.SECONDS));  
  15.       
  16.     // different lock, can't read while writting  
  17.     assertFalse(readLock2.acquire(1, TimeUnit.SECONDS));  
  18.       
  19.     // different write lock, can't write  
  20.     assertFalse(writeLock2.acquire(1, TimeUnit.SECONDS));  
  21.       
  22.     // release the write lock  
  23.     writeLock1.release();  
  24.       
  25.     //both read lock can read  
  26.     assertTrue(readLock1.acquire(1, TimeUnit.SECONDS));  
  27.     assertTrue(readLock2.acquire(1, TimeUnit.SECONDS));  
  28. }  
 

 

原理: 同InterProcessMutext,在ephemeral node的排序算法上做trick,write lock的排序在前。

注意: 同一个InterProcessReadWriteLock如果已经获取了write lock,则获取read lock也会成功

 

 

LeaderSelector

示例代码:

 

[java] view plain copy
 
  1. @Test  
  2. public void testLeader() throws Exception{  
  3.     LeaderSelectorListener listener = new LeaderSelectorListener(){  
  4.   
  5.   
  6.         @Override  
  7.         public void takeLeadership(CuratorFramework client)  
  8.                 throws Exception {  
  9.             System.out.println("i'm leader");  
  10.         }  
  11.   
  12.         @Override  
  13.         public void handleException(CuratorFramework client,  
  14.                 Exception exception) {  
  15.               
  16.         }  
  17.   
  18.         @Override  
  19.         public void notifyClientClosing(CuratorFramework client) {  
  20.               
  21.         }};  
  22.     String leaderPath = "/leader";  
  23.     LeaderSelector selector1 = new LeaderSelector(this.curator, leaderPath, listener);  
  24.     selector1.start();  
  25.     LeaderSelector selector2 = new LeaderSelector(this.curator, leaderPath, listener);  
  26.     selector2.start();  
  27.     assertFalse(selector2.hasLeadership());  
  28. }  


原理:内部基于InterProcessMutex实现,具体细节参见shared lock一节

 

 

总结

    curator还提供了很多其他的实现,具体参见https://github.com/Netflix/curator/wiki/Recipes 

分享到:
评论

相关推荐

    zookeeper 使用 Curator 示例监听、分布式锁

    2. Curator:Curator 是由 Netflix 开发并贡献给 Apache 的 ZooKeeper 客户端库,它提供了一套高级API,使得开发者能够更方便地处理 ZooKeeper 中常见的任务,例如创建、删除节点、设置/获取节点数据,以及实现...

    Zookeeper客户端Curator Framework使用代码

    Curator Framework是Zookeeper的Java客户端,由Netflix开发并贡献给Apache。它提供了更高级别的抽象,简化了与Zookeeper交互的复杂性,包括连接管理、故障检测、模式操作、分布式锁等。 3. **Curator Framework...

    zookeeper开源客户端Curator

    Curator是Netflix公司开源的一套ZooKeeper客户端框架,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等,实现了Fluent风格的API接口,目前已经...

    netflix.curator

    netflix.curatorThe Curator Framework is a high-level API that greatly simplifies using ZooKeeper. It adds many features that build on ZooKeeper and handles the complexity of managing connections to ...

    浅谈Zookeeper开源客户端框架Curator

    Curator是一个基于Zookeeper的开源客户端框架,由Netflix开发,旨在解决Zookeeper客户端使用过程中的各种问题。Curator提供了封装ZooKeeper client与ZooKeeper server之间的连接处理、提供了一套Fluent风格的操作API...

    使用curator实现zookeeper锁服务的示例分享

    Curator是Netflix开源的一个用于简化Zookeeper使用的Java客户端库,它提供了很多高级功能,包括分布式锁、事件监听、配方等。在这个示例中,我们将使用Curator的`InterProcessMutex`类来实现分布式互斥锁(Mutex)。...

    4、zookeeper的java三种客户端介绍-Curator(crud、事务操作、监听、分布式计数器、分布式锁)

    Apache Curator是由Netflix开源,现已成为Apache顶级项目的Zookeeper客户端。它旨在提供更高级别的API和实用工具,使得使用Zookeeper变得更加简单和可靠: 1. 解决了Watcher一次性触发的问题,提供了可持久化的监听...

    boson-0.0.5.zip

    Netflix Curator是一个流行的开源库,专为Apache ZooKeeper设计,用于简化ZooKeeper的使用。ZooKeeper是一个分布式协调服务,广泛用于管理和维护分布式系统的配置信息、命名服务、分布式同步、组服务等。Curator通过...

    VIP-02 Zookeeper客户端使用与集群特性(1)

    Curator是Netflix公司开源的一个针对ZooKeeper的高级Java客户端框架。它不仅简化了ZooKeeper的使用,还提供了丰富的抽象和工具类,使得开发者能够更加专注于业务逻辑而不用过多关注ZooKeeper的具体实现细节。Curator...

    finagle-thriftmux_2.9.2-6.4.1.zip

    【描述】"curator.zip,由netflixzookeeper客户端包装和富zookeeper框架开发的馆长" 提到的是Netflix Curator,这是一个用于Apache ZooKeeper的Java客户端库。ZooKeeper是一个分布式协调服务,常用于管理分布式应用中...

    zookeeper实战

    Curator是Netflix开源的ZooKeeper客户端框架,它提供了一套高级API来简化ZooKeeper客户端的使用。Curator封装了许多常见的操作,使得开发者可以更加方便地利用ZooKeeper的特性,无需深入底层细节。Curator的常用API...

    springcloud集成zookeeper的方法示例

    Curator 是 Netflix 公司开源的一个 ZooKeeper 客户端,与 ZooKeeper 提供的原生客户端相比,Curator 的抽象层次更高,简化了 ZooKeeper 客户端编程。 最后,我们可以使用 CuratorFramework 来访问和操作 ZooKeeper...

    LTS 使用说明文档1

    &lt;groupId&gt;com.netflix.curator&lt;/groupId&gt; &lt;artifactId&gt;curator-framework ${curator.version} 然后,需要在代码中设置 ZooKeeper 的配置: setRegistryAddress("zookeeper://127.0.0.1:2181") JobTracker ...

    0806分布式协调服务笔记1

    Curator是Netflix开源的Zookeeper客户端,它提供了一系列的高级抽象和工具,如curator-framework的Fluent风格API,简化了Zookeeper的操作。curator-replica则封装了复制和故障转移的逻辑,简化了应用开发。Curator还...

    raycloud

    在Java环境中,可以使用Nginx、HAProxy等工具,或者在应用层面利用Spring Cloud Netflix Ribbon和Feign实现客户端负载均衡。Ribbon是一个内置的HTTP客户端,用于负载均衡,而Feign是一个声明式Web服务客户端,它利用...

Global site tag (gtag.js) - Google Analytics