Zookeeper_zkClientAPI讲解
生活随笔
收集整理的這篇文章主要介紹了
Zookeeper_zkClientAPI讲解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
能不能有一個(gè)簡(jiǎn)單的實(shí)現(xiàn)去實(shí)現(xiàn)zookeeper的API,其實(shí)是有很多的,我給你推薦的就是兩套,第一套叫做zkClient,其實(shí)zkClient我也不想作為重點(diǎn),我想作為重點(diǎn)的是Curator,你只有理解zookeeper最原始的API,但是你得理解他的概念之后,然后才能學(xué)好client,才能學(xué)好Curator,要不然你只是一個(gè)應(yīng)用級(jí)別的,你并不是深入了解這個(gè)的,很多人都會(huì)問,要問的話就問原生的,就問你Curator怎么實(shí)現(xiàn)的,分布式鎖是怎么去實(shí)現(xiàn)的,curator也是封裝了原生的代碼去實(shí)現(xiàn)的
這個(gè)使用其實(shí)非常簡(jiǎn)單了,不能說非常簡(jiǎn)單,也沒有Curator簡(jiǎn)單,也沒有Curator強(qiáng)大,目前用的最多的可能是zkClient,沒有詳細(xì)的去了解過這個(gè)事,其實(shí)就是引入了zkclient-0.1.jar這個(gè)jar包,你會(huì)發(fā)現(xiàn)好多的框架,利用zookeeper的框架,像比如說dubbo,他用的都是這個(gè),都是這玩意
我剛才給你們看的是dubbox,當(dāng)當(dāng)網(wǎng)重寫阿里的那個(gè),人家最新的用的是curator
dubbox是當(dāng)當(dāng)網(wǎng)寫的,阿里用的是zkclient
你既然使用dubbo的話,SOA肯定會(huì)涉及到注冊(cè)服務(wù)的事,注冊(cè)服務(wù)就是用的zookeeper的協(xié)調(diào),zookeeper他是怎么去做協(xié)調(diào)的,他肯定不是用的原生的,阿里巴巴都沒有用原生的API去寫這個(gè)事,人家使用zkclient這個(gè)API去寫的,因?yàn)樗J(rèn)為原生的zk API是在是太難用了,就包括我以前在工作的時(shí)候,我們那時(shí)候比寫dubbo的時(shí)候還要早一點(diǎn)吧,現(xiàn)在主流比較新的都用curator,沒有人用zkclient,但是zkclient你也要明白,他簡(jiǎn)化了什么事,介紹完zkclient,它是Datameter這個(gè)工程師反正就是幾個(gè)哥們一起開發(fā)的,基于原生API再封裝的,簡(jiǎn)化了ZK復(fù)雜性的一套,新型的API叫做zkClient,然后他怎么去使用呢,創(chuàng)建方法有1,2,3,4,5,咱們直接看代碼,你的世界稍微亮了一點(diǎn)了一個(gè)叫zkclient base,一個(gè)叫watcher
package com.learn.zkclient.base;import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;/*** 你看這個(gè)世界就稍微好一點(diǎn)了* 這里面的代碼可能很簡(jiǎn)單* * * @author Leon.Sun**/
public class ZkClientBase {/** zookeeper地址 *//*** 首先還是連這個(gè)地址*/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超時(shí)時(shí)間 *//*** 超時(shí)時(shí)間都有了*/static final int SESSION_OUTTIME = 5000;//ms public static void main(String[] args) throws Exception {/*** org.I0Itec.zkclient.ZkClient* 這個(gè)是zkclient的API* I0Itec這個(gè)包* 他也是new了一個(gè)* ZkClient(IZkConnection connection, int connectionTimeout)* 一個(gè)是需要IZkConnection這個(gè)接口* 還有一個(gè)是超時(shí)時(shí)間* 我需要?jiǎng)?chuàng)建一個(gè)對(duì)象* 然后里面再傳一個(gè)address* 在ZkClient再傳一個(gè)超時(shí)時(shí)間* 語(yǔ)法就是很固定的* 還有一些其他的API* 你還可以實(shí)現(xiàn)一些序列號(hào)的框架* 在這里我就不去說了* 真正想序列化到一個(gè)zookeeper上* 沒有什么實(shí)際太大的意義* 傳JSON就over了* 大不了我轉(zhuǎn)一下碼* 怎么去使用呢* 把這個(gè)對(duì)象實(shí)例化出來(lái)*/ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000);//1. create and delete方法 /*** 創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn)* API提供了createEphemeral* 還提供了createPersistent* zkc.create(path, data, mode)* 他其實(shí)還有一個(gè)create的方法* mode是你要?jiǎng)?chuàng)建的模式是什么* 這個(gè)你可以選* 和原生的差不多* 要理解持久化順序的* 要不然就是Ephemeral* 要不然就是Persistent* * 你會(huì)發(fā)現(xiàn)我們這里有一個(gè)區(qū)別* 什么區(qū)別* 我去zkCli.sh* ls /* 他有一個(gè)/super* rmr /super刪除* ls /* 還是啥也沒有數(shù)據(jù)很干凈* 我現(xiàn)在直接做了一件什么事* * temp突然沒了* 因?yàn)?0秒鐘過了* 他就釋放連接了* 因?yàn)樗荅phemeral* * */
// zkc.createEphemeral("/temp");/*** 竟然做了這樣一件事* 第一個(gè)是temp* 第二個(gè)是c1* 這里遞歸的創(chuàng)建super和c1* 解決了遞歸創(chuàng)建的這個(gè)事* 他是可以去做遞歸創(chuàng)建的* 有遞歸創(chuàng)建必然就有遞歸刪除* 但是他的遞歸創(chuàng)建還是不太好* 只能指定一個(gè)key* 能不能把value給我指定好* 其實(shí)你想一想* 我能不能傳一個(gè)value* 他是他確實(shí)沒有這么強(qiáng)大* 如果我能這么去寫就無(wú)敵了* 可以傳一個(gè)數(shù)組了* 傳一個(gè)有序的數(shù)組* 他這個(gè)API只是這樣的* 能不能幫我創(chuàng)建一個(gè)節(jié)點(diǎn)的key* 這個(gè)value他都是空的* 要么是path路徑* 要么是布爾類型的* 要么就是Object類型的* */
// zkc.createPersistent("/super/c1", true);/*** 它是支持遞歸創(chuàng)建的* */
// zkc.createPersistent("/super/c1/c2", true);/*** 我們?cè)谶@里休眠10秒鐘*/
// Thread.sleep(10000);
// zkc.delete("/temp");/*** 有遞歸的創(chuàng)建* 就必然有遞歸的刪除* 要么delete要么遞歸的delete* */
// zkc.deleteRecursive("/super");//2. 設(shè)置path和data 并且讀取子節(jié)點(diǎn)和每個(gè)節(jié)點(diǎn)的內(nèi)容/*** 這是創(chuàng)建一個(gè)super* */
// zkc.createPersistent("/super", "1234");
// /**
// * super下創(chuàng)建一個(gè)c1
// * 然后內(nèi)容是什么
// *
// */
// zkc.createPersistent("/super/c1", "c1內(nèi)容");
// zkc.createPersistent("/super/c2", "c2內(nèi)容");
// /**
// * 這是zkclient提供API
// * 有點(diǎn)區(qū)別于原生的API
// * 原生API有exists方法啊
// * get方法啊
// * 后面都有一個(gè)watcher
// * 因?yàn)閦kclient覺得持久化和watcher他們兩個(gè)如果拆分在一起
// * 那就失去了我封裝的意義了
// * 其實(shí)zkclient要解決的一個(gè)問題就是watcher這個(gè)事就給屏蔽掉了
// * 不需要你寫數(shù)據(jù)的時(shí)候需要去watch了
// * 它是最大最大的特點(diǎn)也是好處
// * 一會(huì)再看他到底要怎么去寫啊
// * 你會(huì)發(fā)現(xiàn)這里的增刪改查操作和watcher沒有關(guān)系
// *
// * 把他的孩子get出來(lái)
// *
// */
// List<String> list = zkc.getChildren("/super");
// for(String p : list){
// System.out.println(p);
// /**
// * 當(dāng)然他也是一個(gè)相對(duì)路徑
// *
// */
// String rp = "/super/" + p;
// /**
// * 這里的布爾類型也不是那個(gè)watcher
// * read其實(shí)原生的API
// *
// */
// String data = zkc.readData(rp);
// /**
// * 最后我打印一下
// *
// */
// System.out.println("節(jié)點(diǎn)為:" + rp + ",內(nèi)容為: " + data);
// }//3. 更新和判斷節(jié)點(diǎn)是否存在/*** 他這個(gè)是原生的API* 基本上沒有原生API的Watcher了* 原先內(nèi)存是c1內(nèi)容* 我現(xiàn)在改成新內(nèi)容* 原生API是需要傳一個(gè)字節(jié)數(shù)組* 但是這里直接是一個(gè)對(duì)象了* */zkc.writeData("/super/c1", "新內(nèi)容");/*** 這里應(yīng)該是新內(nèi)容了* 讀出來(lái)的時(shí)候可以直接轉(zhuǎn)成一個(gè)字符串* 這是他第二個(gè)好處* */System.out.println(zkc.readData("/super/c1").toString());/*** 沒有任何的watcher參數(shù)* 判斷你存不存在* 這里存不存在* 直接給你返回一個(gè)true* 這個(gè)就是一個(gè)zkclient* 你是不是覺得很簡(jiǎn)單* 但是是不是很疑惑* 就是那個(gè)watcher哪去了* 你可以理解為和原生的API分離了* 原生的API是耦合在一起的* 但是zkclient是提供了兩種方式的watcher* */System.out.println(zkc.exists("/super/c1"));//4.遞歸刪除/super內(nèi)容
// zkc.deleteRecursive("/super"); /*** 最后我們釋放連接*/zkc.close();}
}
?
總結(jié)
以上是生活随笔為你收集整理的Zookeeper_zkClientAPI讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper_实际应用讲解
- 下一篇: Zookeeper_zkClientLi