Java操作Zookeeper节点

这篇具有很好参考价值的文章主要介绍了Java操作Zookeeper节点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. Java操作ZooKeeper

引入jar包:

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.10</version>
</dependency>
private ZooKeeper zk;

/**
 * 创建连接
 *
 * @param address        地址 集群写多个,逗号分开docker.vm.com:2181,docker.vm.com:2182,docker.vm.com:2183
 * @param sessionTimeout 会话过期时间
 */
public void createConnection(String address, int sessionTimeout) {
    try {
        zk = new ZooKeeper(address, sessionTimeout, new Watcher() {
            // 监控所有被触发的事件
            public void process(WatchedEvent event) {
                System.out.println("已经触发了" + event.getType() + "事件!");
                //1、获取事件状态
                Event.KeeperState state = event.getState();
                //2、获取事件类型
                Event.EventType type = event.getType();
                //获取节点地址
                String path = event.getPath();
                //3、判断是否连接
                if (Event.KeeperState.SyncConnected == state) {
                    //4、判断类型
                    if (Event.EventType.None == type) {
                        System.out.println("###zookeeper建立连接成功###");
                    } else if (Event.EventType.NodeCreated == type) {
                        System.out.println("###Watcher监听的对应数据节点被创建###, 当前新增节点:" + path);
                    } else if (Event.EventType.NodeDataChanged == type) {
                        System.out.println("###Watcher监听的对应数据节点的数据内容发生变更###, 当前节点:" + path + ",被修改...");
                    } else if (Event.EventType.NodeChildrenChanged == type) {
                        System.out.println("###Wather监听的对应数据节点的子节点列表发生变更###, 当前子节点:" + path + ",被修改...");
                    } else if (Event.EventType.NodeDeleted == type) {
                        System.out.println("###Watcher监听的对应数据节点被删除###, 当前节点:" + path + ",被删除...");
                    }
                }

            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}


/**
 * 判断指定节点是否存在
 *
 * @param path
 * @param needWatch
 * @return
 */
public Stat exist(String path, boolean needWatch) {
    try {
        return this.zk.exists(path, needWatch);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

/**
 * 创建持久化节点
 *
 * @param path
 * @param data
 * @return
 */
public boolean createNode(String path, String data) {
    try {
        this.exist(path, true);
        /**
         * acl:权限列表
         提供默认的权限OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFE
         OPEN_ACL_UNSAFE:完全开放
         CREATOR_ALL_ACL:创建该znode的连接拥有所有权限
         READ_ACL_UNSAFE:所有的客户端都可读

         */
        /**
         * PERSISTENT 持久化节点
         * PERSISTENT_SEQUENTIAL 顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1
         * EPHEMERAL 临时节点, 客户端session超时这类节点就会被自动删除
         * EPHEMERAL_SEQUENTIAL 临时自动编号节点
         */
        zk.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("###新增节点信息path:" + path + " data:" + data);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

/**
 * 修改持久化节点
 *
 * @param path
 * @param data
 * @return
 */
public boolean updateNode(String path, String data) {
    try {
        this.exist(path, true);
        //zk的数据版本是从0开始计数的。如果客户端传入的是-1,则表示zk服务器需要基于最新的数据进行更新。如果对zk的数据节点的更新操作没有原子性要求则可以使用-1.
        //version参数指定要更新的数据的版本, 如果version和真实的版本不同, 更新操作将失败. 指定version为-1则忽略版本检查
        zk.setData(path, data.getBytes(), -1);
        System.out.println("###修改节点信息path:" + path + " data:" + data);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

public boolean deleteNode(String path) {
    try {
        this.exist(path, true);
        zk.delete(path, -1);
        System.out.println("###删除节点信息path:" + path);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

public byte[] getNodeData(String path,boolean needWatch,Stat stat) {
    try {
        byte[] data = zk.getData(path, needWatch, stat);
        return data;
    } catch (KeeperException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return null;
}

public void close() {
    try {
        if (zk != null) {
            zk.close();
            System.out.println("###zookeeper服务已关闭");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws Exception {
    ZooTest test = new ZooTest();
    test.createConnection(ADDRESS, SESSION_TIMEOUT);
    test.createNode("/t1", "55555");
    test.updateNode("/test","3333");
    test.deleteNode("/test");
    test.close();
}

zookeeper的权限: ZooKeeper提供了如下几种验证模式(scheme):
• digest:Client端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式
• auth:不使用任何id,代表任何已确认用户。 • ip:Client端由IP地址验证,譬如172.2.0.0/24
• world:固定用户为anyone,为所有Client端开放权限
• super:在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)

注意的是,exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。
节点的权限(perms)主要有以下几种: • Create 允许对子节点Create操作 • Read
允许对本节点GetChildren和GetData操作 • Write 允许对本节点SetData操作 • Delete
允许对子节点Delete操作 • Admin 允许对本节点setAcl操作

ZooKeeper zk = new ZooKeeper("10.9.126.153", 3000, null);
List<ACL> acls = new ArrayList<ACL>(1);
Id id = new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin123"));
ACL acl = new ACL(ZooDefs.Perms.ALL, id);
//ACL acl = new ACL(ZooDefs.Perms.CREATE|ZooDefs.Perms.READ, id);//给多权限
acls.add(acl);
zk.create("/test", new byte[0], acls, CreateMode.PERSISTENT);
zk.addAuthInfo("digest", "admin:admin123".getBytes());
zk.close();

2. ZooKeeper基础

ZooKeeper是一个分布式应用程序协调服务。它监视集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作。保证系统性能高效,功能稳定。
ZooKeeper客户端和server采用长连接。建立连接之后server生成64位的session
id给客户端。客户端定期发送ping包检查和保存于server的连接。一旦session结束或者超时,所有的临时节点被删除。客户端可以设置session超时时间。

2.1 ZooKeeper节点

ZooKeeper提供一个多层级(基于树形结构)的节点命名空间。类似于linux的目录结构,不同的是ZooKeeper每个节点都能存放数据,而linux文件系统中,只有文件中才能写数据,文件夹中只能放文件(ZooKeeper更简单,不区分文件和文件夹)。ZooKeeper中的节点不允许递归创建,即父节点不存在,不能创建子节点。如:

/parent_node/child

如果/parent_node不存在,则不能直接创建/parent_node/child
Zookeeper节点不能存放大量数据,每个节点存放数据上限为1M。 ZooKeeper节点有四种类型:
持久节点(PERSISTENT):在节点创建后就一直存在,直到有显示的删除操作来清除这个节点。不会随客户端会话失效而消失。如果创建节点时选择PERSISTENT,则不能有同名的节点存在,否则会报错:
java连接zookeeper,java技术,java,java-zookeeper,zookeeper

持久顺序节点(PERSISTENT_SEQUENTIAL):这类节点也是持久的。ZooKeeper中每个父节点会为它的一级子节点维护一份时序,记录每个子节点的先后顺序。ZooKeeper会为每个节点添加一个数字(10位长度左边以0填充的递增数字)后缀作为新的节点名,数字范围是整型最大值。如创建两个/nodetest/child节点,/nodetest下的节点是:

java连接zookeeper,java技术,java,java-zookeeper,zookeeper

临时节点(EPHEMERAL):临时节点的生命周期与客户端会话绑定,如果创建节点的客户端会话失效(并不是断开连接),则节点就被清除掉。临时节点下不能创建子节点
临时顺序节点(EPHEMERAL_SEQUENTIAL):节点创建规则同持久顺序节点,只不过它是临时的。

2.2 Dubbo在ZooKeeper中的存储

Dubbo使用ZooKeeper作为注册中心,也是以节点的形式存储的: 根节点:在/dubbo下 一级节点时服务名(接口全路径)
二级节点下有四个子节点:consumers、configurators、routers、providers
Dubbo服务启动的时候会向/dubbo/${serviceName}/ providers下写入自己的URL地址,完成服务发布

2.3 ZooKeeper Watcher

客户端在向 ZooKeeper 服务器注册 Watcher 的同时,会将 Watcher 对象存储在客户端的 WatchManager中。当ZooKeeper 服务器触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatchManager的实现类中取出对应的 Watcher 对象来执行回调逻辑。
java连接zookeeper,java技术,java,java-zookeeper,zookeeper

这个 Watcher 将作为整个 ZooKeeper会话期间的默认Watcher,会一直被保存在客户端 ZKWatchManager 的 defaultWatcher 中。另外,ZooKeeper
客户端也可以通过 getData、exists 和 getChildren 三个接口来向 ZooKeeper 服务器注册 Watcher。
无论是服务端还是客户端,一旦一个 Watcher 被触发,ZooKeeper 都会将其从相应的存储中移除。因此,在 Watcher的使用上是单次的,需要反复注册。这样的设计有效地减轻了服务端的压力。 触发Watcher回调的条件:
a) 客户端建立连接、断开连接
b) 节点数据发生变化
c) 节点本身发生变化

java连接zookeeper,java技术,java,java-zookeeper,zookeeper文章来源地址https://www.toymoban.com/news/detail-686729.html

到了这里,关于Java操作Zookeeper节点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • ZooKeeper中节点的操作命令(查看、创建、删除节点)

    ZooKeeper中节点的操作命令(查看、创建、删除节点)

    天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 ZooKeeper相关文章参考: ZooKeeper下载、安装、配置和使用 ZooKeeper配置文件zoo.cfg参数详解

    2024年02月06日
    浏览(13)
  • zookeeper之节点基本操作(头歌)

    开启ZooKeeper服务器。 使用客户端(zkCli.sh)连接客户端(IP:127.0.0.1,端口号:2181)。 创建/enode临时节点(节点数据为空)。 创建/spnode持久节点(节点数据为空)。 断开客户端(zkCli.sh)与客服端连接。 本关任务是使用命令行,进行以下操作: 开启ZooKeeper服务器。 使用客

    2024年02月03日
    浏览(9)
  • ZooKeeper基础命令和Java客户端操作

    ZooKeeper基础命令和Java客户端操作

    (1)Help (2)ls 使用 ls 命令来查看当前znode中所包含的内容 (3)ls2查看当前节点数据并能看到更新次数等数据 (4)stat查看节点状态 (5)set 1)设置节点的具体值 2)set 节点 value值 set /test atguigu (6)get 1)获得节点的值 2)get 节点 (7)create 1)普通创建 create /test demo001

    2024年02月10日
    浏览(47)
  • zookeeper之节点基本操作(二)(头歌)

    第一关: 开启ZooKeeper服务器。 使用客户端(zkCli.sh)连接客户端(IP:127.0.0.1,端口号:2181)。 创建/spnode持久节点(节点数据为空)。 使用get命令监听/spnode。 修改/spnode的节点值(当前客户端修改),观察watch事件。 再次使用get命令监听/spnode。 点击评测(评测中修改节点

    2024年04月11日
    浏览(13)
  • ZooKeeper技术细节_zookeeper and 服务器 and 客户端 and 数据节点

    ZooKeeper技术细节_zookeeper and 服务器 and 客户端 and 数据节点

    方法入参EventType指定触发事件的类型:data变更还是childNodes变更等。 将KeeperState、EventType、Path new 到WatchedEvent实例中 根据Path路径从watchTable中找到所有对应的Watcher,为空continue,不为空时再iterator.remove掉,这样Watcher触发一次就失效了 从Map中找到的所有Watcher执行一遍其process方

    2024年04月22日
    浏览(9)
  • Java客户端_zkclient库操作Zookeeper

    使用zookeeper遇到问题: 重复注册watcher session失效重连 异常处理(删除节点不能有子节点,新增节点必须有父节点等) zkclient是Github上一个开源的Zookeeper客户端,在Zookeeper原生 API接口之上进行了包装,是一个更加易用的Zookeeper客户端。同时Zkclient在内部实现了诸如Session超时重

    2024年02月07日
    浏览(11)
  • Zookeeper篇——深入认识和学习Zookeeper节点-Znode,涵盖概念以及详细操作节点命令,保姆级教程,超详细、超全面!!!

    Zookeeper篇——深入认识和学习Zookeeper节点-Znode,涵盖概念以及详细操作节点命令,保姆级教程,超详细、超全面!!!

    Zookeeper是一个分布式的协调服务,它通过维护一个分层的数据结构来存储和管理数据。这个数据结构被称为znode节点。每个znode节点在Zookeeper的命名空间中都有一个唯一的路径,类似于文件系统中的路径。 Zookeeper中的znode节点有以下几种类型: 永久节点(Persistent znode):永久

    2024年02月03日
    浏览(12)
  • ZooKeeper Java API 使用教程 - 同步与异步操作示例

    ZooKeeper Java API 使用教程 - 同步与异步操作示例

    本教程详细介绍了如何使用ZooKeeper Java API进行节点数据的同步和异步获取。通过具体代码示例,展示了如何连接ZooKeeper服务器,获取子节点列表,以及如何处理节点数据变化的事件。

    2024年04月22日
    浏览(6)
  • Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)

    Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)

    1.1 概述 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。 1、Zookeeper工作机制 Zookeeper从设置模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责储存和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生

    2024年03月28日
    浏览(6)
  • 2.Zookeeper集成springboot操作节点,事件监听,分布式锁实现

    1.Springboot项目中添加zookeeper 已经对应的客户端依赖 ,pom.xml文件如下 2.application.yml 文件中配置zookeeper连接的相关配置信息 3.java配置的方式添加zookeeper相关的配置 4.Zookeeper基础操作服务和分布式锁服务编码 5.watcher机制事件处理抽象封装 6.基本操作的单元测试代码

    2024年03月10日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包