javaAPI操作-Zookeeper

news2024/11/24 6:50:53

· ## 4)ZooKeeper JavaAPI 操作

4.1)Curator介绍

•Curator 是 Apache ZooKeeper 的Java客户端库。

•常见的ZooKeeper Java API :

•原生Java API

•ZkClient

•Curator

•Curator 项目的目标是简化 ZooKeeper 客户端的使用。

•Curator 最初是 Netfix 研发的,后来捐献了 Apache 基金会,目前是 Apache 的顶级项目。

•官网:http://curator.apache.org/

4.2)JavaAPI操作建立连接

1,搭建项目

创建项目curator-zk

引入pom和日志文件

资料文件夹下pom.xml和log4j.properties
在这里插入图片描述

 /**
     * 建立连接
     */
    @Test
    public void testConnect() {

        /**
         * @param connectSting 链接字符串 zk server 地址和端口 192.168.0.102 :2181,192.168.0.103:2181
         * @param sessionTimeoutMs 会话超时时间 单位ms
         * @param connectionTimeoutMs 链接超时时间 单位ms
         * @param retryPolicy 重试策略
         */

        /// 创建重试策略 休眠时间, 重试次数
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
        /// 1 第一种方式
//        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("192.168.0.102 :2181",
//                60 * 1000, 15 * 1000, retryPolicy);
//        /// 开启链接
//        curatorFramework.start();
        /// 2 第二种方式
        CuratorFramework build = CuratorFrameworkFactory.builder().connectString("192.168.0.102 :2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retryPolicy).namespace("itheima").build();
        build.start();

    }

4.3)Zookeeper JavaAPI操作-创建节点

/**

  • 创建节点:create 持久 临时 顺序 数据
    1. 基本创建 :create().forPath(“”)
    1. 创建节点 带有数据:create().forPath(“”,data)
    1. 设置节点的类型:create().withMode().forPath(“”,data)
    1. 创建多级节点 /app1/p1 :create().creatingParentsIfNeeded().forPath(“”,data)
      */
      节点可以分为四大类:

PERSISTENT 持久化节点
EPHEMERAL 临时节点 :-e
PERSISTENT_SEQUENTIAL 持久化顺序节点 :-s
EPHEMERAL_SEQUENTIAL 临时顺序节点 :-es

package com.itheima.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class CuratorTest {

    private  CuratorFramework build;

    /**
     * 建立连接
     */
    @Before
    public void testConnect() {

        /**
         * @param connectSting 链接字符串 zk server 地址和端口 192.168.0.102 :2181,192.168.0.103:2181
         * @param sessionTimeoutMs 会话超时时间 单位ms
         * @param connectionTimeoutMs 链接超时时间 单位ms
         * @param retryPolicy 重试策略
         */

        /// 创建重试策略 休眠时间, 重试次数
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
        /// 1 第一种方式
//        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("192.168.0.102 :2181",
//                60 * 1000, 15 * 1000, retryPolicy);
//        /// 开启链接
//        curatorFramework.start();
        /// 2 第二种方式
        build = CuratorFrameworkFactory.builder().connectString("192.168.0.102:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retryPolicy).namespace("itheima").build();
        build.start();

    }

    /**
     * 创建节点 create 持久 临时 顺序 数据
     * 1 基本创建 
     * 2 创建节点, 带有数据
     * 3 设置节点的类型
     * 4 创建多级节点
     */

    @Test
    public void testCreate() throws Exception {
        /// 1 基本创建
        //如果创建节点,没有指定数据,则默认将当前客户端的ip作为数据存储
        String path = build.create().forPath("/app1");
        System.out.println(path);
    }

    @Test
    public void testCreate2() throws Exception {
        /// 2 创建节点, 带有数据
        //如果创建节点,没有指定数据,则默认将当前客户端的ip作为数据存储
        /// 第二个参数是getBytes数组
        String path = build.create().forPath("/app2","hehe".getBytes());
        System.out.println(path);
    }

    @Test
    public void testCreate3() throws Exception {
        /// 3 设置节点的类型
       /// 默认类型:持久化 临时的
        String path = build.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");
        System.out.println(path);
    }

    @Test
    public void testCreate4() throws Exception {
        /// 4 创建多级节点
        /// 默认类型:持久化 临时的
        /// creatingParentContainersIfNeeded():如果父节点不存在,则创建父节点
        String path = build.create().creatingParentContainersIfNeeded().forPath("/app4/p1");
        System.out.println(path);
    }
    @After
    public void close() {
        if(build != null) {
            build.close();
        }
    }

}

4.4)ZookeeperJavaAPI操作-查询节点

/**

  • 查询节点:
    1. 查询数据:get: getData().forPath()
    1. 查询子节点: ls: getChildren().forPath()
    1. 查询节点状态信息:ls -s:getData().storingStatIn(状态对象).forPath()
      */
package com.itheima.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class CuratorTest {

    private  CuratorFramework build;

    /**
     * 建立连接
     */
    @Before
    public void testConnect() {

        /**
         * @param connectSting 链接字符串 zk server 地址和端口 192.168.0.102 :2181,192.168.0.103:2181
         * @param sessionTimeoutMs 会话超时时间 单位ms
         * @param connectionTimeoutMs 链接超时时间 单位ms
         * @param retryPolicy 重试策略
         */

        /// 创建重试策略 休眠时间, 重试次数
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
        /// 1 第一种方式
//        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("192.168.0.102 :2181",
//                60 * 1000, 15 * 1000, retryPolicy);
//        /// 开启链接
//        curatorFramework.start();
        /// 2 第二种方式
        build = CuratorFrameworkFactory.builder().connectString("192.168.0.102:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retryPolicy).namespace("itheima").build();
        build.start();

    }
    /**
     * 查询节点:
     * 1 查询数据 get
     * 2 查询子节点 ls
     * 3 查询节点状态信息 ls -s
     * @throws Exception
     */
    @Test
    public void testGet1() throws Exception {
        ///1 查询数据 get
        byte[] bytes = build.getData().forPath("/app1");
        System.out.println(new String(bytes)); ///192.168.198.1
    }

    @Test
    public void testGet2() throws Exception {
        ///2 查询子节点 ls
       //List<String> strings = build.getChildren().forPath("/app4");///[p1]
        List<String> strings = build.getChildren().forPath("/"); ///[app2, app1, app4]
        System.out.println(strings);
    }

    @Test
    public void testGet3() throws Exception {
        ///3 查询节点状态信息 ls -s
        Stat status = new Stat();
        System.out.println(status); ///0,0,0,0,0,0,0,0,0,0,0
        byte[] bytes = build.getData().storingStatIn(status).forPath("/app1"); //3,3,1673978538957,1673978538957,0,0,0,0,13,0,3
        System.out.println(status);
    }

    @After
    public void close() {
        if(build != null) {
            build.close();
        }
    }

}

4.5)Zookeeper JavaAPI操作-修改节点

/**

  • 修改数据
    1. 基本修改数据:setData().forPath()
    1. 根据版本修改: setData().withVersion().forPath()
    • version 是通过查询出来的。目的就是为了让其他客户端或者线程不干扰我。
      */
package com.itheima.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class CuratorTest {

    private  CuratorFramework build;

    /**
     * 建立连接
     */
    @Before
    public void testConnect() {

        /**
         * @param connectSting 链接字符串 zk server 地址和端口 192.168.0.102 :2181,192.168.0.103:2181
         * @param sessionTimeoutMs 会话超时时间 单位ms
         * @param connectionTimeoutMs 链接超时时间 单位ms
         * @param retryPolicy 重试策略
         */

        /// 创建重试策略 休眠时间, 重试次数
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
        /// 1 第一种方式
//        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("192.168.0.102 :2181",
//                60 * 1000, 15 * 1000, retryPolicy);
//        /// 开启链接
//        curatorFramework.start();
        /// 2 第二种方式
        build = CuratorFrameworkFactory.builder().connectString("192.168.0.102:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retryPolicy).namespace("itheima").build();
        build.start();

    }
///============================SET==============================================
    /**
     * 修改数据
     * 1. 基本修改数据:setData().forPath()
     * 2. 根据版本修改: setData().withVersion().forPath()
     * * version 是通过查询出来的。目的就是为了让其他客户端或者线程不干扰我。
     *
     * @throws Exception
     */
    @Test
    public void testSet() throws Exception {
        //1. 基本修改数据:setData().forPath()
       build.setData().forPath("/app1", "itcast".getBytes());
    }

    @Test
    public void testSetForVersion() throws Exception {
        //     * 2. 根据版本修改: setData().withVersion().forPath()
        //     * * version 是通过查询出来的。目的就是为了让其他客户端或者线程不干扰我。
        Stat status = new Stat();
        build.getData().storingStatIn(status).forPath("/app1");
        int version = status.getVersion(); /// 查询出来的 1
        System.out.println(version);
        build.setData().withVersion(version).forPath("/app1", "haha".getBytes());
    }

    @After
    public void close() {
        if(build != null) {
            build.close();
        }
    }

}

4.6)Zookeeper JavaAPI操作-删除节点

/**

  • 删除节点: delete deleteall
    1. 删除单个节点:delete().forPath(“/app1”);
    1. 删除带有子节点的节点:delete().deletingChildrenIfNeeded().forPath(“/app1”);
    1. 必须成功的删除:为了防止网络抖动。本质就是重试。 client.delete().guaranteed().forPath(“/app2”);
    1. 回调:inBackground
  • @throws Exception
    */
package com.itheima.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class CuratorTest {

    private  CuratorFramework build;

    /**
     * 建立连接
     */
    @Before
    public void testConnect() {

        /**
         * @param connectSting 链接字符串 zk server 地址和端口 192.168.0.102 :2181,192.168.0.103:2181
         * @param sessionTimeoutMs 会话超时时间 单位ms
         * @param connectionTimeoutMs 链接超时时间 单位ms
         * @param retryPolicy 重试策略
         */

        /// 创建重试策略 休眠时间, 重试次数
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
        /// 1 第一种方式
//        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("192.168.0.102 :2181",
//                60 * 1000, 15 * 1000, retryPolicy);
//        /// 开启链接
//        curatorFramework.start();
        /// 2 第二种方式
        build = CuratorFrameworkFactory.builder().connectString("192.168.0.102:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retryPolicy).namespace("itheima").build();
        build.start();

    }
    ///============================delete==============================================

    /**
     * 删除节点: delete deleteall
     * 1. 删除单个节点:delete().forPath("/app1");
     * 2. 删除带有子节点的节点:delete().deletingChildrenIfNeeded().forPath("/app1");
     * 3. 必须成功的删除:为了防止网络抖动。本质就是重试。  client.delete().guaranteed().forPath("/app2");
     * 4. 回调:inBackground
     * @throws Exception
     */
    @Test
    public void testDelete() throws Exception {
        // 1. 删除单个节点:delete().forPath("/app1");
        build.delete().forPath("/app1");
    }

    @Test
    public void testDelete1() throws Exception {
        // 2. 删除带有子节点的节点:delete().deletingChildrenIfNeeded().forPath("/app1");
        build.delete().deletingChildrenIfNeeded().forPath("/app4");
    }

    @Test
    public void testDelete2() throws Exception {
        // 3. 必须成功的删除:为了防止网络抖动。本质就是重试。  client.delete().guaranteed().forPath("/app2");
        build.delete().guaranteed().forPath("/app2");
    }

    @Test
    public void testDelete3() throws Exception {
        //4. 回调:inBackground
        build.delete().guaranteed().inBackground(new BackgroundCallback() {
            @Override
            public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
                System.out.println("我被删除了~");
                System.out.println(curatorEvent);//CuratorEventImpl{type=DELETE, resultCode=0, path='/app1', 
                // name='null', children=null, context=null, stat=null, data=null, watchedEvent=null, aclList=null, opResults=null}

            }
        }).forPath("/app1");
    }
    @After
    public void close() {
        if(build != null) {
            build.close();
        }
    }

}

4.7)Zookeeper JavaAPI操作-Watch监听概述

•ZooKeeper 允许用户在指定节点上注册一些Watcher(监听器),并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。

•ZooKeeper 中引入了Watcher机制来实现了发布/订阅功能能,能够让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者。

•ZooKeeper 原生支持通过注册Watcher来进行事件监听,但是其使用并不是特别方便

​ 需要开发人员自己反复注册Watcher,比较繁琐。

•Curator引入了 Cache 来实现对 ZooKeeper 服务端事件的监听。

•ZooKeeper提供了三种Watcher:

•NodeCache : 只是监听某一个特定的节点

•PathChildrenCache : 监控一个ZNode的子节点.

•TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电影购票系统项目实战

电影购票系统项目实战电影购票系统简介、项目功能演示。日志框架搭建、系统角色分析首页、登录、商家界面、用户界面实现商家功能-展示详情、影片上架、退出商家功能-影片下架、影片修改用户功能-展示全部影片用户功能-购票功能用户功能-评分功能用户功能-根据片名查询全部影片…

绝缘手套穿戴智能识别算法 yolov5

绝缘手套穿戴智能识别算法通过opencvpython深度学习技术&#xff0c;对现场人员是否佩戴绝缘手套进行识别检测&#xff0c;当检测到现场人员违规行为未佩戴绝缘手套时立刻抓拍告警。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0c;用…

初学者C语言练习题-入门

一、入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&#xff0c;可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言&#xff0c;所以说学习C语言是进入编程世…

Python SciPy 模块列表

SciPy 模块列表以下列出了 SciPy 常用的一些模块及官网 API 地址&#xff1a;模块名功能参考文档scipy.cluster向量量化cluster APIscipy.constants数学常量constants APIscipy.fft快速傅里叶变换fft APIscipy.integrate积分integrate APIscipy.interpolate插值interpolate API…

Android自定义控件(八) Android仿招商银行APP手势解锁

前言 目前大部分APP的登录方式有多种类型&#xff0c;其中手势解锁就是其中比较常见的一种方式&#xff0c;经常使用的招商银行APP&#xff08;IOS&#xff09;端的手势解锁体验不错的&#xff0c;就仿照它自定义下手势解锁功能。 说明 1、招行APP手势解锁效果 2、绘制分析 …

【技术推荐】前端JS攻防对抗

简介 网络爬虫一直以来是让网站维护人员头痛的事情&#xff0c;即要为搜索引擎开方便之门&#xff0c;提升网站排名、广告引入等&#xff0c;又要面对恶意爬虫做出应对措施&#xff0c;避免数据被非法获取&#xff0c;甚至出售。因此促生出爬虫和反爬虫这场旷日持久的战斗。 爬…

Java中的Arrays类

1、问题Arrays类是什么&#xff0c;Arrays常用方法。2、方法了解Arrays类的概念Arrays 位于java.util包下,Arrays是一个操作数组的工具类。Arrays常用方法Arrays.fill&#xff1a;替换数组原元素&#xff1b;Arrays.sort:对数组进行排序&#xff08;递增&#xff09;&#xff1…

23种设计模式(六)——装饰模式【单一职责】

文章目录意图什么时候使用装饰真实世界类比装饰模式的实现装饰模式的优缺点亦称&#xff1a; 装饰者模式、装饰器模式、Wrapper、Decorator 意图 装饰者模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象扩展新的功能&#xff0c;同时不改变其结构。主要解决…

Allegro如何快速找到差分不耦合处操作指导

Allegro如何快速找到差分不耦合处操作指导 做PCB设计的时候,需要检查差分对不耦合的地方,让差分不耦合的地方高亮出来 具体操作如下 用Allegro172版本打开pcb,选择View选择Vision Manager

抖快社交,变道求生

配图来自Canva可画 抖音、快手再一次杀回了社交市场。 2022年12月底&#xff0c;快手App store版本更新&#xff0c;在原有的快手热榜、朋友动态、快手拍摄的基础上&#xff0c;新增亲密贴贴、快手直播等新锁屏组件&#xff0c;通过强化产品的交互功能&#xff0c;增强用户的…

针对游戏开发CG制作的搬砖人员的资源搜索技巧分享—【持续补充篇】

一.常用搜索技巧分享 1.视频参考类(bilibili,youtube,常用的视频官网,其实可以满足了,再不行就在百度/Google搜一下) 2.教程和代码类 github Bootstrap Well magebox realtimevfx

Python项目(Django框架)天天生鲜在CentOS7.9搭建运行

CentOS安装python3 为方便管理&#xff0c;在CentOS桌面创建一个文件夹&#xff0c;将软件包下载到这里&#xff0c;右键--在终端打开 安装python3.9.7 : wget https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz &#xff08;命令前的sudo如果是root用户可以去掉&…

深度学习目标检测基础_sigmoid和softmax函数

文章目录sigmoid和softmaxsigmoid函数softmax函数总结sigmoid和softmax sigmoid和softmax都是分类函数&#xff0c;他们的区别如下 sigmoid函数 Sigmoid 多标签分类问题多个正确答案非独占输出&#xff08;例如胸部X光检查、住院&#xff09;。构建分类器&#xff0c;解决有…

威纶通触摸屏配方功能的使用方法示例

威纶通触摸屏配方功能的使用方法示例 本次和大家分享通过触摸屏内部指针+偏移地址+控制元件实现配方功能的具体方法, 另外以前给大家分享过利用宏指令实现配方功能的方法,具体可参考以下链接中的内容: 威纶通触摸屏的配方功能具体使用方法介绍(宏指令写入PLC) 如下图所示…

Dubbo 服务引用

Dubbo 服务引用 0. 概述 Dubbo 服务引用的时机有两个&#xff0c;第一个是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务&#xff0c;第二个是在 ReferenceBean 对应的服务被注入到其他类中时引用。这两个引用服务的时机区别在于&#xff0c;第一个…

锅圈的新消费“第三条路”走得通吗?

文|螳螂观察 作者|kinki 临近春节&#xff0c;线下餐饮行业在经历了三年的寒冬之后&#xff0c;相信会在今年迎来一个“暖春”。不过&#xff0c;年夜饭一直存在“一桌难求”的现象&#xff0c;结合疫情因素&#xff0c;相信今年仍有不少消费会选择在家用餐。 因此&#xff…

生成随机用户名的测试数据

大家好&#xff0c;才是真的好。 记得我们以前讲过一篇《自动批量生成Notes应用测试数据&#xff01;》&#xff0c;利用Java自动生成大批量的测试数据&#xff0c;今天我们介绍使用LotusScript代码来实现自动生成随机数据&#xff0c;主要是随机的用户名。 我们的方法很简单…

〖百宝书-思维锻炼②〗——知识是人类的供需和营养品

大家好&#xff0c;我是涵子&#xff0c;今天我们来聊聊知识。 &#x1f4ac; 人生格言&#xff1a;Stay foolish, stay kind.&#x1f4ac; &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x…

Feed 流系统

差不多十年前&#xff0c;随着功能机的淘汰和智能机的普及&#xff0c;互联网开始进入移动互联网时代&#xff0c;最具代表性的产品就是微博、微信&#xff0c;以及后来的今日头条、快手等。这些移动互联网时代的新产品在过去几年间借着智能手机的风高速成长。 这些产品都是Fee…

VueJs中的shallowRef与shallowReactive的使用比较

01shallowRef()函数如果传入基本数据类型,那么shallowRef与ref的作用基本没有什么区别,也就是浅层的ref的内部值将会原样的存储和暴露,并不会被深层递归地转为响应式但如果是对象的话,那么就存在区别了的,shallowRef不处理对象类型的数据其实,它就是只处理基本数据类型的响应式…