返回顶部
首页 > 资讯 > 精选 >ZooKeeper命令及JavaAPI操作代码分析
  • 496
分享到

ZooKeeper命令及JavaAPI操作代码分析

2023-07-05 12:07:26 496人浏览 安东尼
摘要

本文小编为大家详细介绍“ZooKeeper命令及Javaapi操作代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“ZooKeeper命令及JavaAPI操作代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知

本文小编为大家详细介绍“ZooKeeper命令及Javaapi操作代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“ZooKeeper命令及JavaAPI操作代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

ZooKeeper数据模型

  • ZooKeeper是一个树形目录服务,其数据模型和Uiix的文件目录树很类似,拥有一个层次化结构。

  • 这里面的每一个节点都被称为:Znode,每个节点上都会保存自己的数据和节点信息。

  • 节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下。

  • 节点可以分为四大类:

    • PEFSISTENT持久化节点

    • EPHEMERAL临时节点:-e

    • PERSISTENT_SEQUENTIAL持久化顺序节点:-s

    • EPHEMERAL_SEQUENTIAL临时顺序节点:-es

ZooKeeper服务端常用命令

  • 启动ZooKeeper服务:./zkServer.sh start

  • 查看ZooKeeper服务:./zkServer.sh status

  • 停止ZooKeeper服务:./zkServer.sh stop

  • 重启ZooKeeper服务:./zkServer.sh restart

ZooKeeper客户端命令

  • ./zkCli.sh -server localhost:2181连接服务端,如果是单机后面的可以省略不写。

  • ls [/] :查看指定节点下子节点

  • create [/app] [hrbu]:创建一个名为/app1的子节点,并存放数据。

  • get [/app] :获取节点下的数据。

  • set [/app] [hrbu]:给指定节点设置数据

  • delete [/app] :删除指定节点 ps:此命令无法删除存在子节点的节点,如果要删除带有子节点的节点可以是使用deleteall [/app] 命令。

  • quit 断开连接

  • help 查看命令帮助

  • create -e [/app] 创建临时节点,会话关闭就会删除

  • create -s [/app] 创建顺序节点

  • create -es [/app] 创建临时顺序节点

  • ls -s [/app] 查看节点的详细信息

使用Curator API操作Zookeeper

建立连接

@Testpublic void testConnect() {    //重试策略    ExponentialBackoffRetry retry = new ExponentialBackoffRetry(3000, 10);    //第一种方式    CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.130.120:2181", 60 * 1000, 15 * 1000, retry);    //第二种方式    CuratorFramework client1 = CuratorFrameworkFactory.builder().connectString("192.168.130.120:2181")        .sessionTimeoutMs(60 * 1000)        .connectionTimeoutMs(15 * 1000)        .retryPolicy(retry).namespace("hrbu").build();    //开启连接    client.start();}

参数解读

  • connectString – list of servers to connect to (ZooKeeper的地址)

sessionTimeoutMs – session timeout (会话超时时间)
connectionTimeoutMs – connection timeout (连接超时时间)
retryPolicy – retry policy to use (重试策略)

ZooKeeper命令及JavaAPI操作代码分析

会话超时时间和连接超时时间有默认值。

第二种链式编程的方式可以指定一个工作空间,在此客户端下的所有操作都会将此工作空间作为根目录。

注意

如果使用的是云服务器需要将指定端口打开

firewall-cmd --zone=public --add-port=2181/tcp --permanent 开放端口

firewall-cmd --zone=public --list-ports 查看已经开放的端口

systemctl restart firewalld 重启防火墙生效

最后别忘了在服务器安全组里面添加端口,将2181端口打开

添加节点

@Testpublic void testCreate1() throws Exception {    //基本创建    CreateBuilder createBuilder = client.create();    //创建时不指定数据,会将当前客户端ip存到里面    createBuilder.forPath("/app1");    //指定数据    createBuilder.forPath("/app2", "hello".getBytes());}@Testpublic void testCreate2() throws Exception {    CreateBuilder createBuilder = client.create();    //设置节点类型,默认的类型是持久化    //CreateMode是枚举类型    createBuilder.withMode(CreateMode.EPHEMERAL).forPath("/app3");}@Testpublic void testCreate3() throws Exception {    CreateBuilder createBuilder = client.create();    //创建多级节点,如果父节点不存在,则创建父节点。    createBuilder.creatingParentContainersIfNeeded().forPath("/app4/app4_1");}

查询节点

@Testpublic void testGet() throws Exception {    //查询数据    byte[] bytes = client.getData().forPath("/app1");    System.out.println(new String(bytes));    //查询子节点    List<String> strings = client.getChildren().forPath("/app4");    strings.forEach(System.out::println);    //查询节点状态信息    Stat stat = new Stat();    client.getData().storingStatIn(stat).forPath("/app1");    System.out.println(stat);}

修改节点

@Testpublic void testSet() throws Exception {    //修改数据    client.setData().forPath("/app1","hrbu".getBytes());    //根据版本修改    int version  = 0;    Stat stat = new Stat();    client.getData().storingStatIn(stat).forPath("/app1");    version = stat.getVersion();    client.setData().withVersion(version).forPath("/app1", "HRBU".getBytes());}

删除节点

@Testpublic void testDelete() throws Exception {    //删除单个节点    client.delete().forPath("/app4/app4_1");    //删除带有子节点的节点    client.delete().deletinGChildrenIfNeeded().forPath("/app4");    //强制删除    client.delete().guaranteed().forPath("/app4");    //回调    client.delete().guaranteed().inBackground(new BackgroundCallback() {        @Override        public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {            System.out.println("执行删除操作");        }    }).forPath("/app4");}

Watch事件监听

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

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

  • ZooKeeper原生支持通过注册Watcher来进行事件监听,但是使用并不是特别方便,需要开发人员自己反复注册Watcher,比较繁琐。

  • Curator引入了Cache来时限对Zookeeper服务端事件的监听。

  • ZooKeeper提供了三种Watcher:

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

    • PathChildrenCache:监控一个Node的子节点。

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

NodeCache

@Testpublic void testNodeCache() throws Exception {    //NodeCache:指定一个节点注册监听器    //创建NodeCache对象    final NodeCache nodeCache = new NodeCache(client, "/app1");    //注册监听    nodeCache.getListenable().addListener(new NodeCacheListener() {        @Override        public void nodeChanged() throws Exception {            System.out.println("app1节点发生变化");            //获取修改节点后的数据            byte[] data = nodeCache.getCurrentData().getData();            System.out.println("变化后的节点:"+new String(data));        }    });    //开启监听,如果为true,则开启则开启监听,加载缓冲数据    nodeCache.start(true);}

PathChildrenCache

@Testpublic void testPathChildrenCache() throws Exception {    //PathChildrenCache:监听某个节点的所有子节点    //创建监听对象    PathChildrenCache pathChildrenCache = new PathChildrenCache(client, "/hrbu", true);    //绑定监听器    pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {        @Override        public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {            System.out.println("子节点发生变化");            System.out.println(pathChildrenCacheEvent);            //监听子节点的数据变更,并且得到变更后的数据            //获取类型            PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();            //判断类型            if (type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)) {                //获取数据                byte[] data = pathChildrenCacheEvent.getData().getData();                System.out.println(new String(data));            }        }    });    //开启    pathChildrenCache.start();}

TreeCache

@Testpublic void testTreeCache() throws Exception {    //创建监听器    TreeCache treeCache = new TreeCache(client, "/");    //注册监听    treeCache.getListenable().addListener(new TreeCacheListener() {        @Override        public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {            System.out.println("节点发生变化");            System.out.println(treeCacheEvent);        }    });    //开启    treeCache.start();}

分布式实现

概述

  • 我们在进行单机应用开发,涉及并发同步的时候,,我们往往采用synchronized或者lock的方式来解决多线程间的代码同步问题,这时候多线程的运行都是在同一个JVM之下,没有任何问题。

  • 但当我们的应用时分布式集群工作的情况下,属于多JVM下的工作环境,跨JVM之间已经无法通过多线程的锁解决同步问题。

  • 那么就需要一种更加高级的锁机制,来处理跨机器进程之间的数据同步问题,这就是分布式锁。

Zookeeper分布式锁原理

  • 核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。

    • 客户端获取锁时,在lock节点下创建临时顺序节点。

    • 然后获取lock下面的所有子节点,客户端获取到所有的子节之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。

    • 如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。

    • 如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否时lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取比自己小的一个节点并注册监听。

Curator实现分布式锁API

在Curator中有五种锁方案:

  • InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)

  • InterProceSSMutex:分布式可重入排它锁

  • InterProcessReadWriteLock:分布式读写锁

  • InterProcessMultiLock:将多个锁作为单个实体管理的容器

  • InterProcessSemaphoreV2:共享信号量

package com.hrbu.curator;import org.apache.curator.RetryPolicy;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.locks.InterProcessMutex;import org.apache.curator.retry.ExponentialBackoffRetry;import java.util.concurrent.TimeUnit;public class Ticket12306 implements Runnable{    private int tickets = 10;//数据库的票数    private InterProcessMutex lock ;    public Ticket12306(){        //重试策略        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);        CuratorFramework client = CuratorFrameworkFactory.builder()                .connectString("8.130.32.75:2181")                .sessionTimeoutMs(60 * 1000)                .connectionTimeoutMs(15 * 1000)                .retryPolicy(retryPolicy)                .build();        //开启连接        client.start();        lock = new InterProcessMutex(client,"/lock");    }    @Override    public void run() {        while(true){            //获取锁            try {                lock.acquire(3, TimeUnit.SECONDS);                if(tickets > 0){                    System.out.println(Thread.currentThread()+":"+tickets);                    Thread.sleep(100);                    tickets--;                }            } catch (Exception e) {                e.printStackTrace();            }finally {                //释放锁                try {                    lock.release();                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }}
package com.hrbu.curator;public class LockTest {    public static void main(String[] args) {        Ticket12306 ticket12306 = new Ticket12306();        //创建客户端        Thread t1 = new Thread(ticket12306,"携程");        Thread t2 = new Thread(ticket12306,"飞猪");        t1.start();        t2.start();    }}

读到这里,这篇“ZooKeeper命令及JavaAPI操作代码分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: ZooKeeper命令及JavaAPI操作代码分析

本文链接: https://lsjlt.com/news/351584.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ZooKeeper命令及JavaAPI操作代码分析
    本文小编为大家详细介绍“ZooKeeper命令及JavaAPI操作代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“ZooKeeper命令及JavaAPI操作代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-05
  • ZooKeeper命令及JavaAPI操作代码
    目录ZooKeeper数据模型ZooKeeper服务端常用命令ZooKeeper客户端命令使用Curator API操作Zookeeper建立连接Watch事件监听分布式锁实现概述Z...
    99+
    2023-03-14
    ZooKeeper JavaAPI操作 ZooKeeper命令
  • java操作zookeeper实例代码
    本篇内容主要讲解“java操作zookeeper实例代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java操作zookeeper实例代码”吧!package...
    99+
    2024-04-02
  • Python命令行代码举例分析
    本篇内容介绍了“Python命令行代码举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先需要了解Python中有两种字符串(严格地说...
    99+
    2023-06-17
  • Git代码提交流程及git命令的示例分析
    小编给大家分享一下Git代码提交流程及git命令的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!基本了解git命令是一些命令行工具的集合,它可以用来跟踪,...
    99+
    2023-06-09
  • MySQL常用命令及操作
    1、登录与退出     1)登录         windows下直接在DOS命令窗口用root用户登录输入my...
    99+
    2022-05-15
    MySQL 命令 操作
  • H3C2126的ARP操作及命令
    S2126-EI以太网交换机的ARP表项分为:静态表项和动态表项 免费ARP报文的特点:报文中携带的源IP和目的IP地址都是本机地址,报文源MAC地址是本机MAC地址。当设备收到免费ARP报文后,如果发现报文中的IP地址和自己的IP地址冲突...
    99+
    2023-01-31
    命令 操作 ARP
  • Manipulation TypeScript DOM操作实例代码分析
    这篇文章主要介绍了Manipulation TypeScript DOM操作实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Manipulation TypeScript DOM操...
    99+
    2023-07-05
  • vue指令以及dom操作的示例分析
    这篇文章给大家分享的是有关vue指令以及dom操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。“AngularJS 通过被称为 指令 的新属性来扩展 HTML。Ang...
    99+
    2024-04-02
  • Vim中命令、操作、快捷键的示例分析
    这篇文章将为大家详细讲解有关Vim中命令、操作、快捷键的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多...
    99+
    2023-06-05
  • MySQL基础命令实操分析
    这篇文章主要介绍“MySQL基础命令实操分析”,在日常操作中,相信很多人在MySQL基础命令实操分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL基础命令实操分析”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-29
  • Django常用操作命令分享
    这篇文章主要讲解了“Django常用操作命令分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Django常用操作命令分享”吧!查看Django版本:点击(此处)折叠或打开[oracle@m...
    99+
    2023-06-04
  • linux下命令行操作快捷键及技巧(分享)
    历史相关命令 !!:执行上一条命令 !num:执行历史命令中第num条命令 !-num:执行历史命令中倒数第num条命令 !?string?:执行最近一条包含有string字符串的命令 C...
    99+
    2022-06-04
    快捷键 命令行 操作
  • Linux sar命令使用方法及代码实例解析
    1. CPU利用率 sar -p (查看全天) sar -u 1 10 (1:每隔一秒,10:写入10次)   1.1. CPU输出项说明 输出项 详细说明 ...
    99+
    2022-06-03
    Linux sar命令
  • Redis入门基础常用操作命令实例分析
    今天小编给大家分享一下Redis入门基础常用操作命令实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Redis基础Re...
    99+
    2023-06-30
  • JavaScript数组操作方法实例代码分析
    这篇文章主要介绍了JavaScript数组操作方法实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript数组操作方法实例代码分析文章都会有所收获,下面我们一起来看看吧。1.删除数组重复项...
    99+
    2023-07-02
  • RCE代码及命令执行(详解)
    RCE代码及命令执行 1.RCE漏洞1.1.漏洞原理1.2.漏洞产生条件1.3.漏洞挖掘1.4.漏洞分类1.4.1.命令执行1.4.1.1.漏洞原理1.4.1.2.命令执行危险函数1.4.1....
    99+
    2023-09-11
    php web安全 安全 网络安全
  • MongoDB的安装及常用操作命令
    这篇文章主要讲解了“MongoDB的安装及常用操作命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoDB的安装及常用操作命令”吧!环境:cento...
    99+
    2024-04-02
  • MySQL创建表操作命令分享
    目录一、表命令1.查看所有表2.创建表3.创建一个用户表二、MySQL支持的常用数据类型1.数字型2.字符串3.日期三、MySQL支持的常用约束四、存储引擎五、表命令(crud)1....
    99+
    2024-04-02
  • Android中执行java命令的方法及java代码执行并解析shell命令
    android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析。 android的程序基于java开发,当我们接上调试器,执行adb shell,就可以...
    99+
    2022-06-06
    JAVA 方法 shell Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作