java curator_使用curator实现选举

本文介绍了如何借助Apache Curator库在Zookeeper上实现选举功能。通过引入Curator的相关jar包并设置重试策略,利用LeaderSelector和LeaderLatch两种方式实现选举。LeaderSelector采用回调方式处理领导权变化,而LeaderLatch则允许程序阻塞直至获得领导权。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

使用zookeeper自己来实现选举还是有点麻烦的(使用zookeeper实现选举),这个时候可以使用curator

正如官网所说,curator对于zookeeper就像guava对于java,它让我们能更加便利、可靠地使用zookeeper。

这篇博客会介绍如何通过curator来实现选举。

使用方式

引入jar

org.apache.curator

curator-client

2.11.0

org.apache.curator

curator-framework

2.11.0

org.apache.curator

curator-recipes

2.11.0

使用LeaderSelector实现选举

String zookeeperAddr = "127.0.0.1:2181";

//zk的重连策略

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

//获取连接

CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperAddr, retryPolicy);

client.start();

String path = "/newserver/leader"; //选举的节点信息放在这个path下

//这里建议使用LeaderSelectorListenerAdapter,它实现了stateChanged,当与zk失连后,会自动取消领导权

LeaderSelector leaderSelector = new LeaderSelector(client, path, new LeaderSelectorListenerAdapter() {

@Override

public void takeLeadership(CuratorFramework client) throws Exception {

System.out.println("成为leader了");

Thread.sleep(10000); //sleep 10秒

//注意当takeLeadership方法返回之后,相当于放弃成为leader了

System.out.println("放弃成为leader");

}

});

//放弃领导权之后,自动再次竞选

leaderSelector.autoRequeue();

leaderSelector.start();

TimeUnit.HOURS.sleep(1);

测试结果

两个竞选者轮流成为leader

8cf854bd63805839a0f3a78af10cde2e.png

5079d4b9f0792d752e74e09aa563ccb2.png

使用LeaderLatch来实现选举

String zookeeperAddr = "127.0.0.1:2181";

//重连策略

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

//获取连接

CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperAddr, retryPolicy);

client.start();

String path = "/newserver/leader";

LeaderLatch leaderLatch = new LeaderLatch(client, path);

leaderLatch.start();

leaderLatch.await();//阻塞等待自己有领导权

System.out.println("成为leader了");

new BufferedReader(new InputStreamReader(System.in)).readLine();//输入参数后,放弃领导权

leaderLatch.close();

System.out.println("放弃成为leader,当前是否有领导权:" + leaderLatch.hasLeadership());

afd8b32831527682dea2f3031d491f64.png

LeaderLatch与LeaderSelector的不同

1)LeaderSelector使用回调的方式来处理获取领导权之后的操作,LeaderLatch提供了类似于CountDownLatch的方式,可以阻塞程序,直到服务获取领导权为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值