ZooKeeper完全解析(十) 使用Curator來簡化ZooKeeper操作之群首選舉
阿新 • • 發佈:2019-01-30
上一篇我們講解如何使用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(); } } }