java連接zookeeper的3種方式小結(jié)
java連接zookeeper3種方式
1、使用zookeeper原始api
public class Demo { private static String ip = "192.168.0.101:2181"; private static int session_timeout = 40000; private static CountDownLatch latch = new CountDownLatch(1); public static void main(String[] args) throws Exception { ZooKeeper zooKeeper = new ZooKeeper(ip, session_timeout, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState() == Event.KeeperState.SyncConnected) { //確認(rèn)已經(jīng)連接完畢后再進(jìn)行操作 latch.countDown(); System.out.println("已經(jīng)獲得了連接"); } } }); //連接完成之前先等待 latch.await(); ZooKeeper.States states = zooKeeper.getState(); System.out.println(states); } }
打?。?/p>
如果打印出來(lái)的狀態(tài)為 CONNECTED 則表示連接成功
2、使用ZkClient客戶(hù)端連接,這種連接比較簡(jiǎn)單
public class ZkClientTest { private static String ip = "192.168.0.101:2181"; private static int session_timeout = 40000; public static void main(String[] args) { ZkClient zkClient = new ZkClient(ip,session_timeout); System.out.println(zkClient.getChildren("/")); } }
打印:
3、使用curator連接
public class CuratorDemo { //ZooKeeper服務(wù)地址 private static final String SERVER = "192.168.0.101:2181"; //會(huì)話超時(shí)時(shí)間 private static final int SESSION_TIMEOUT = 30000; //連接超時(shí)時(shí)間 private static final int CONNECTION_TIMEOUT = 5000; /** * baseSleepTimeMs:初始的重試等待時(shí)間 * maxRetries:最多重試次數(shù) * * * ExponentialBackoffRetry:重試一定次數(shù),每次重試時(shí)間依次遞增 * RetryNTimes:重試N次 * RetryOneTime:重試一次 * RetryUntilElapsed:重試一定時(shí)間 */ private static final RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); public static void main(String[] args) throws Exception { //創(chuàng)建 CuratorFrameworkImpl實(shí)例 CuratorFramework client = CuratorFrameworkFactory.newClient(SERVER, SESSION_TIMEOUT, CONNECTION_TIMEOUT, retryPolicy); //啟動(dòng) client.start(); System.out.println("連接成功!"); Object o = client.getChildren().forPath("/"); System.out.println(o); } }
打印:
Java集成zookeeper筆記
一、引入zookeeper-3.4.5.jar(原生zk包)
slf4j.jar即可,其他還有zkClient和Curator,其中Curator封裝的zk客戶(hù)端組件最好用。
二、手寫(xiě)ZookeeperBase.java
少?gòu)U話,上代碼:
簡(jiǎn)單的創(chuàng)建連接和增刪改查操作:
public class ZookeeperBase{ //zk集群地址(端口號(hào)為客戶(hù)端端口號(hào)) private static final String CONNECT_ADDR = "192.168.241.127:2181,192.168.241.128:2181,192.168.241.129:2181"; //session 超時(shí)時(shí)間,單位毫秒 private static final int SESSION_OUTTIME = 5000; //用于阻塞程序執(zhí)行,直到zk成功連接后再發(fā)送繼續(xù)執(zhí)行信號(hào),因?yàn)閦k建立連接是異步的,阻塞是防止程序在zk成功連接前被調(diào)用。 private static final CountDownLatch contectedSemaphore = new CountDownLatch (1); public static void main(String[] args)throws Exception{ Zookeeper zk = new Zookeeper(CONNECT_ADDR,SESSION_OUTTIME,new Watcher()){ @override public void process(WatcherEvent event){ //WatcherEvent為觀察者監(jiān)聽(tīng)事件 //獲取事件狀態(tài)(與客戶(hù)端連接狀態(tài)相關(guān)) /* * KeeperState:Disconneced 連接失敗 * KeeperState:SyncConnected 連接成功 * KeeperState:AuthFailed 認(rèn)證失敗 * KeeperState:Expired 會(huì)話過(guò)期 */ KeeperState keeperState = event.getState(); //獲取事件類(lèi)型(與zknode相關(guān)) /* * EventType:NodeCreated 節(jié)點(diǎn)創(chuàng)建 * EventType:NodeDataChanged 節(jié)點(diǎn)的數(shù)據(jù)變更 * EventType:NodeChildrentChanged 子節(jié)點(diǎn)下的數(shù)據(jù)變更 * EventType:NodeDeleted 節(jié)點(diǎn)刪除 * EventType:None 剛連接什么都沒(méi)做 */ EventType eventType = event.getType(); //成功建立連接(固定寫(xiě)法) if(KeeperState.SyncConnected == keeperState){ if(EventType.None == eventType){ //發(fā)送信號(hào)讓程序繼續(xù)執(zhí)行 contectedSemaphore.countDown(); } } } //阻塞程序執(zhí)行 contectedSemaphore.await(); //創(chuàng)建節(jié)點(diǎn) //同步創(chuàng)建 String newNode = zk.create("/testRoot","data".getBytes(),ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); /* *參數(shù)1:節(jié)點(diǎn)路徑:/testRoot,原生api不允許遞歸創(chuàng)建節(jié)點(diǎn),即沒(méi)有父節(jié)點(diǎn)不允許直接連帶父子節(jié)點(diǎn)一起創(chuàng)建。創(chuàng)建節(jié)點(diǎn)是要寫(xiě)全路徑,例如:/testRoot/children。 *參數(shù)2:節(jié)點(diǎn)內(nèi)容:內(nèi)容類(lèi)型為字節(jié)數(shù)組,不支持存儲(chǔ)序列化對(duì)象,例如不支持將java對(duì)象序列化為json存儲(chǔ),但可以使用java序列化框架,如hession或kyso。 *參數(shù)3:權(quán)限控制:在對(duì)權(quán)限要求不嚴(yán)格情況下都使用OPEN_ACL_UNSAFE開(kāi)放權(quán)限即可。 *參數(shù)4:節(jié)點(diǎn)類(lèi)型:提供了四種類(lèi)型。 *PERSISTENT 持久化節(jié)點(diǎn) *PERSISTENT SEQUENTIAL 持久順序節(jié)點(diǎn) *EPHEMERAL 臨時(shí)節(jié)點(diǎn) *EPHEMERAL SEQUENTIAL 臨時(shí)順序節(jié)點(diǎn) */ }; } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring 應(yīng)用上下文獲取 Bean 的常用姿勢(shì)實(shí)例總結(jié)
這篇文章主要介紹了Spring 應(yīng)用上下文獲取 Bean,結(jié)合實(shí)例形式總結(jié)分析了Spring 應(yīng)用上下文獲取 Bean的實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05jdk17+springboot使用webservice的踩坑實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于jdk17+springboot使用webservice踩坑的相關(guān)資料,網(wǎng)上很多教程是基于jdk8的,所以很多在17上面跑不起來(lái),折騰兩天,直接給答案,需要的朋友可以參考下2024-01-01一篇超詳細(xì)的Spring Boot對(duì)jdbc支持的文章
JdbcTemplate 是在JDBC API基礎(chǔ)上提供了更抽象的封裝,并提供了基于方法注解的事務(wù)管理能力。 通過(guò)使用SpringBoot自動(dòng)配置功能并代替我們自動(dòng)配置beans,下面給大家介紹spring boot中使用JdbcTemplate相關(guān)知識(shí),一起看看吧2021-07-07MyBatis-Plus自動(dòng)化填充的踩坑記錄及解決
這篇文章主要介紹了MyBatis-Plus自動(dòng)化填充的踩坑記錄及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持
這篇文章主要介紹了SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08解決spring boot hibernate 懶加載的問(wèn)題
這篇文章主要介紹了解決spring boot hibernate 懶加載的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10解決SpringMvc中普通類(lèi)注入Service為null的問(wèn)題
這篇文章主要介紹了解決SpringMvc中普通類(lèi)注入Service為null的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java之SpringCloud Eurka注冊(cè)錯(cuò)誤解決方案
這篇文章主要介紹了Java之SpringCloud Eurka注冊(cè)錯(cuò)誤解決方案,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07