JAVA:使用 Curator 進行 ZooKeeper 操作的技術指南

1、簡述

Apache Curator 是一個基于 ZooKeeper 的 Java 客戶端庫,它極大地簡化了使用 ZooKeeper 的開發工作。Curator 提供了高層次的 API,封裝了很多復雜的 ZooKeeper 操作,例如連接管理、分布式鎖、Leader 選舉等。

在分布式系統中,ZooKeeper 通常被用來作為協調服務,而 Curator 則為我們提供了更簡潔易用的接口,減少了開發的復雜性。本文將介紹 Curator 的核心功能及實踐樣例。

在這里插入圖片描述


2、核心功能

Apache Curator是一個比較完善的ZooKeeper客戶端框架,通過封裝的一套高級API 簡化了ZooKeeper的操作。Curator主要解決了三類問題:

  • 封裝ZooKeeper client與ZooKeeper server之間的連接處理
  • 提供了一套Fluent風格的操作API
  • 提供ZooKeeper各種應用場景(recipe, 比如:分布式鎖服務、集群領導選舉、共享計數器、緩存機制、分布式隊列等)的抽象封裝

Curator 提供了以下核心組件:

2.1 CuratorFramework

CuratorFramework 是 Curator 的核心類,用于與 ZooKeeper 服務交互。

2.2 Recipes

Curator 提供了多種常見分布式模式的實現,包括:

  • 分布式鎖 (InterProcessMutex)
  • 分布式隊列 (DistributedQueue)
  • Leader 選舉 (LeaderSelector)
  • 節點緩存 (NodeCache)
  • 路徑緩存 (PathChildrenCache)
  • 樹緩存 (TreeCache)

3、示例實踐

Curator中提供了Zookeeper各種應用場景(Recipe,如共享鎖服務、Master選舉機制和分布式計算器等)的抽象封裝。

3.1 依賴引入

在使用 Curator 前,需要在項目中引入相關的依賴:

<!-- zookeeper支持 -->
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.6.4</version>
</dependency>
<!-- curator-recipes -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.5.0</version>
</dependency>
<!-- curator-framework -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.5.0</version>
</dependency>

3.2 初始化 CuratorFramework

以下代碼展示了如何初始化 CuratorFramework:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;public class CuratorExample {public static void main(String[] args) {// 創建 CuratorFramework 實例CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") // ZooKeeper 地址.sessionTimeoutMs(5000).connectionTimeoutMs(3000).retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();// 啟動客戶端client.start();System.out.println("CuratorFramework 已啟動");// 關閉客戶端client.close();}
}

3.3 分布式鎖

分布式鎖是分布式系統中的一個重要功能,用于協調多進程/線程間的訪問。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;import java.util.concurrent.TimeUnit;public class DistributedLockExample {public static void main(String[] args) throws Exception {// 初始化 CuratorFrameworkCuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();client.start();// 創建分布式鎖InterProcessMutex lock = new InterProcessMutex(client, "/distributed-lock");// 嘗試獲取鎖if (lock.acquire(10, TimeUnit.SECONDS)) {try {System.out.println("成功獲取鎖,執行任務...");Thread.sleep(5000); // 模擬任務} finally {lock.release();System.out.println("鎖已釋放");}} else {System.out.println("未能獲取鎖");}client.close();}
}

3.4 Leader 選舉

Curator 的 LeaderSelector 提供了簡單易用的 Leader 選舉功能。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.framework.recipes.leader.LeaderSelector;
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;public class LeaderElectionExample {public static void main(String[] args) throws InterruptedException {CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();client.start();// 創建 LeaderSelectorLeaderSelector leaderSelector = new LeaderSelector(client, "/leader-election", new LeaderSelectorListenerAdapter() {@Overridepublic void takeLeadership(CuratorFramework client) throws Exception {System.out.println("成為 Leader,執行任務...");Thread.sleep(3000); // 模擬任務System.out.println("任務完成,釋放 Leader 權限");}});leaderSelector.autoRequeue(); // 自動重新排隊參與選舉leaderSelector.start();Thread.sleep(Integer.MAX_VALUE); // 保持主線程運行client.close();}
}

3.5 節點緩存

NodeCache 用于監聽特定節點的數據變更。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;public class NodeCacheExample {public static void main(String[] args) throws Exception {CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();client.start();// 創建 NodeCacheNodeCache nodeCache = new NodeCache(client, "/test-node");nodeCache.getListenable().addListener(() -> {System.out.println("節點數據變更,新的數據為:" + new String(nodeCache.getCurrentData().getData()));});nodeCache.start();// 創建節點并修改數據client.create().orSetData().forPath("/test-node", "initial-data".getBytes());Thread.sleep(1000);client.setData().forPath("/test-node", "updated-data".getBytes());Thread.sleep(5000); // 保持運行觀察結果client.close();}
}

4、總結

Curator 提供了強大的 ZooKeeper 封裝功能,極大地簡化了開發流程。在分布式系統中,通過 Curator 可以實現諸如分布式鎖、Leader 選舉和節點監聽等功能,幫助開發者快速構建穩定的分布式服務。

本文通過示例展示了常見的使用場景,希望能夠幫助您更好地理解和使用 Curator。如果有任何問題或建議,歡迎留言討論!

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

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

相關文章

Julia語言的測試覆蓋率

Julia語言的測試覆蓋率探討 引言 在現代軟件開發中&#xff0c;測試是確保軟件質量的重要環節。隨著軟件的復雜度不斷增加&#xff0c;測試覆蓋率作為衡量測試質量的一個重要指標&#xff0c;受到了越來越多開發者的關注。Julia語言作為一種高性能的動態編程語言&#xff0c;…

【萬字總結】前端全方位性能優化指南(八)——Webpack 6調優、模塊聯邦升級、Tree Shaking突破

構建工具深度優化——從機械配置到智能工程革命 當Webpack配置項突破2000行、Node進程內存耗盡告警時,傳統構建優化已觸及工具鏈的物理極限:Babel轉譯耗時占比超60%、跨項目模塊復用催生冗余構建、Tree Shaking誤刪關鍵代碼引發線上事故……構建流程正從「工程問題」演變為「…

使用MCP服務器實現AI任務完成通知:讓Cursor更智能

0. 簡介 在使用AI工具進行長時間任務時&#xff0c;常常需要等待結果。MCP&#xff08;Model Context Protocol&#xff09;服務器"mcp_server_notify"提供了一個優雅的解決方案&#xff0c;讓AI在完成任務后通過系統通知提醒你。本文將介紹如何在Cursor中配置和使用…

Java面試黃金寶典33

1. 什么是存取控制、 觸發器、 存儲過程 、 游標 存取控制 定義&#xff1a;存取控制是數據庫管理系統&#xff08;DBMS&#xff09;為保障數據安全性與完整性&#xff0c;對不同用戶訪問數據庫對象&#xff08;如表、視圖等&#xff09;的權限加以管理的機制。它借助定義用戶…

DataX實戰教程

需求&#xff1a; 用datax同步mysql&#xff1a; 192.168.236.134中test1庫的user表到192.168.236.136中test1庫的user表 步驟&#xff1a; 下載安裝包 https://github.com/alibaba/DataX/blob/master/userGuid.md 進入引導頁 https://github.com/alibaba/DataX/blob/ma…

C#/.NET/.NET Core技術前沿周刊 | 第 32 期(2025年3.24-3.31)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

c++基礎-----c++ 成員變量初始化順序

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 在C中&#xff0c;類的成員變量初始化的順序是由它們在類中聲明的順序決定的&#xff0c;而不是由它們在構造函數初始化列表中的順序決定的。這意味著無論你在構造函數初始化列表中如何…

Pascal語言的貪心算法

貪心算法與Pascal語言 引言 在算法設計與分析中&#xff0c;貪心算法是一類重要的算法策略。它以一種直接而高效的方式解決問題&#xff0c;尤其適合那些可以通過局部最優解推導出全局最優解的問題。在本文中&#xff0c;我們將探討貪心算法的基本概念、工作原理及其在Pascal…

Sensodrive力控關節模組SensoJoint:TüV安全認證助力機器人開發

在機器人技術領域&#xff0c;安全性和開發效率是行業關注的重點。SensoDrive的SensoJoint 機器人力控關節模組&#xff0c;憑借其可靠的安全性能和高效的開發優勢&#xff0c;正在為機器人開發提供有力支持。 2025年3月31日&#xff0c;SensoDrive的 SensoJoint 力控關節模組獲…

自動駕駛04:點云預處理03

點云組幀 感知算法人員在完成點云的運動畸變補償后&#xff0c;會發現一個問題&#xff1a;激光雷達發送的點云數據包中的點云數量其實非常少&#xff0c;完全無法用來進行后續感知和定位層面的處理工作。 此時&#xff0c;感知算法人員就需要對這些數據包進行點云組幀的處理…

棧回溯和離線斷點

棧回溯和離線斷點 棧回溯&#xff08;Stack Backtrace&#xff09; 棧回溯是一種重建函數調用鏈的技術&#xff0c;對于分析棧溢出的根本原因非常有價值。 實現方式 // 簡單的棧回溯實現示例&#xff08;ARM Cortex-M架構&#xff09; void stack_backtrace(void) {uint32_…

Vue3學習二

認識組件的嵌套 還可以將Main中內容再劃分 scoped防止組件與組件之間的樣式相互污染 組件的通信 父子組件之間通信的方式 父組件傳遞給子組件 給傳過來的內容做限制 type為傳的內容的屬性類型&#xff0c;required為true表示該內容是必須傳的&#xff0c;default為&#xff0c…

配置文件 yaml

文章目錄 一、yaml簡介二、YAML 文件基本語法1.縮進2.鍵值對3.注釋4.支持多種數據類型5.示例 YML 文件 三、YAML 文件的基本元素&#xff1a;純量、對象、數組1.純量(scalars)(1)布爾值(Booleans)(2)Null 值 2.對象(Object) / 映射(Mapping) / 字典(Dictionaries) / 鍵值對(Key…

antvX6自定義 HTML 節點創建與更新教程

自定義 HTML 節點創建與更新教程 本文詳細介紹如何利用 HTML、CSS 和 JavaScript 創建自定義節點&#xff0c;并通過動態更新節點數據來改變節點顯示效果。無論你是否有前端基礎&#xff0c;都能輕松跟著本教程一步步實現。 1. 基礎樣式設置 首先&#xff0c;使用 CSS 定義基…

前端開發工廠模式的優缺點是什么?

一、什么是工廠模式&#xff1f; 工廠模式屬于創建型設計模式&#xff0c;核心思想是將對象的實例化過程封裝到特定方法或類中&#xff0c;讓客戶端不需要直接通過new關鍵字創建對象。 舉個例子&#xff1a;就像奶茶店不需要顧客自己調配飲品&#xff0c;而是通過"點單-…

Element-plus彈出框popover,使用自定義的圖標選擇組件

自定義的圖標選擇組件是若依的項目的 1. 若依的圖標選擇組件 js文件&#xff0c;引入所有的svg圖片 let icons [] // 注意這里的路徑&#xff0c;一定要是自己svg圖片的路徑 const modules import.meta.glob(./../../assets/icons/svg/*.svg); for (const path in modules)…

openmv用了4個了,燒了2個,質量堪憂啊

都是原裝貨&#xff0c;主板出現過存儲不完全、圖像存不上、主板代碼保存亂碼、意外出現亂碼的現象。 希望要用的童鞋謹慎使用。

基于DrissionPage的Taptap熱門游戲數據爬蟲實戰:從Requests到現代爬蟲框架的遷移指南(含完整代碼復制)

目錄 ?編輯 一、項目重構背景與技術選型 1.1 原代碼問題分析 1.2 DrissionPage框架優勢 二、環境配置與基礎改造 2.1 依賴庫安裝 2.2 基礎類改造 三、核心功能模塊重構 3.1 請求參數自動化生成 3.2 智能頁面渲染 3.3 數據解析優化 四、數據庫操作增強 4.1 批量插入…

解析K8S四層網絡設計

模仿七層網絡模型&#xff0c;抽象出四層模型 POD網絡 同一節點上的pod網絡 依賴于虛擬網橋/網卡&#xff08;linux虛擬設備&#xff09;pod內容器共享網絡棧&#xff08;pause容器創建&#xff09; 不同節點上的pod網絡 路由方案&#xff1a;依賴于底層網絡設備&#x…

FPGA實現數碼管顯示分秒時間

目錄 一. verilog實現 二. 燒錄驗證 三. 結果驗證 使用開發板&#xff1a;DE2-115開發板 一. verilog實現 要實現分和秒&#xff0c;需要知道定時器的頻率&#xff0c;通過查手冊可知&#xff0c;我使用的開發板時鐘為50hz&#xff0c;也就是時鐘一個周期是2微秒。 5000000…