Java连接Zookeeper以及书写简单增删改查的方法

  摘要:本笔记主要记录了使用IDEA创建一个Maven项目并使用Maven配置文件下载Zookeeper连接驱动,连接云服务器的Zookeeper服务并书写一些简单的增删改查方法的过程

1.创建Maven项目

  Maven是什么?Maven实际上是一个项目管理工具,Maven分为Maven仓库和Maven命令两部分,其中Maven仓库是存放各种jar包驱动各种插件的地方,这里存放了所有我们在构建项目过程中可能用到的jar包,Maven命令是Maven中带有的一些脚本操作,这些命令将我们在项目构建过程中的一些操作进行了打包,比如我们在一个项目完成,将这个项目制作成一个war包或者jar包的时候,需要很多操作,才能让它变成一个合法的war包或jar包并进行最终的部署,但是使用Maven我们可以一键完成这个过程,鉴于我自己也是在初学Maven,很多东西的认知比较浅,对于Maven目前也是止步于创建并简单的使用Maven项目,因此在这里不再进行过多的解释,我们目前阶段只须记住:Maven可以管理jar包,Maven项目中可以使用配置文件让Maven自动的下载我们想要的jar包并完成自动导入,不需要我们亲自在网上找并手动导入,方便了我们的操作。接下来,让我们尝试着创建一个Maven项目:

  我们新建一个Maven项目,至于模板我们可以不选,操作出如上界面后我们直接点击next即可,

  我们起一个名字,然后点击finish就可以了,成功后如下图所示,我们直接进入了pom配置文件,我们使用该文件可以进行配置:

  我们先将该项目的Maven路径修改成自己的,并将Maven配置文件也修改成自己的,这里是因为idea自带的Maven中的配置的Maven仓库地址是一个外网地址,我们一般的网络访问不到,可能会出现由于下载不了jar包而导致项目一直报错的情况,我在下载Maven的时候,已经将其中的配置文件进行了修改,将Maven仓库的镜像改成了阿里巴巴的镜像,这样一来我们就可以下载各种jar包了,因此在idea中我们需要将Maven的路径改成自己的,配置文件也要修改成自己的,具体操作如下图所示:

  首先我们点击file,然后选择setting,就会出现如图所示的窗口,之后我们可以在蓝色箭头的搜索栏中搜索Maven,然后直接就会跳转到Maven配置的界面,按照图中提示,我们可以进行相应的配置,配置完成后如图所示:

  红框中的两个位置都要修改成自己的,之后点击确认即可。万事大吉后,我们就可以修改pom文件,让Maven自动为我们下载链接Zookeeper的启动就好了。我们在pom文件的properties标签的后边加入下面的配置信息:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.zookeeper</groupId>
  4. <artifactId>zookeeper</artifactId>
  5. <version>3.4.12</version>
  6. </dependency>
  7. </dependencies>

  代码如上图所示,加入配置信息之后,idea就会自动下载zookeeper的相关控制jar包,我们现在可以发现在扩展目录下,jar包已经被下载好了,如图所示:

  至此,支持连接zookeeper的环境就搭建好了,我们现在就可以书写连接zookeeper以及控制zookeeper的方法了。

2.Zookeeper的连接操作

  首先我们创建一个测试各种方法的类,如图所示:

  之后我们先要在类中定义两个重要字段,其中一个是提供zookeeper服务的服务器地址字段,一个是超时时间字段,服务器地址字段是干啥用的不必多说,超时时间的含义是一旦连接服务的时间超过了所设定的时间,就会认定为连接失败并终止这个连接操作,我们定义字段如下:

  1. public static final String serverAddress = "XXX.XXX.XXX.XXX:YYYY";
  2. public static final int timeout = 15000;

  其中serverAddress是服务地址,XXX部分是服务器公网地址,YYYY部分是zookeeper服务的端口,这个端口通常来说是2181,我们也可以通过配置文件将其修改成自己想要的端口。之后我们就可以书写zookeeper的连接方法了,如下图所示:

  创建zookeeper连接的方式很简单,就是使用Zookeeper的构造方法,输入参数:服务地址超时时间,然后创建一个对象即可,但是我们发现这里报错了,这是因为在Zookeeper的jar包源码中,在Zookeeper的形参列表为服务地址和超时时间的构造器中抛出了一个异常,为什么抛出这个异常呢?因为这种远程连接的建立不是100%成功的,因此在这里抛出了一个IO异常,现在让我们来看看源码:

  我们可以发现这些构造器中均抛出了IO异常,因此在我们的代码这里可以选择继续抛出,也可以选择做一个try/catch操作,这里我做一个try/catch操作。如图所示:

  这样一来就不会报错了,在这里我们不仅可以使用try/catch的操作,还可以使用在方法体上直接抛出这个异常,让更上一层的调用者去处理这个异常,这种方法是在方法体上添加throws关键词,两种方法都可以,下面附上我的代码:

  1. /**
  2. * @description:
  3. * @param
  4. * @return: org.apache.zookeeper.ZooKeeper
  5. * @author: 李若白
  6. * @time: 4/5/2022 5:32 PM
  7. */
  8. public static ZooKeeper connect(){
  9. System.out.println("开始获取zookeeper连接...");
  10. ZooKeeper zk = null;
  11. try {
  12. zk = new ZooKeeper(serverAddress,timeout,null);
  13. System.out.println("获取连接成功!");
  14. return zk;
  15. } catch (IOException e) {
  16. System.out.println("获取连接时出现异常,请重试...");
  17. e.printStackTrace();
  18. return null;
  19. }
  20. }

  我们试运行一下:

  连接成功!

3.Zookeeper的添加操作

  接下来我们书写添加操作,首先我们确定框架如下,zkConnect是我们刚获取的连接,node是我们选定的zookeeper节点,data是我们想要插入的zookeeper数据:

  之后我们要根据zookeeper驱动中提供的方法,创建一个节点并将这个节点放入到zookeeper的存储结构中去,我们书写代码如下:

  其中acl变量指的是节点权限,我们进入源码中可以发现:

  Ids下有这么几个不同的权限,我们在穿件Zookeeper节点的时候,需要为其赋予权限,这些权限的信息就存在这里,这些权限的含义为:

  1. OPEN_ACL_UNSAFE:完全开放的ACL,任何连接的客户端都可以操作该属性znode
  2. CREATOR_ALL_ACL:只有创建者才有ACL权限
  3. READ_ACL_UNSAFE:只能读取ACL

  之后我们继续书写代码,我们之后又加入一行:

  新的一行代码的含义是节点类型,这个节点类型信息同样在源码中可以看到,如下:

  节点类型一共有四种,介绍如下:

  1. PERSISTENT:持久性的节点,目录不会丢失
  2. PERSISTENT_SEQUENTAL:存储的数据不会丢失,并且根据当前已经存在的节点数目自动加1,然后返回给客户端已经成功创建的目录节点名
  3. EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是session超时,这种节点就会被删除
  4. EPHEMERAL_SEQUENTAL:临时自动编号节点,一旦创建这个节点的客户端与服务器端口也就是session超时,这种节点就会被删除

  现在我们权限也有了,类型也有了,数据也有了,就要创建节点了,我们继续书写代码:

  这个create也是有源码的,我们去看看:

  我们发现自己书写的代码在data出报错,这是因为在源码中,data应该是byte[]类型的,而非String类型,同时我们还发现了create方法要抛出两个异常,在之后的书写中我们要注意,我们首先将data处的错误解决:

  如图所示我已经将所有问题解决了,接下来我们可以测试看看:

  可见客户端已经提示创建成功,我们接下来在服务器上看看是否真的已经创建成功:

  可见确实已经创建成功了,下面我附上代码:

  1. /**
  2. * @description:
  3. * @param zkConnect zookeeper连接
  4. * @param node 我们选定的zookeeper节点
  5. * @param data 我们想要插入的数据
  6. * @return: void
  7. * @author: 李若白
  8. * @time: 4/5/2022 5:57 PM
  9. */
  10. public static void create(ZooKeeper zkConnect,String node,String data){
  11. System.out.println("开始创建节点:"+node+",节点数据为:"+data);
  12. List<ACL> acl = ZooDefs.Ids.OPEN_ACL_UNSAFE;//这个参数是节点权限,在Zookeeper中每个节点有各自的权限,我们使用acl并变量存储权限
  13. CreateMode createMode = CreateMode.PERSISTENT;//这个参数是节点类型
  14. try {
  15. zkConnect.create(node,data.getBytes(),acl,createMode);
  16. System.out.println("创建成功!");
  17. } catch (KeeperException e) {
  18. System.out.println("创建失败!");
  19. e.printStackTrace();
  20. } catch (InterruptedException e) {
  21. System.out.println("创建失败!");
  22. e.printStackTrace();
  23. }
  24. }

4.Zookeeper的删除操作

  接下来我们书写删除操作,有了上面添加的先例,我们就有做删除方法的经验了,和添加一样,在Zookeeper的源码中也是存在基础的删除操作调用的,如图所示:

  在源码中的删除方法中显示其拥有两个参数,其中一个参数叫path,顾名思义,这个参数实际上就是节点的路径,那version是什么呢?version的中文意思是版本,那么为什么删除需要版本,这个版本又是谁的版本呢?这个版本号是zookeeper节点的版本号,在zookeeper中每一个节点都有一个自己的版本号,当我们将版本号参数设定为-1的时候,含义为无视版本号,那这个版本号具有有什么作用呢?有一种叫做CAS的概念,在操作系统以及并发编程中存在这个概念,此概念的含义为比较并交换,其内部有一个很重要的观念,就是版本号的观念,版本号的加入是为了并发时的安全所设置,目前由于我并没有学习到这个程度,因此仅仅了解到版本号是CAS中的一个观念,目的是为了并发时的安全即可。

  既然知道了zookeeper中的节点有版本号,那我们就需要想办法获取版本号,接下来我们看代码:

  想要删除一个节点,首先要确认zookeeper的存储结构中有没有这个节点,因此我们首先用exists进行判断,如果有的话,那么exists这个方法就不会抛出异常,并返回该节点的信息,其中该节点的版本信息就存放在了这个返回信息中,我们可以根据这个返回信息来获取当前该节点正确的版本号,进而进行删除操作,接下来我们测试一下:

  我们在服务端看一看是否还有这个节点:

  删除成功!在下边我附上代码:

  1. /**
  2. * @description:
  3. * @param zkConnect
  4. * @param node
  5. * @return: void
  6. * @author: 李若白
  7. * @time: 4/5/2022 10:14 PM
  8. */
  9. public static void delete(ZooKeeper zkConnect,String node){
  10. try {
  11. Stat stat = zkConnect.exists(node,false);
  12. System.out.println("开始删除节点:"+node);
  13. zkConnect.delete(node,stat.getVersion());
  14. } catch (KeeperException e) {
  15. e.printStackTrace();
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. }

5.Zookeeper的修改操作

  接下来我们书写修改操作,有了删除操作的经验,我们书写修改操作就可以变得很容易了,我们首先查看源码:

  除去一些必要的因素,我们注意到了在set操作中有一个data参数,这个参数是我们想要为该节点设置的新值,因此我们可以自己书写代码如下:

  逻辑同样是先判断是否存在节点,之后调用驱动中的方法进行值的更新,这里测试结果不再展示,自测成功,下面附上代码:

  1. /**
  2. * @description:
  3. * @param zkConnect
  4. * @param node
  5. * @param data
  6. * @return: void
  7. * @author: 李若白
  8. * @time: 4/5/2022 10:19 PM
  9. */
  10. public static void setNode(ZooKeeper zkConnect,String node,String data) throws InterruptedException, KeeperException {
  11. Stat stat = zkConnect.exists(node,false);
  12. zkConnect.setData(node,data.getBytes(),stat.getVersion());
  13. System.out.println("新值设定成功!");
  14. }

6.Zookeeper的查找操作

  接下来我们书写查找操作,查找操作的逻辑同上,仅展示代码:

  下面附上代码:

  1. /**
  2. * @description:
  3. * @param zooKeeper
  4. * @param node
  5. * @return: void
  6. * @author: 李若白
  7. * @time: 4/5/2022 10:23 PM
  8. */
  9. public static void getNode(ZooKeeper zooKeeper,String node) throws InterruptedException, KeeperException {
  10. Stat stat = zooKeeper.exists(node,false);
  11. String info = new String(zooKeeper.getData(node,false,stat));
  12. }

Java连接Zookeeper以及书写简单增删改查的方法的更多相关文章

  1. Java连接Redis之redis的增删改查

    一.新建一个maven工程,工程可以以jar的形式或war都行,然后导入正确的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0& ...

  2. Java连接本地MySQL数据库进行增删改查操作

    package Dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStat ...

  3. java连接mysql数据库 三 实现增删改查操作

    同以前一样,先写一个数据库打开和关闭操作类 public class DBConnection { String driver = "com.mysql.jdbc.Driver"; ...

  4. java对xml节点属性的增删改查实现方法

    package vastsum; import java.io.File; import java.io.FileWriter; import java.util.Iterator; import o ...

  5. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  6. zookeeper curator客户端之增删改查

    zookeeper curator客户端之增删改查 zookeeper安装:https://www.cnblogs.com/zwcry/p/10272506.html curator客户端是Apach ...

  7. ado.net的简单数据库操作(三)——简单增删改查的实际应用

    果然,在犯困的时候就该写写博客,写博客就不困了,哈哈! 上篇我记录了自己的SqlHelper的开发过程,今天记录一下如何使用这个sqlhelper书写一个具有简单增删改查的小实例啦. 实例描述:在数据 ...

  8. Redis:五种数据类型的简单增删改查

    Redis简单增删改查例子 例一:字符串的增删改查 #增加一个key为ay_key的值 127.0.0.1:6379> set ay_key "ay" OK #查询ay_ke ...

  9. AD 域服务简介(三)- Java 对 AD 域用户的增删改查操作

    博客地址:http://www.moonxy.com 关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用 Java 获取 AD 域用户, ...

  10. 04-springboot整合elasticsearch初识-简单增删改查及复杂排序,分页,聚合操作

        前面大概了解了一下elasticsearch的数据存储和数据的查询.现在学习一下,es的复杂操作.     官网相关文档地址:https://www.elastic.co/guide/en/e ...

随机推荐

  1. 【Chrome浏览器】关闭触摸板双指滑动进行前进后退的功能

    痛点 Chrome浏览器使用过程中,当前页面经常会莫名其妙地退回到上一个浏览的页面. 当时真是一脸懵B(心里一万头草泥马呼啸而过~)!以为活见鬼了! 后来才发现浏览器左边,有一个幽灵般的淡蓝色箭头的出 ...

  2. Vue学习之--------组件的基本使用(非单文件组件)(代码实现)(2022/7/22)

    文章目录 1.为啥要使用组件 2.基本使用 3.代码实例 4.测试效果 5.注意点 1.为啥要使用组件 好用啊.像堆积木一样 2.基本使用 Vue中使用组件的三大步骤: 一.定义组件(创建组件) 二. ...

  3. P 算法与 K 算法

    P 算法与 K 算法 作者:Grey 原文地址: 博客园:P 算法与 K 算法 CSDN:P 算法与 K 算法 说明 P 算法和 K 算法主要用来解决最小生成树问题,即:不破坏连通性删掉某些边,使得整 ...

  4. vscode删除卸载残余

    1.删除安装插件C:/User/XXX/.vscode2.删除用户信息和缓存信息C:/User/XXX/AppData/Roaming/CodeC:/User/XXX/AppData/Roaming/ ...

  5. Python爬虫requests请求库

    requests:pip install  request 安装 实例: import requestsurl = 'http://www.baidu.com'response = requests. ...

  6. 某 .NET RabbitMQ SDK 有采集行为,你怎么看?

    一:背景 1.讲故事 前几天有位朋友在微信上找到我,说他的一个程序上了生产之后,被运维监控定位到这个程序会向一个网址为: http://m.365ey.net 上不定期打数据,而且还是加密的格式,要他 ...

  7. ES6 学习笔记(十三)promise的简单使用

    1.什么是promise 在JavaScript中,我们经常会用到回调函数,而回调函数的使用让我们没法使用return,throw等关键字.JS引用promise正好解决了这个问题. promise单 ...

  8. 廖---list tuple dic set

    list 有序集合,可随时添加和删除其中的数据. 在 Python 列表中删除元素主要分为以下 3 种场景: 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法: 根据 ...

  9. SpringCloud(九) - Nginx

    1.安装Nginx 1.1 解压上传安装包 解压# nginx-1.16.1.tar.gz # nginx需要一些环境(全部执行,不存在的会执行,存在的会跳过) yum install -y wget ...

  10. 表单的子元素可不在form标签内

    表单是网页用于向服务器发送数据的元素.其用法类似下面: <form method="POST" action="/login"> <input ...