资讯详情

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

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

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

文章目录

      • Java连接Zookeeper以及书写简单增删改查的方法
        • 1.创建Maven项目
        • 2.Zookeeper的连接操作
        • 3.Zookeeper的添加操作
        • 4.Zookeeper的删除操作
        • 5.Zookeeper的修改操作
        • 6.Zookeeper的查找操作

1.创建Maven项目

??Maven是什么?Maven实际上是项目管理工具,Maven分为Maven仓库和Maven命令两部分,其中Maven仓库存放各种仓库jar我们在建设项目过程中可能使用的所有插件都存储在包驱动的地方jar包,Maven命令是Maven这些命令包装了我们在项目建设过程中的一些操作,例如,我们完成了一个项目,并将这个项目制作成一个项目war包或者jar包装时,需要大量的操作才能使其成为合法的war包或jar包并最终部署,但使用Maven鉴于我也在初学,我们可以一键完成这个过程Maven,许多事物的认知相对较浅,对于Maven目前也是止步于创建并简单的使用Maven因此,这里不再有太多的解释,我们只需要记住:。接下来,让我们试着创造一个Maven项目:

image-20220405164054509

??我们新建一个Maven至于项目,我们不能选择模板。操作完上面的界面后,我们直接点击next即可,

??我们点击一个名字finish成功后,如下图所示,我们直接进入pom本文件可用于配置文件:

??我们先做这个项目Maven修改自己的路径,修改自己的路径Maven配置文件也被修改为自己的,因为idea自带的Maven中的配置的Maven仓库地址是外网地址,我们一般网络无法访问,可能会因为无法下载而出现jar我正在下载导致项目报错的情况Maven已修改配置文件,将Maven仓库的镜像变成了阿里巴巴的镜像,这样我们就可以下载各种镜像jar包,所以在idea我们需要将军Maven如下图所示:

??首先,我们点击file,然后选择setting,窗口如图所示,然后我们可以在蓝色箭头的搜索栏中搜索Maven,然后直接跳转Maven根据图中的提示,我们可以进行相应的配置,如图所示:

??红框中的两个位置都要修改成自己的,然后点击确认。万事大吉后,我们可以修改pom文件,让Maven为我们自动下载链接Zookeeper我们正在开始。pom文件的properties在标签后面添加以下配置信息:

<dependencies>     <dependency>         <groupId>org.apache.zookeeper</groupId>         <artifactId>zookeeper</artifactId>         <version>3.4.12</version>     </dependency> </dependencies> 

??添加配置信息后,代码如上图所示,idea就会自动下载zookeeper的相关控制jar我们现在可以在扩展目录下找到包,jar包已下载,如图所示:

??到目前为止,支持连接zookeeper环境已经建成,我们现在可以写连接了zookeeper以及控制zookeeper的方法了。

2.Zookeeper的连接操作

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

??之后,我们必须在类中定义两个重要的字段,一个是提供zookeeper服务器地址字段,一个是超时间字段,服务器地址字段是什么不用说,超时间的意思是,一旦连接服务时间超过设定时间,将被认定为连接失败,终止连接操作,我们定义字段如下:

public static final String serverAddress = "XXX.XXX.XXX.XXX:YYYY"; 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关键词,两种方法都可以,下面附上我的代码:

	/** * @description: * @param * @return: org.apache.zookeeper.ZooKeeper * @author: 李若白 * @time: 4/5/2022 5:32 PM */
    public static ZooKeeper connect(){ 
        
        System.out.println("开始获取zookeeper连接...");
        ZooKeeper zk = null;
        try { 
        
            zk = new ZooKeeper(serverAddress,timeout,null);
            System.out.println("获取连接成功!");
            return zk;
        } catch (IOException e) { 
        
            System.out.println("获取连接时出现异常,请重试...");
            e.printStackTrace();
            return null;
        }
    }

  我们试运行一下:

  连接成功!

3.Zookeeper的添加操作

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4.Zookeeper的删除操作

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

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

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

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

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

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

	/** * @description: * @param zkConnect * @param node * @return: void * @author: 李若白 * @time: 4/5/2022 10:14 PM */
    public static void delete(ZooKeeper zkConnect,String node){ 
        
        try { 
        
            Stat stat = zkConnect.exists(node,false);
            System.out.println("开始删除节点:"+node);
            zkConnect.delete(node,stat.getVersion());
        } catch (KeeperException e) { 
        
            e.printStackTrace();
        } catch (InterruptedException e) { 
        
            e.printStackTrace();
        }
    }

5.Zookeeper的修改操作

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

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

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

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

6.Zookeeper的查找操作

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

  下面附上代码:

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

标签: 连接器57164zk10连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台