【zookeeper CuratorFramework实现服务发现】 1.TreeCache+TreeCacheListener

pom.xml

复制代码
        <!--zk-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.0</version>
        </dependency>

1.Gateway.java

复制代码
package org.example.testZk;

import java.nio.charset.StandardCharsets;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;

@Slf4j
public class Gateway {

    public static void main(String[] args) throws Exception {
        // 启动zk
        CuratorFramework cf = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").sessionTimeoutMs(4000)
                .retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();

        cf.start();

        // 打印下状态
        log.info("zk启动状态:{}", cf.getState());

        // 创建持久节点:游戏服列表根节点
        if (cf.checkExists().forPath("/game-nodes") == null) {
            log.info("持久节点不存在,创建下");
            cf.create().forPath("/game-nodes", "".getBytes(StandardCharsets.UTF_8));
        } else {
            log.info("根节点已经存在");
        }

        // 监听节点的变化
        TreeCache treeCache = new TreeCache(cf, "/game-nodes");
        TreeCacheListener listener = (curatorFramework, event) -> {
            ChildData data = event.getData();
            boolean change = true;

            if (data != null) {
                log.info("改变的路径path={} 事件type={} data={}", event.getData().getPath(), event.getType(), new String(event.getData().getData()));

                switch (event.getType()) {
                    case NODE_ADDED:
                        break;
                    case NODE_UPDATED:
                        break;
                    case NODE_REMOVED:
                        break;
                    default:
                        change = false;
                        break;
                }
            } else {
                change = false;
                log.info("事件type={}", event.getType());
            }


            if (change) {
                System.out.println();
                // 获取所有的游戏服节点列表
                List<String> serverList = cf.getChildren().forPath("/game-nodes");
                if (!serverList.isEmpty()) {
                    for (String gameNodeName : serverList) {
                        String hostPort = new String(cf.getData().forPath("/game-nodes/" + gameNodeName));
                        log.info("游戏服{} 地址信息:{}", gameNodeName, hostPort);
                    }
                } else {
                    log.info("服务器列表为空");
                }

                System.out.println();
            }
        };
        treeCache.getListenable().addListener(listener);
        treeCache.start();

        System.in.read();
    }
}

/*
参考:https://blog.csdn.net/ytangdigl/article/details/108593958
 */

2.GameNode.java

复制代码
package org.example.testZk;

import java.nio.charset.StandardCharsets;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;

@Slf4j
public class GameNode {

    public static void main(String[] args) throws Exception {
        // 启动zk
        CuratorFramework cf = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").sessionTimeoutMs(4000)
                .retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();

        cf.start();

        // 打印下状态
        log.info("zk启动状态:{}", cf.getState());

        // 创建持久节点:游戏服列表根节点
        if (cf.checkExists().forPath("/game-nodes") == null) {
            log.info("持久节点不存在,创建下");
            cf.create().forPath("/game-nodes", "".getBytes(StandardCharsets.UTF_8));
        } else {
            log.info("根节点已经存在");
        }

        // 创建临时节点(存在则删除)
        String addNodePath = "/game-nodes/game-node-1";
        if (cf.checkExists().forPath(addNodePath) != null) {
            cf.delete().forPath(addNodePath);
        }
        cf.create().withMode(CreateMode.EPHEMERAL).forPath(addNodePath, "127.0.0.1:6000".getBytes(StandardCharsets.UTF_8));

        System.in.read();
    }
}

/*
11:26:09.747 [main] INFO org.example.testZk.GameNode -- 根节点已经存在
 */

思考:

zk中我们往往是:2层节点树就够了,这样子可以获取服务器列表之类的。

相关推荐
爱吃面的猫9 天前
大数据Kafka3.x之——Kafka3.3.0安装与使用(详细)
大数据·分布式·zookeeper
TongSearch17 天前
使用 TongZK 做服务注册与服务发现
zookeeper·服务发现·国产化·东方通·tongzk
AI人工智能+电脑小能手19 天前
【大白话说Java面试题 第207题】【09_Zookeeper篇】第8题:谈谈 ZooKeeper 的可靠性保障机制
java·zookeeper·高可用·可靠性·分布式系统
January丶20 天前
docker-compose安装ZooKeeper集群
zookeeper
AI人工智能+电脑小能手20 天前
【大白话说Java面试题 第205题】【09_Zookeeper篇】第6题:ZooKeeper 实现分布式锁的原理
java·zookeeper·分布式锁·并发控制·分布式协调
AI人工智能+电脑小能手21 天前
【大白话说Java面试题 第203题】【09_Zookeeper篇】第4题:ZooKeeper 的节点类型有哪些?
java·zookeeper·分布式锁·分布式协调·znode
顧棟1 个月前
Zookeeper热缩容解析
linux·服务器·zookeeper
Benjamin℡1 个月前
Zookeeper(一)搭建单体和集群服务以及Zookeeper客户端
分布式·zookeeper·云原生
二宝哥1 个月前
ZooKeeper 3.4.13 单机安装详解
zookeeper
良木生香1 个月前
【C++初阶】STL—— Stack & Queue 从入门到精通:容器适配器、迭代器与经典面试题
java·开发语言·c++·算法·zookeeper