Zookeeper JavaAPI操作(Curator API常用操作)

構建項目

zk版本:3.5.7,引入4.0.0的curator版本,Curator依賴的版本只能比zookeeper依賴的版本高。

Curator簡單介紹

Curator是Netflix公司開源的一套zookeeper客戶端框架,解決了很多Zookeeper客戶端非常底層的細節開發工作,包括連接重連、反復注冊Watcher和NodeExistsException異常等等,現在是Apache的開源項目。
Curator封裝了很多功能(分布式鎖、leader選舉、分布式隊列、共享計數器等等),更加簡單易用

Curator對比zookeeper原生API

  • 原生API的超時重連,需要手動操作,而Curator封裝了很多重連策略,自動重連
  • 原生API不支持遞歸創建節點,Curator可以遞歸創建節點
  • 是對原生API的進一步封裝,功能更多,更容易使用
  • Curator 是Fluent的API風格(依賴于方法鏈、提高代碼的易讀性)

pom文件引入

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>curator-zk</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><!--        curator--><!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.0.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.0</version></dependency><!--        日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>

log4j.properties(resource目錄下)

### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=off, stdout
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH/:mm/:ss}]-%5p %c(line/:%L) %x-%m%n

建立連接

package com.tang.curator;import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.junit.Test;public class CuratorTest {/*** 建立連接*/@Testpublic  void testConnect() {//重試策略ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(3000,10);//第一種創建方式:通過構造器構造CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 60*1000, 15*1000, retryPolicy);//第二種創建方式:通過builder模式鏈式編程client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").sessionTimeoutMs(60*1000).connectionTimeoutMs(15*1000).retryPolicy(retryPolicy).namespace("zkProject").build();//開啟連接client.start();}
}
構造參數意義
connectString連接url,集群用逗號分割 ,127.0.0.1:2181,127.0.0.1:2182
sessionTimeoutMs會話超時時間(建立連接后,會話斷開的重連時間) 單位:毫秒,默認60秒
connectionTimeoutMs連接超時時間 單位:毫秒,默認15秒
retryPolicy重試策略
namespace默認一個根目錄,以后的所有創建都會在此目錄下進行

RetryPolicy相關(重試連接策略)

在這里插入圖片描述
在這里插入圖片描述

ExponentialBackoffRetry?

特點?:采用指數退避算法來實現重試機制。每次重試失敗后,等待時間間隔會逐漸增加,直到達到最大重試次數或者重試成功為止。這種策略適用于需要逐漸延長重試間隔以減少對系統的沖擊,同時確保最終能夠成功連接的場景。
?實現?:ExponentialBackoffRetry實現了RetryPolicy接口,并提供了一些構造方法來設置重試的參數,如最大重試次數、初始等待時間、最大等待時間等?

RetryNTimes?

特點?:簡單地重試N次,不考慮重試之間的時間間隔。這種策略適用于希望快速重試且對重試次數有明確限制的場景。
?實現?:通過指定重試次數N來實例化該策略,當重試次數達到N時停止重試?

RetryOneTime?

特點?:只重試一次,即如果初次嘗試失敗,則進行一次重試,然后停止。這種策略適用于對重試要求不高的場景,或者作為其他策略的補充。
?注意?:雖然這種策略較為簡單,但在某些情況下可能仍然有用,特別是當希望快速失敗而不是無限重試時。

RetryUntilElapsed?

特點?:在指定的總時間內不斷重試,直到成功或時間耗盡。這種策略適用于對時間有明確要求,且希望在這段時間內盡可能多地嘗試連接的場景。
?實現?:需要指定一個最長等待時間,在這段時間內會不斷嘗試重試,直到成功或時間到期?

RetryForever?

特點?:永遠重試,直到成功為止。這種策略適用于對連接成功有極高要求,且不介意無限重試的場景。
?注意?:在實際應用中應謹慎使用此策略,以避免因無限重試而導致的資源耗盡或其他問題?

添加節點

有四種添加節點的方式:

  1. 基本創建:create().forPath()
  2. 創建帶數據的節點:create().forPath(path,value)
  3. 設置節點類型:create().withMode().forPath()
  4. 創建多節點(父節點不存在會報錯,創建時需要調用:creatingParentContainersIfNeeded方法)

節點類型是一個CreateMode的枚舉,有以下四種類型:

節點名稱枚舉解釋
持久節點?Persistent節點創建后,會一直保存在ZooKeeper中,直到被明確刪除
持久順序節點PersistentSequential在創建子節點時,ZooKeeper會自動為節點名稱添加一個數字后綴,以保證子節點的創建順序
臨時節點Ephemeral節點的生命周期與創建它的會話綁定在一起,會話結束后,節點也會被自動刪除
?臨時順序節點?EphemeralSequential與持久順序節點類似,但節點的生命周期是臨時的,與會話綁定
/*** 創建節點*/@Testpublic void create() throws Exception {//1.基本創建//如果創建節點,沒有指定數據,則默認將當前客戶端的ip作為數據存儲client.create().forPath("/test");//2.創建帶數據的節點,如果這里的path還是/test就會報錯client.create().forPath("/test1","test".getBytes());}@Testpublic void testCreate2() throws Exception {// 設置節點類型 (默認:持久化)String path = client.create().withMode(CreateMode.EPHEMERAL) // 設置臨時模式.forPath("/app3");//輸出path為/app3System.out.println(path);}@Testpublic void testCreate3() throws Exception {// 創建多節點String path = client.create().creatingParentContainersIfNeeded() // 父節點不存在,則創建父節點.forPath("/app4/p2");//輸出path為/app4/p2System.out.println(path);}

查詢節點

  1. 查詢數據:client.getData().forPath()
  2. 查詢子節點:client.getChildren().forPath()
  3. 查詢節點信息狀態: client.getData().storingStatIn(stat).forPath()
 /*** 查詢節點* @throws Exception*/@Testpublic void testGet() throws Exception {//1.查詢數據:getbyte[] data = client.getData().forPath("/app1");System.out.println("1.查詢數據:"+new String(data));// 2.查詢子節點:lsList<String> path  = client.getChildren().forPath("/app4");System.out.println("2."+path);//3.查詢節點狀態信息:ls -sStat stat = new Stat();client.getData().storingStatIn(stat).forPath("/app1");System.out.println("3."+stat.toString());}

修改節點

  1. 基本數據修改: client.setData().forPath()
  2. 根據版本修改:client.setData().withVersion().forPath()
    一般使用第二種修改方式,version 是通過查詢出來的,目的是為了讓其他客戶端不干擾我修改(原子性操作)
	/*** 1.基本修改數據:.setData().forPath()* * @throws Exception*/@Testpublic void testSet() throws Exception {client.setData().forPath("/test","MarryChristmas".getBytes());}/***2.根據版本修改*  version 是通過查詢出來的,目的是為了讓其他客戶端不干擾我(原子性操作)* @throws Exception*/@Testpublic void testSetForVersion() throws Exception {int version = 0;Stat stat = new Stat();client.getData().storingStatIn(stat).forPath("/test");version = stat.getVersion();client.setData().withVersion(version).forPath("/test","HappyNewYear".getBytes());}

刪除節點

  1. 刪除單個節點:client.delete().forPath()
  2. 刪除帶有子節點的節點: client.delete().deletingChildrenIfNeeded().forPath()
  3. 必須成功的刪除:為了防止網絡波動,本質就是重試:client.delete().guaranteed().forPath()
  4. 回調:inBackground()
/*** 刪除節點* 1.刪除單個節點* 2.刪除帶有子節點的節點* 3.必須成功的刪除:為了防止網絡抖動,本質就是重試* 4.回掉* @throws Exception*/@Testpublic void testDelete() throws Exception {client.delete().forPath("/test1");client.delete().deletingChildrenIfNeeded().forPath("/app4");client.delete().guaranteed().forPath("/app4");client.delete().guaranteed().inBackground(new BackgroundCallback() {@Overridepublic void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {System.out.println("水逆退散!");}}).forPath("/test");}

完整代碼:

package com.tang.curator;import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.List;public class CuratorTest {private  CuratorFramework client;/*** 建立連接*/@Before//@Before表示在測試方法執行前執行@Testpublic  void testConnect() {//重試策略ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(3000,10);//第一種創建方式:通過構造器構造client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 60*1000, 15*1000, retryPolicy);//第二種創建方式:通過builder模式鏈式編程client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").sessionTimeoutMs(60*1000).connectionTimeoutMs(15*1000).retryPolicy(retryPolicy).namespace("zkProject").build();//開啟連接client.start();}/*** 創建節點*/@Testpublic void create() throws Exception {//1.基本創建//如果創建節點,沒有指定數據,則默認將當前客戶端的ip作為數據存儲client.create().forPath("/test");//2.創建帶數據的節點,如果這里的path還是/test就會報錯client.create().forPath("/test1","test".getBytes());}@Testpublic void testCreate2() throws Exception {// 設置節點類型 (默認:持久化)String path = client.create().withMode(CreateMode.EPHEMERAL) // 設置臨時模式.forPath("/app3");//輸出path為/app3System.out.println(path);}@Testpublic void testCreate3() throws Exception {// 創建多節點String path = client.create().creatingParentContainersIfNeeded() // 父節點不存在,則創建父節點.forPath("/app4/p2");//輸出path為/app4/p2System.out.println(path);}/*** 查詢節點* @throws Exception*/@Testpublic void testGet() throws Exception {//1.查詢數據:getbyte[] data = client.getData().forPath("/app1");System.out.println("1.查詢數據:"+new String(data));// 2.查詢子節點:lsList<String> path  = client.getChildren().forPath("/app4");System.out.println("2."+path);//3.查詢節點狀態信息:ls -sStat stat = new Stat();client.getData().storingStatIn(stat).forPath("/app1");System.out.println("3."+stat.toString());}/*** 1.基本修改數據:.setData().forPath()** @throws Exception*/@Testpublic void testSet() throws Exception {client.setData().forPath("/test","MarryChristmas".getBytes());}/***2.根據版本修改*  version 是通過查詢出來的,目的是為了讓其他客戶端不干擾我(原子性操作)* @throws Exception*/@Testpublic void testSetForVersion() throws Exception {int version = 0;Stat stat = new Stat();client.getData().storingStatIn(stat).forPath("/test");version = stat.getVersion();client.setData().withVersion(version).forPath("/test","HappyNewYear".getBytes());}/*** 刪除節點* 1.刪除單個節點* 2.刪除帶有子節點的節點* 3.必須成功的刪除:為了防止網絡抖動,本質就是重試* 4.回掉* @throws Exception*/@Testpublic void testDelete() throws Exception {client.delete().forPath("/test1");client.delete().deletingChildrenIfNeeded().forPath("/app4");client.delete().guaranteed().forPath("/app4");client.delete().guaranteed().inBackground(new BackgroundCallback() {@Overridepublic void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {System.out.println("水逆退散!");}}).forPath("/test");}@Afterpublic void close() {if (client != null) {client.close();}}
}

參考博客:
https://blog.csdn.net/qq_37774171/article/details/122514318

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64166.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

可搜索的下拉選擇框:filterable屬性詳解

在前端開發中&#xff0c;下拉選擇框&#xff08;Dropdown Select&#xff09;是一個常見的UI組件&#xff0c;它允許用戶從一組預定義的選項中選擇一個或多個值。然而&#xff0c;當選項數量較多時&#xff0c;手動查找特定的選項可能會變得繁瑣。為了解決這個問題&#xff0c…

精選9個自動化任務的Python腳本精選

大家好&#xff0c;我是老鄧&#xff0c;今天我們來一起學習如何用Python進行一些常見的自動化操作&#xff0c;涉及文件處理、網絡交互等實用技巧。即使你沒有任何Python基礎也沒關系&#xff0c;我會用最通俗易懂的語言來講解。 1. 對目錄中的文件進行排序 import osdef so…

滑動窗口 + 算法復習

維護一個滿足條件的窗口大小&#xff0c;然后進行雙指針移動 1.最長子串 題目鏈接&#xff1a;1.最長子串 - 藍橋云課 #include<bits/stdc.h> #define int long long using namespace std; string s; int k; signed main() {int max_len0,left0;cin>>s>>k;…

PDF書籍《手寫調用鏈監控APM系統-Java版》第9章 插件與鏈路的結合:Mysql插件實現

本人閱讀了 Skywalking 的大部分核心代碼&#xff0c;也了解了相關的文獻&#xff0c;對此深有感悟&#xff0c;特此借助巨人的思想自己手動用JAVA語言實現了一個 “調用鏈監控APM” 系統。本書采用邊講解實現原理邊編寫代碼的方式&#xff0c;看本書時一定要跟著敲代碼。 作者…

關于Vue的子組件改變父組件傳來的值

一、組件直接傳值 大家都知道父子組件傳值的方案&#xff0c;有以下幾個&#xff0c;不再詳細敖述 Props&#xff1a;父組件向子組件傳遞數據 $emit&#xff1a;子組件通過自定義事件向父組件傳遞數據 .sync修飾符&#xff1a;一個方便且強大的工具&#xff0c;可以簡化父子組…

Flink的Watermark水位線詳解

一、Flink的時間語義 Flink有如下三種時間語義&#xff1a; Flink的三種時間語義-CSDN博客 在實際應用中&#xff0c;一般會采用事件時間語義。而正如前面所說的&#xff0c;事件時間語義需要等窗口的數據全部到齊了&#xff0c;才能進行窗口計算。那么&#xff0c;什么時候數…

ES學習Promise對象(九)

這里寫目錄標題 一、概念二、示例基本使用使用 Promise 對象封裝Ajaxthen() 方法catch() 方法 一、概念 簡單說就是一個容器&#xff0c;里面保存著某個未來才會結束的事件&#xff08;通常是一個異步操作&#xff09;的結果。Promise 是一個對象&#xff0c;Promise 提供統一…

Kibana:LINUX_X86_64 和 DEB_X86_64兩種可選下載方式的區別

最近需要在vm&#xff08;操作系統是 Ubuntu 22.04.4 LTS&#xff0c;代號 Jammy。這是一個基于 x86_64 架構的 Linux 發行版&#xff09;上安裝一個7.17.8版本的Kibana&#xff0c;并且不采用docker方式。 在下載的時候發現有以下兩個選項&#xff0c;分別是 LINUX_X86_64 和 …

CMake 構建項目并整理頭文件和庫文件

本文將介紹如何使用 CMake 構建項目、編譯生成庫文件&#xff0c;并將頭文件和庫文件整理到統一的目錄中以便在其他項目中使用。 1. 項目結構 假設我們正在構建一個名為 rttr 的開源庫&#xff0c;初始的項目結構如下&#xff1a; D:\WorkCode\Demo\rttr-master\|- src\ …

【FAQ】HarmonyOS SDK 閉源開放能力 — Vision Kit(2)

1.問題描述&#xff1a; 人臉活體檢測返回上一頁App由沉浸式變為非沉浸式多了上下安全區域。 解決方案&#xff1a; 檢測結束后需要自己去設置沉浸式配置。 2.問題描述&#xff1a; Vision Kit文字識別是本地識別&#xff0c;還是上傳至服務器&#xff0c;由服務器來識別文…

AIA - IMSIC之二(附IMSIC處理流程圖)

本文屬于《 RISC-V指令集基礎系列教程》之一,歡迎查看其它文章。 1 ???????通過IMSIC接收外部中斷的CSR 軟件通過《AIA - 新增的CSR》描述的CSR來訪問IMSIC。 machine level 的 CSR 與 IMSIC 的 machine level interrupt file 可相互互動;而 supervisor level 的 CSR…

Vue單頁應用的配置

前面通過幾篇文章了解并掌握了 Vue 項目構建及運行的前期工作 。接下來我們可以走進 Vue 項目的內部&#xff0c;一探其內部配置的基本構成。 1. 路由配置 由于 Vue 這類型的框架都是以一個或多個單頁構成&#xff0c;在單頁內部跳轉并不會重新渲染 HTML 文件&#xff0c;其路…

CocosCreator-引擎案例-TS:spine

工程1&#xff1a;LoadSpine&#xff1a;簡單加載spine資源 建立工程&#xff0c;在層級上建立一個空對象&#xff0c;改名spine 在spine上添加spine組件&#xff1a; 添加組件>渲染組件>spine 在spine上掛上腳本loadspine onLoad () {cc.resources.load(loadSpine/ali…

使用FreeNAS軟件部署ISCSI的SAN架構存儲(IP-SAN)練習題

一&#xff0c;實驗用到工具分別為&#xff1a; VMware虛擬機&#xff0c;安裝教程&#xff1a;VMware Workstation Pro 17 安裝圖文教程 FreeNAS系統&#xff0c;安裝教程&#xff1a;FreeNAS-11.2-U4.1安裝教程2024&#xff08;圖文教程&#xff09; 二&#xff0c;新建虛…

【ANGULAR網站開發】初始環境搭建

1. 初始化angular項目 1.1 創建angular項目 需要安裝npm和nodejs&#xff0c;這邊不在重新安裝 直接安裝最新版本的angular npm install -g angular/cli安裝指定大版本的angular npm install -g angular/cli181.2 啟動angular 使用idea啟動 控制臺啟動 ng serve啟動成功…

lua debug相關方法詳解

lua debug相關方法詳解 1. debug.debug()2. debug.getinfo(func | level [, what])3. debug.getlocal(func-or-level, localindex)4. debug.setlocal(level, local_number, value)5. debug.getupvalue(func, upvalue_index)6. debug.setupvalue(func, upvalue_index, value)7. …

《計算機網絡(第7版)-謝希仁》期末考試復習題和答案(總結整理)

目錄 前言&#xff1a; 一、選擇題。 二、填空題。 三、名詞解釋。 四、簡答題。 前言&#xff1a; 這個自動標題自己帶了序號&#xff0c;一開始想全部選項和題號都改過來的&#xff0c;結果一看一百多個全是&#xff0c;懶得改了 一、選擇題。 1、廣域網覆蓋的地理范圍…

【再談設計模式】享元模式~對象共享的優化妙手

一、引言 在軟件開發過程中&#xff0c;我們常常面臨著創建大量細粒度對象的情況&#xff0c;這可能會導致內存占用過高、性能下降等問題。享元模式&#xff08;Flyweight Pattern&#xff09;就像是一位空間管理大師&#xff0c;它能夠在不影響功能的前提下&#xff0c;有效地…

Milvus×EasyAi:如何用java從零搭建人臉識別應用

如何從零搭建一個人臉識別應用&#xff1f;不妨試試原生Java人工智能算法&#xff1a;EasyAi Milvus 的組合拳。 本文將使用到的軟件和工具包括&#xff1a; EasyAi&#xff1a;人臉特征向量提取Milvus&#xff1a;向量數據庫用于高效存儲和檢索數據。 01. EasyAi&#xff1a;…

NS3學習——tcpVegas算法代碼詳解(2)

NS3學習——tcpVegas算法代碼詳解&#xff08;1&#xff09;-CSDN博客 目錄 4.TcpVegas類中成員函數 (5) CongestionStateSet函數 (6) IncreaseWindow函數 1.檢查是否啟用 Vgas 2.判斷是否完成了一個“Vegas 周期” 2.1--if&#xff1a;判斷RTT樣本數量是否足夠 2.2--e…