惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
罗磊的独立博客
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
博客园_首页
量子位
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
S
SegmentFault 最新的问题
雷峰网
雷峰网
小众软件
小众软件
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog

任霏博客

我将关闭服务器:AI彻底掐死了奄奄一息的个人博客 - 博客文章 - 任霏的个人博客网站 Vibe Coding 实现本地模型 Token 自由 IntelliJ IDEA + LM Studio + LM Link + Continue - 博客文章 - 任霏的个人博客网站 1Password涨价后,别急着退订1Password,这个操作能帮你省25% - 博客文章 - 任霏的个人博客网站 我,吃饱了撑的注册了个域名,Cloudflare账号没了,不建议将域名放在Cloudflare - 博客文章 - 任霏的个人博客网站 临时邮箱:保护隐私与免骚扰的新方式 - 博客文章 - 任霏的个人博客网站 价值4100万美元SOL被盗SwissBorg在Solana上遭遇安全事件超200万枚ETH排队退出质押 - 博客文章 - 任霏的个人博客网站 注意 Web3 钱包遭遇 NPM 超大规模供应链攻击投毒事件 - 博客文章 - 任霏的个人博客网站 我受到以太坊ERC-20假代币地址投毒攻击记录一下大家谨防上当受骗 - 博客文章 - 任霏的个人博客网站 在2025年使用显卡 NVIDIA RTX 2080 Ti 挖矿收益记录和分析还能不能挖矿 - 博客文章 - 任霏的个人博客网站 分享我是如何成功戒烟的经验(包含失败的经验) - 博客文章 - 任霏的个人博客网站 在 OpenWRT 中配置 PassWall2 插件的教程记录 - 博客文章 - 任霏的个人博客网站 Office Professional Plus 2019 VL 版下载与 KMS 激活 - 博客文章 - 任霏的个人博客网站 最近几天我的 CDN 流量受到来自电信[山东烟台]、[江苏扬州]两地家庭宽带的攻击 - 博客文章 - 任霏的个人博客网站 自建AI服务器使用PVE配置显卡直通虚拟机安装驱动、CUDA和cuDNN运行LLM大模型进行AI炼丹 - 博客文章 - 任霏的个人博客网站 各代英特尔Intel芯片组主板适配兼容的CPU和DDR内存数据统计 - 博客文章 - 任霏的个人博客网站 GitLab Global 国际站将在60天内删除中国大陆、香港、澳门地区的账号 - 博客文章 - 任霏的个人博客网站 Github Copilot Free 开放免费版所有人均可使用 OpenAI GPT-4o、Anthropic Claude 3.5 AI 代码生成服务 - 博客文章 - 任霏的个人博客网站 Cloudflare 更新了订阅协议明确禁止优选IP和搭建梯子的行为 - 博客文章 - 任霏的个人博客网站 Linux(systemd)手动离线安装二进制(binary)MairaDB数据库指定版本 - 博客文章 - 任霏的个人博客网站 流程引擎 Flowable/Activiti 无法启动报错:liquibase - Waiting for changelog lock.... - 博客文章 - 任霏的个人博客网站 Spring Boot 全局异常捕获 ControllerAdvice 无法捕获 过滤器(Filter)和拦截器(Interceptor)中的异常 - 博客文章 - 任霏的个人博客网站 Freenom 收回了全部免费域名(.tk/.cf/.gq/.ga/.ml) - 博客文章 - 任霏的个人博客网站 Alibaba Druid 数据库连接池 takeLast() AQS 死锁导致程序无响应 - 博客文章 - 任霏的个人博客网站 你的网站加入 HSTS preload 预加载列表了吗 - 博客文章 - 任霏的个人博客网站 我的博客网站接入使用 Cloudflare 的架构分享 - 博客文章 - 任霏的个人博客网站 在 Ubuntu 上的 Nginx 高并发配置实践 - 博客文章 - 任霏的个人博客网站 技术分析黑客敲诈勒索站长的新手法百度对此也无能为力 - 博客文章 - 任霏的个人博客网站 百度站长平台快速收录权限和sitemap提交权限被全部收回 - 博客文章 - 任霏的个人博客网站 极狐 GitLab 免费时代结束不升级付费账号将禁止登陆 - 博客文章 - 任霏的个人博客网站 免费.ml域名10年委托合同到期被马里共和国收回域名经营权 - 博客文章 - 任霏的个人博客网站
Zookeeper入门教程(三):监听节点动态的小案例 - 博客文章 ...
任霏 · 2021-03-29 · via 任霏博客

教程索引目录请访问:《大数据技术入门级系列教程

上一篇我们已经可以通过编程的方式操作 Zookeeper 了,并且学到了 Zookeeper 注册与监听,那么就来小试牛刀体验一把,本文将带你实践体验一个简单的小案例,监听节点的变化。

完整的代码公开在:https://github.com/renfei/demo/blob/master/zookeeper/zookeeper-zpi/src/main/java/net/renfei/zookeeper/DistributeDemo.java

编写一个假设的服务器

我们先写一个假设的服务器,他会向 Zookeeper 注册他已经上线了,因为要注册多台这样的”服务器“,所以服务器名称我们使用 main 启动传参的方式传递,代码如下:

public class DistributeDemo {
    private static final String CONNECT_STRING = "localhost:2181";
    private static final int SESSION_TIMEOUT = 2000;
    private static final String PARENT_NODE = "/servers";
    /**
     * 服务器端向Zookeeper注册
     */
    public static class DistributeServer {
        private ZooKeeper zkClient = null;
        // 创建到zk的客户端连接
        public void getConnect() throws IOException {
            zkClient = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, event -> System.out.println("DistributeServer默认的回调函数"));
        }
        // 注册服务器
        public void registServer(String hostname) throws Exception {
            String create = zkClient.create(PARENT_NODE + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
            System.out.println(hostname + " is online " + create);
        }
        // 业务功能
        public void business(String hostname) throws Exception {
            System.out.println(hostname + " is working ...");
            Thread.sleep(Long.MAX_VALUE);
        }
        public static void main(String[] args) throws Exception {
            // 获取zk连接
            DistributeServer server = new DistributeServer();
            server.getConnect();
            Stat stat = server.zkClient.exists("/servers", false);
            if (stat == null) {
                server.zkClient.create("/servers", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
            // 利用zk连接注册服务器信息,因为要注册多个服务器,所以使用参数的方式,我们可以调用多次
            server.registServer(args[0]);
            // 启动业务功能
            server.business(args[0]);
        }
    }
}

编写一个假设的客户端

上面有了服务器的上线,咱们再写个客户端去监听服务器的上线情况,代码如下:

public class DistributeDemo {
    private static final String CONNECT_STRING = "localhost:2181";
    private static final int SESSION_TIMEOUT = 2000;
    private static final String PARENT_NODE = "/servers";
    public static class DistributeClient {
        private ZooKeeper zk = null;
        // 创建到zk的客户端连接
        public void getConnect() throws IOException {
            zk = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, event -> {
                // 再次启动监听
                try {
                    getServerList();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        // 获取服务器列表信息
        public void getServerList() throws Exception {
            // 1获取服务器子节点信息,并且对父节点进行监听
            List<String> children = zk.getChildren(PARENT_NODE, true);
            // 2存储服务器信息列表
            ArrayList<String> servers = new ArrayList<>();
            // 3遍历所有节点,获取节点中的主机名称信息
            for (String child : children) {
                byte[] data = zk.getData(PARENT_NODE + "/" + child, false, null);
                servers.add(new String(data));
            }
            // 4打印服务器列表信息
            System.out.println(servers);
        }
        // 业务功能
        public void business() throws Exception {
            System.out.println("client is working ...");
            Thread.sleep(Long.MAX_VALUE);
        }
        public static void main(String[] args) throws Exception {
            // 1获取zk连接
            DistributeClient client = new DistributeClient();
            client.getConnect();
            // 2获取servers的子节点信息,从中获取服务器信息列表
            client.getServerList();
            // 3业务进程启动
            client.business();
        }
    }
}

启动我们的案例

我们先启动服务器的案例,由于参数使用 main 参数传递,我们需要先改一下启动配置,给程序传参进来:

WX20210319-155144.png

然后启动我们的监听客户端,就可以监听服务器的上线情况了。我们可以再启动一个服务器,改下启动参数名,多启动几个,看看客户端是不是已经可以监听到新服务器的上线情况了:

WX20210319-154913.png