zookeeper master选举
应用场景:从集群中选举一个服务器处理任务
实现原理:多个进程在同一个目录节点下创建子节点,只有一个可以创建成功,创建成功的进程执行任务,其他进程等待
******************************
相关类
LeaderSelector
public class LeaderSelector implements Closeable {
*****************************
构造方法
public LeaderSelector(CuratorFramework client, String leaderPath, LeaderSelectorListener listener)
public LeaderSelector(CuratorFramework client, String leaderPath, ExecutorService executorService, LeaderSelectorListener listener)
public LeaderSelector(CuratorFramework client, String leaderPath, CloseableExecutorService executorService, LeaderSelectorListener listener) {
*****************************
常用方法
public void autoRequeue() //执行完成后重新排队选主
public void start() //开始选主
public boolean requeue() //重新排队
public synchronized void close() //关闭
public Participant getLeader() //获得leader
public boolean hasLeadership() //是否有leader
public Collection<Participant> getParticipants()
//获得所有选主参与者
Participant
public class Participant {
private final String id;
private final boolean isLeader;
public Participant(String id, boolean leader) {
this.id = id;
this.isLeader = leader;
}
。。。。
}
LeaderSelectorListener
public interface LeaderSelectorListener extends ConnectionStateListener {
void takeLeadership(CuratorFramework var1) throws Exception;
}
说明:当执行完takeLeadership(CuratorFramework var1)后,会重新选主
****************************
使用示例
********************
config 层
@Configuration
public class ZookeeperConfig {
@Value("${zookeeper.connecting-string}")
private String connectingString;
@Bean
public CuratorFramework initCuratorFramework(){
CuratorFramework curatorFramework= CuratorFrameworkFactory.builder()
.connectString(connectingString)
.sessionTimeoutMs(5000)
.retryPolicy(new ExponentialBackoffRetry(1000,3,3000))
.namespace("test")
.build();
curatorFramework.start();
return curatorFramework;
}
}
********************
controller 层
@RestController
public class HelloController {
@Autowired
private CuratorFramework curatorFramework;
private String master_path="/master";
@RequestMapping("/get4")
public String test3(){
ExecutorService executorService=Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
executorService.submit(()->{
LeaderSelector leaderSelector=new LeaderSelector(curatorFramework, master_path, new LeaderSelectorListenerAdapter() {
@Override
public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
try{
System.out.println(Thread.currentThread().getId()+" 开始选主: "+System.currentTimeMillis());
Thread.sleep(1000);
System.out.println(Thread.currentThread().getId()+" 执行结束: "+System.currentTimeMillis());
}catch (Exception e){
e.printStackTrace();
}
}
});
leaderSelector.start();
});
}
return "success";
}
}
********************
控制台输出:
49 开始选主: 1569202690581
49 执行结束: 1569202691586
47 开始选主: 1569202691609
47 执行结束: 1569202692612
45 开始选主: 1569202692622
45 执行结束: 1569202693625
48 开始选主: 1569202693637
48 执行结束: 1569202694639
46 开始选主: 1569202694650
46 执行结束: 1569202695652