1. 程式人生 > >ZooKeeper完全解析(十) 使用Curator來簡化ZooKeeper操作之群首選舉

ZooKeeper完全解析(十) 使用Curator來簡化ZooKeeper操作之群首選舉

  上一篇我們講解如何使用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();
        }
    }

}