上一节使用zookeeper实现分布式锁,这节使用ZKClient实现master选举
ZKClient使用比zookeeper要方便些,API更加简单。
master选举实现原理
- 每一台服务器都去竞争创建/master节点
- 如果创建成功,那么master就是当前创建的服务器
- 创建失败,则监听/master节点的删除事件
- 一旦/master删除,所有客户端再次去竞争创建/master节点。谁创建成功,谁就是主节点
master选择类
package com.app.master;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.exception.ZkException;
import org.I0Itec.zkclient.exception.ZkInterruptedException;
import org.I0Itec.zkclient.exception.ZkNoNodeException;
import org.I0Itec.zkclient.exception.ZkNodeExistsException;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
/**
* @Author: chao.zhu
* @Email: chao.zhu@rograndec.com
* @CreateDate: 2018/08/06
* @Version: 1.0
*/
public class MasterSelector {
private ZkClient zkClient;
//当前服务器信息
private ServiceNodeInfo serviceNodeInfo;
//所有进程争抢的节点
private String MASTER_PATH = "/master";
//超时时间
private Integer SESSION_OUT=5000;
//master节点
private ServiceNodeInfo masterNode;
//服务器是否启动
private volatile boolean running = false;
//master监听事件
IZkDataListener dataListener;
//任务调度类。模拟心跳动作,每隔一小段时间当前serviceNodeInfo去和zookeeper交互一次,看当前master是否挂掉
private ScheduledE