ZooKeeper完全解析(十) 使用Curator来简化ZooKeeper操作之群首选举

本文介绍了如何利用Curator的LeaderLatch类进行ZooKeeper群首选举。通过实例化、添加监听、启动监听、关闭监听等步骤详细阐述了选举过程,强调了在连接丢失时不应继续执行leader操作的重要性。

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

  上一篇我们讲解如何使用Curator来完成分布式锁的相关操作,这一节中我们使用Curator来实现群首选举。

  Curator中有两种类都可以实现群首选举,一个是  LeaderLatch, 一个是 LeaderSelector 。第一种会告诉你是否成为leader,当你close的时候才会交出leader权限,第二种可以在你成为leader之后,更方便的决定是否要交出leader权限,相比之下更加灵活。

  接下来我们主要讲解 LeaderLatch 的使用。

一、实例化:

public LeaderLatch(CuratorFramework client,
                   String latchPath)

此为实例化 LeaderLatch ,latchPath即为要群首选举的路径。

二、添加监听:

public void addListener(LeaderLatchListener listener)

此为添加监听,里面的有 isLeader() 方法回调与 notLeader() 方法,当成为leader的时候,会调用  isLeader() 方法,当连接zooKeeper的状态为 SUSPENDED or LOST 的时候,会调用 notLeader() 方法,即此时与ZooKeeper连接不上了, 不应该再执行leader相关操作

三、开始监听:

leaderLatch.start();

四、关闭监听/交出leader权限:

leaderLatch.close();

五、示例:

package com.happyheng.leader;

import com.happyheng.consts.ZooKeeperConsts;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.leader.LeaderLatch;
import org.apache.curator.framework.recipes.leader.LeaderLatchListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException;

/**
 *
 * Created by happyheng
 */
@Service
public class DistributeSelectorLatch {


    private static final Logger logger = LoggerFactory.getLogger(DistributeSelectorLatch.class);

    @Autowired
    private CuratorFramework curatorFramework;


    private LeaderLatch leaderLatch = null;

    @PostConstruct
    public void selectLeader() {

        leaderLatch = new LeaderLatch(curatorFramework, "/leader");
        leaderLatch.addListener(new LeaderLatchListener() {
            @Override
            public void isLeader() {
                logger.info("成为leader ");

                ZooKeeperConsts.isMaster = true;
            }

            @Override
            public void notLeader() {

                /**
                 * 注意当连接zooKeeper的状态为 SUSPENDED or LOST 的时候,会调用此方法
                 */

                logger.info("失去leader ");

                ZooKeeperConsts.isMaster = false;
            }
        });


        try {
            leaderLatch.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @PreDestroy
    public void destroy() {
        if (leaderLatch == null) {
            return;
        }
        try {
            leaderLatch.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值