欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Zookeeper_zkClientAPI讲解

发布时间:2024/4/13 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Zookeeper_zkClientAPI讲解 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
能不能有一个简单的实现去实现zookeeper的API,其实是有很多的,我给你推荐的就是两套,第一套叫做zkClient,其实zkClient我也不想作为重点,我想作为重点的是Curator,你只有理解zookeeper最原始的API,但是你得理解他的概念之后,然后才能学好client,才能学好Curator,要不然你只是一个应用级别的,你并不是深入了解这个的,很多人都会问,要问的话就问原生的,就问你Curator怎么实现的,分布式锁是怎么去实现的,curator也是封装了原生的代码去实现的

这个使用其实非常简单了,不能说非常简单,也没有Curator简单,也没有Curator强大,目前用的最多的可能是zkClient,没有详细的去了解过这个事,其实就是引入了zkclient-0.1.jar这个jar包,你会发现好多的框架,利用zookeeper的框架,像比如说dubbo,他用的都是这个,都是这玩意

我刚才给你们看的是dubbox,当当网重写阿里的那个,人家最新的用的是curator

dubbox是当当网写的,阿里用的是zkclient

你既然使用dubbo的话,SOA肯定会涉及到注册服务的事,注册服务就是用的zookeeper的协调,zookeeper他是怎么去做协调的,他肯定不是用的原生的,阿里巴巴都没有用原生的API去写这个事,人家使用zkclient这个API去写的,因为它认为原生的zk API是在是太难用了,就包括我以前在工作的时候,我们那时候比写dubbo的时候还要早一点吧,现在主流比较新的都用curator,没有人用zkclient,但是zkclient你也要明白,他简化了什么事,介绍完zkclient,它是Datameter这个工程师反正就是几个哥们一起开发的,基于原生API再封装的,简化了ZK复杂性的一套,新型的API叫做zkClient,然后他怎么去使用呢,创建方法有1,2,3,4,5,咱们直接看代码,你的世界稍微亮了一点了一个叫zkclient base,一个叫watcher package com.learn.zkclient.base;import org.I0Itec.zkclient.ZkClient; import org.I0Itec.zkclient.ZkConnection;/*** 你看这个世界就稍微好一点了* 这里面的代码可能很简单* * * @author Leon.Sun**/ public class ZkClientBase {/** zookeeper地址 *//*** 首先还是连这个地址*/static final String CONNECT_ADDR = "59.110.138.145:2181"; // static final String CONNECT_ADDR = "192.168.80.88:2181,192.168.80.87:2181,192.168.80.86:2181";/** session超时时间 *//*** 超时时间都有了*/static final int SESSION_OUTTIME = 5000;//ms public static void main(String[] args) throws Exception {/*** org.I0Itec.zkclient.ZkClient* 这个是zkclient的API* I0Itec这个包* 他也是new了一个* ZkClient(IZkConnection connection, int connectionTimeout)* 一个是需要IZkConnection这个接口* 还有一个是超时时间* 我需要创建一个对象* 然后里面再传一个address* 在ZkClient再传一个超时时间* 语法就是很固定的* 还有一些其他的API* 你还可以实现一些序列号的框架* 在这里我就不去说了* 真正想序列化到一个zookeeper上* 没有什么实际太大的意义* 传JSON就over了* 大不了我转一下码* 怎么去使用呢* 把这个对象实例化出来*/ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000);//1. create and delete方法 /*** 创建一个临时节点* API提供了createEphemeral* 还提供了createPersistent* zkc.create(path, data, mode)* 他其实还有一个create的方法* mode是你要创建的模式是什么* 这个你可以选* 和原生的差不多* 要理解持久化顺序的* 要不然就是Ephemeral* 要不然就是Persistent* * 你会发现我们这里有一个区别* 什么区别* 我去zkCli.sh* ls /* 他有一个/super* rmr /super删除* ls /* 还是啥也没有数据很干净* 我现在直接做了一件什么事* * temp突然没了* 因为10秒钟过了* 他就释放连接了* 因为他是Ephemeral* * */ // zkc.createEphemeral("/temp");/*** 竟然做了这样一件事* 第一个是temp* 第二个是c1* 这里递归的创建super和c1* 解决了递归创建的这个事* 他是可以去做递归创建的* 有递归创建必然就有递归删除* 但是他的递归创建还是不太好* 只能指定一个key* 能不能把value给我指定好* 其实你想一想* 我能不能传一个value* 他是他确实没有这么强大* 如果我能这么去写就无敌了* 可以传一个数组了* 传一个有序的数组* 他这个API只是这样的* 能不能帮我创建一个节点的key* 这个value他都是空的* 要么是path路径* 要么是布尔类型的* 要么就是Object类型的* */ // zkc.createPersistent("/super/c1", true);/*** 它是支持递归创建的* */ // zkc.createPersistent("/super/c1/c2", true);/*** 我们在这里休眠10秒钟*/ // Thread.sleep(10000); // zkc.delete("/temp");/*** 有递归的创建* 就必然有递归的删除* 要么delete要么递归的delete* */ // zkc.deleteRecursive("/super");//2. 设置path和data 并且读取子节点和每个节点的内容/*** 这是创建一个super* */ // zkc.createPersistent("/super", "1234"); // /** // * super下创建一个c1 // * 然后内容是什么 // * // */ // zkc.createPersistent("/super/c1", "c1内容"); // zkc.createPersistent("/super/c2", "c2内容"); // /** // * 这是zkclient提供API // * 有点区别于原生的API // * 原生API有exists方法啊 // * get方法啊 // * 后面都有一个watcher // * 因为zkclient觉得持久化和watcher他们两个如果拆分在一起 // * 那就失去了我封装的意义了 // * 其实zkclient要解决的一个问题就是watcher这个事就给屏蔽掉了 // * 不需要你写数据的时候需要去watch了 // * 它是最大最大的特点也是好处 // * 一会再看他到底要怎么去写啊 // * 你会发现这里的增删改查操作和watcher没有关系 // * // * 把他的孩子get出来 // * // */ // List<String> list = zkc.getChildren("/super"); // for(String p : list){ // System.out.println(p); // /** // * 当然他也是一个相对路径 // * // */ // String rp = "/super/" + p; // /** // * 这里的布尔类型也不是那个watcher // * read其实原生的API // * // */ // String data = zkc.readData(rp); // /** // * 最后我打印一下 // * // */ // System.out.println("节点为:" + rp + ",内容为: " + data); // }//3. 更新和判断节点是否存在/*** 他这个是原生的API* 基本上没有原生API的Watcher了* 原先内存是c1内容* 我现在改成新内容* 原生API是需要传一个字节数组* 但是这里直接是一个对象了* */zkc.writeData("/super/c1", "新内容");/*** 这里应该是新内容了* 读出来的时候可以直接转成一个字符串* 这是他第二个好处* */System.out.println(zkc.readData("/super/c1").toString());/*** 没有任何的watcher参数* 判断你存不存在* 这里存不存在* 直接给你返回一个true* 这个就是一个zkclient* 你是不是觉得很简单* 但是是不是很疑惑* 就是那个watcher哪去了* 你可以理解为和原生的API分离了* 原生的API是耦合在一起的* 但是zkclient是提供了两种方式的watcher* */System.out.println(zkc.exists("/super/c1"));//4.递归删除/super内容 // zkc.deleteRecursive("/super"); /*** 最后我们释放连接*/zkc.close();} }

 

总结

以上是生活随笔为你收集整理的Zookeeper_zkClientAPI讲解的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。