`

Curator 框架实现在多台机器中选取leader

    博客分类:
  • java
 
阅读更多

Curator对ZK的一些应用场景提供了非常好的实现,而且有很多扩充,这些都符合ZK使用规范

 它的主要组件为:

  • Recipes, ZooKeeper的系列recipe实现, 基于 Curator Framework.
  • Framework, 封装了大量ZooKeeper常用API操作,降低了使用难度, 基于Zookeeper增加了一些新特性,对ZooKeeper链接的管理,对链接丢失自动重新链接。
  • Utilities,一些ZooKeeper操作的工具类包括ZK的集群测试工具路径生成等非常有用,在Curator-Client包下org.apache.curator.utils。
  • Client,ZooKeeper的客户端API封装,替代官方 ZooKeeper class,解决了一些繁琐低级的处理,提供一些工具类。
  • Errors,异常处理, 连接异常等
  • Extensions,对curator-recipes的扩展实现,拆分为 curator-:stuck_out_tongue_closed_eyes:iscovery和 curator-:stuck_out_tongue_closed_eyes:iscovery-server提供基于RESTful的Recipes WEB服务.

    下载jar包

// https://mvnrepository.com/artifact/org.apache.curator/curator-framework

compile group: 'org.apache.curator', name: 'curator-framework', version: '2.11.1'

compile group: 'org.apache.curator', name: 'curator-client', version: '2.11.1'

compile group: 'org.apache.curator', name: 'curator-recipes', version: '2.11.1'

compile group: 'org.apache.curator', name: 'curator-test', version: '2.11.1'

 

代码:

 

package org.gjp;

 

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.TimeUnit;

 

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.framework.recipes.leader.LeaderLatch;

import org.apache.curator.framework.recipes.leader.LeaderLatch.CloseMode;

import org.apache.curator.framework.recipes.leader.LeaderLatchListener;

import org.apache.curator.retry.ExponentialBackoffRetry;

import org.apache.curator.test.TestingServer;

import org.apache.curator.utils.CloseableUtils;

 

public class LeaderDemo3 {

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

       final List<LeaderLatch> leaders=new ArrayList<LeaderLatch>();

       final List<CuratorFramework> clients=new ArrayList<CuratorFramework>();

        

       final TestingServer server=new TestingServer();

               

        try{

            for(int i=0;i<10;i++){

            //建立模拟客户端

CuratorFramework client=CuratorFrameworkFactory.newClient("127.0.0.1:2181",

             new ExponentialBackoffRetry(20000,3));

             clients.add(client);

           //Leader选举   注意每个客户端的路径都要相同才会在同一个组中  

           final  LeaderLatch leader=new LeaderLatch(client,"/zkpath2","clent"+i);

             leader.addListener(new LeaderLatchListener(){

           //获取leader权限时执行  

               public void isLeader() {

                   System.out.println(leader.getId()+" ;I am Leader");

                   

                   //拥有leader权限的长度

                   try {

                   final int  waitSeconds = (int)(5 * Math.random()) + 1;

Thread.sleep(TimeUnit.SECONDS.toMillis(waitSeconds));

} catch (InterruptedException e1) {

e1.printStackTrace();

}

                   

                   

                   //模拟让出leader 权限

                   if(leader !=null){

                   try {

                   //关闭是通知所有客户端

leader.close(CloseMode.NOTIFY_LEADER);

} catch (IOException e) {

e.printStackTrace();

}

                   }

               }

 

             //是否leader权限时执行  

               public void notLeader() {

                   System.out.println(leader.getId()+"   I am not Leader");

               }});

             

             

             

             

             

             leaders.add(leader);

             //客户端启动

             client.start();

             try {

           //必须启动LeaderLatch: leaderLatch.start(); 一旦启动, LeaderLatch会和其它使用相同latch path的其它LeaderLatch交涉,然后随机的选择其中一个作为leader

leader.start();

} catch (Exception e) {

e.printStackTrace();

}

 

            }

            

            Thread.sleep(Integer.MAX_VALUE);

        }finally{

            for(CuratorFramework client:clients){

              CloseableUtils.closeQuietly(client);    

            }

            

            for(LeaderLatch leader:leaders){

                CloseableUtils.closeQuietly(leader);

            }

            

            CloseableUtils.closeQuietly(server);

        }

        

        

        Thread.sleep(Integer.MAX_VALUE);

    }

 

}

 

运行结果:



 

 

 

 

  • 大小: 11.1 KB
分享到:
评论

相关推荐

    项目加入zookeeper的依赖包(Curator框架)

    标题提到的“项目加入Zookeeper的依赖包(Curator框架)”意味着我们要在Java项目中引入这两个关键组件:Zookeeper和Curator。在Java项目中,我们通常通过Maven或Gradle来管理依赖。对于Zookeeper和Curator,我们需要...

    Curator的JAR包

    2. **分布式锁**:在多节点环境中,同步访问共享资源是常见的需求。Curator的分布式锁食谱可以防止多个节点同时修改同一数据,确保数据的一致性。 3. **分组服务**:通过Group服务,节点可以加入到特定的组中,实现...

    zk使用curator实现分布式锁

    在传统的单机系统中,我们可以使用synchronized关键字或ReentrantLock等来实现线程同步,但在分布式环境中,我们需要一种跨机器的锁机制,这就是ZooKeeper和Curator实现的分布式锁。 ZooKeeper的分布式锁工作原理...

    Zookeeper开源客户端框架Curator简介与示例

    首先,我们需要在 `pom.xml` 文件中添加 Curator 的依赖。接着,在 `src` 目录下编写 Java 代码: ```java import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework....

    浅谈Zookeeper开源客户端框架Curator

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

    zookeeper学习之三(Curator客户端)

    Curator提供了一个名为`Configurator`的工具,使得应用程序可以轻松地在ZooKeeper中存储和获取配置信息,从而实现动态配置。 10. **测试支持**: Curator还提供了测试工具,如`TestingServer`,用于单元测试和...

    zookeeper客户端curator操作示例

    Curator支持原子性的多操作事务,可以在一次会话中执行一系列操作,确保它们要么全部成功,要么全部失败。 8. **异步操作**: Curator提供了异步操作接口,允许开发者在不阻塞主线程的情况下进行ZooKeeper操作。 ...

    apache-curator.rar

    Curator 提供了丰富的 API 和策略,使得开发者能够更方便地在应用程序中集成 ZooKeeper。 在 "apache-curator.rar" 压缩包中,我们可以预期找到 Apache Curator 的相关资料,包括库的源代码、文档、示例和可能的...

    curator zookeeper 3.4.6 2.9.1

    1. guava-18.0.jar:这是Google的Guava库,提供了一组通用的Java集合框架、多线程支持、I/O工具等,对于Curator的某些功能实现至关重要,比如缓存管理和延迟任务。 2. mockito-all-1.9.0.jar:Mockito是一个单元...

    curator-client

    5. **缓存**:Curator有内置的数据缓存机制,可以在本地缓存Zookeeper中的数据,提高读取速度并减少网络通信。 四、版本选择与升级 选择Curator客户端版本时,应考虑兼容性和功能需求。对于新的项目,建议使用最新...

    zookeeper Java api - curator 5.6.0

    2. **基本概念**:Curator 包含了多个框架,如 CuratorFramework、ZkClient、 recipes 等,它们提供了不同的功能。CuratorFramework 是 Curator 的核心,它封装了 ZooKeeper 连接的创建、会话管理以及操作执行等。 ...

    curator_zookeeper需要的jar

    在Java开发中,Apache Curator 是一个非常重要的工具库,它为使用Zookeeper提供了一套高级API,简化了Zookeeper的使用。标题“curator_zookeeper需要的jar”表明我们正在讨论Curator与Zookeeper集成时所需的JAR文件...

    apache-curator-3.2.0

    4. **Transaction Support**:Curator 支持 ZooKeeper 的事务操作,允许在一个原子操作中执行多个更新。 5. **Service Discovery**:Curator 提供了服务发现机制,使得应用能够发现和注册服务,有助于构建松耦合的...

    curator-client-2.7.1-API文档-中文版.zip

    赠送jar包:curator-client-2.7.1.jar; 赠送原API文档:curator-client-2.7.1-javadoc.jar; 赠送源代码:curator-client-2.7.1-sources.jar; 赠送Maven依赖信息文件:curator-client-2.7.1.pom; 包含翻译后的API...

    zk客户端curator2.11

    在Curator Framework基础上封装的curator-recipes,实现了很多经典场景。比如:集群管理(Leader选举)、共享锁、队列、Counter等等。可以总结Curator主要解决以下三类问题: 封装ZK Client与Server之间的连接处理...

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

    本示例将详细介绍如何利用 Curator 在 ZooKeeper 上进行数据操作以及实现分布式锁。 一、ZooKeeper 与 Curator 的基本概念 1. ZooKeeper:ZooKeeper 是一款分布式协调服务,它为分布式应用提供一致性服务,如命名...

    Zookeeper客户端Curator Framework使用代码

    它采用的是主从复制的架构,数据存储在内存中,确保高可用性和一致性。 2. **Curator Framework概述** Curator Framework是Zookeeper的Java客户端,由Netflix开发并贡献给Apache。它提供了更高级别的抽象,简化了...

    zookeeper开源客户端Curator

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

    5、zookeeper的java -Curator(服务注册与发现)

    Curator的`ServiceCache`提供了更加高效的服务查询方式,它会在内存中缓存服务实例,减少对Zookeeper的频繁查询,同时使用Watcher机制实时更新服务列表。 总的来说,Zookeeper结合Curator的`ServiceDiscovery`机制...

    curator-framework-2.6.0-API文档-中文版.zip

    赠送jar包:curator-framework-2.6.0.jar; 赠送原API文档:curator-framework-2.6.0-javadoc.jar; 赠送源代码:curator-framework-2.6.0-sources.jar; 赠送Maven依赖信息文件:curator-framework-2.6.0.pom; ...

Global site tag (gtag.js) - Google Analytics