zookeeper分布式集群Curator的LeaderSelector节点选举Leader,面试必问

24 阅读1分钟

public static void main(String[] args) {

//初始化log4j,zookeeper否则报错。

//org.apache.log4j.BasicConfigurator.configure();

try {

Main app = new Main();

app.zk();

} catch (Exception e) {

e.printStackTrace();

}

}

private void zk() throws Exception {

String path = "/path/leader";

List clients = new ArrayList<>();

List leaderSelectors = new ArrayList<>();

for (int i = 0; i < COUNT; i++) {

CuratorFramework client = makeClient();

client.start();

clients.add(client);

//检测是否存在该路径。

Stat stat = client.checkExists().forPath(path);

//如果不存在这个路径,stat为null,创建新的节点路径。

if (stat == null) {

String s = client.create()

.creatingParentsIfNeeded()

.withMode(CreateMode.PERSISTENT)

.forPath(path);

System.out.println(TAG + "创建-" + s);

} else {

System.out.println(TAG + "已存在:" + path + ",不需重复创建");

}

String leaderId = "#" + i;

//不再使用LeaderSelector时,应该调用它的close方法。

LeaderSelector leaderSelector = new LeaderSelector(client, path, new LeaderSelectorListener() {

@Override

public void takeLeadership(CuratorFramework c) throws Exception {

//打印成为leader的信息。

info(leaderSelectors);

}

@Override

public void stateChanged(CuratorFramework client, ConnectionState newState) {

String s = newState.isConnected() ? "连接" : "断连";

System.out.println(TAG + s);

}

});

leaderSelector.setId(leaderId);

leaderSelectors.add(leaderSelector);

//启动竞选leader

leaderSelector.autoRequeue();

leaderSelector.start();

}

TimeUnit.SECONDS.sleep(3);

}

private void info(List leaderSelectors) {

for (LeaderSelector l : leaderSelectors) {

if (l.hasLeadership()) {

System.out.println(TAG + "现任Leader:" + l.getId()+"@"+System.currentTimeMillis());

}

}

}

private CuratorFramework makeClient() {

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5);

CuratorFramework client = CuratorFrameworkFactory.builder()

.connectString(getAddress())

.sessionTimeoutMs(10 * 1000)

.connectionTimeoutMs(20 * 1000)

.retryPolicy(retryPolicy)

.build();

return client;

}

private String getAddress() {

String ip = "127.0.0.1";

return ip + ":2181," + ip + ":2182," + ip + ":2183";

}

}

这里我就分享一份资料,希望可以帮助到大家提升进阶。

内容包含:Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。

如果你有需要的话,可以点击Android学习PDF+架构视频+面试文档+源码笔记获取免费领取方式

喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~

img