Curator分布式鎖

Curator 是一個用于 Apache ZooKeeper 的客戶端庫,提供了更高級的抽象和工具,以簡化 ZooKeeper 的使用。Curator 是由 Netflix 開發的,并已成為分布式應用程序中使用 ZooKeeper 的事實標準。它解決了原生 ZooKeeper API 使用復雜、易出錯的問題,通過提供易于使用的高級 API 和實用工具,顯著提高了開發效率和代碼質量。

Curator的核心組件

  1. CuratorFramework

    • 這是 Curator 提供的主要接口,所有與 ZooKeeper 的交互都通過這個接口進行。它封裝了 ZooKeeper 的底層 API,并提供了更高層次的操作,如創建、刪除、更新和讀取節點,處理連接狀態變化等。
  2. Recipes

    • Curator 提供了一組實現常見分布式模式的庫,稱為“recipes”(配方),這些配方包括 Leader Election(領導選舉)、Distributed Lock(分布式鎖)、Barrier(屏障)等。這些配方封裝了復雜的 ZooKeeper 操作,使得在分布式應用中實現這些模式變得更加簡單和可靠。
  3. Framework Recipes

    • 這些是 Curator 提供的高級特性,包括緩存(Node Cache、Path Cache、Tree Cache)、事務(Transaction)、異步操作(Asynchronous Operations)等,進一步簡化了分布式應用開發。

Curator的主要特性

  1. 連接管理

    • Curator 提供了更可靠的連接管理機制,包括自動重試、連接狀態監聽等,確保與 ZooKeeper 的連接保持穩定。
  2. 簡化的 API

    • Curator 提供了一組易于使用的 API,簡化了與 ZooKeeper 的交互,減少了編碼量和錯誤率。
  3. 高級工具

    • Curator 提供了一些高級工具,如 PathChildrenCache、NodeCache、TreeCache,用于監聽 ZooKeeper 中節點的數據變化和節點的增刪改查操作。
  4. 事務支持

    • Curator 支持多操作事務,允許在一次調用中執行多個操作,這在需要原子性操作的場景中非常有用。
  5. 異步操作

    • Curator 支持異步操作,可以在不阻塞當前線程的情況下執行 ZooKeeper 操作,提高了應用的性能和響應速度。

示例代碼

以下是一個使用 Curator 實現簡單分布式鎖的示例:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;public class CuratorExample {public static void main(String[] args) {// 創建 CuratorFramework 實例CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181",new ExponentialBackoffRetry(1000, 3));client.start();// 創建分布式鎖InterProcessMutex lock = new InterProcessMutex(client, "/my/lock/path");try {// 獲取鎖lock.acquire();System.out.println("Lock acquired!");// 執行需要同步的操作// ...} catch (Exception e) {e.printStackTrace();} finally {try {// 釋放鎖lock.release();System.out.println("Lock released!");} catch (Exception e) {e.printStackTrace();}}// 關閉客戶端client.close();}
}

使用 Curator 的優勢

  1. 減少開發復雜度

    • Curator 提供的高級 API 和工具,使得使用 ZooKeeper 變得更加簡單和高效,減少了開發人員的工作量和出錯概率。
  2. 提高代碼的可靠性

    • Curator 的自動重試、連接管理等機制,增強了與 ZooKeeper 交互的穩定性和可靠性。
  3. 豐富的功能

    • Curator 提供了多種分布式模式的實現,滿足了分布式系統開發中的各種需求,使得開發分布式應用更加方便和快捷。
  4. 社區支持

    • 作為一個廣泛使用的開源項目,Curator 有活躍的社區支持和豐富的文檔資源,可以幫助開發人員快速上手并解決問題。

總結來說,Curator 是一個功能強大且易于使用的 ZooKeeper 客戶端庫,通過提供高級抽象和工具,顯著簡化了分布式應用的開發,提高了系統的穩定性和可靠性。

在 Spring Boot 中集成 Curator

1. 添加依賴

pom.xml 中添加 Curator 和 ZooKeeper 的 Maven 依賴:

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.3.0</version>
</dependency>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.3.0</version>
</dependency>

2. 配置 ZooKeeper 連接信息

application.propertiesapplication.yml 中配置 ZooKeeper 服務器的連接信息:

zookeeper.connectString=localhost:2181
zookeeper.sessionTimeout=60000
zookeeper.connectionTimeout=15000
zookeeper.retryBaseSleepTime=1000
zookeeper.retryMaxRetries=3

3. 創建 CuratorFramework 配置類

創建一個 Spring 配置類,用于初始化 CuratorFramework 客戶端:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class CuratorConfig {@Value("${zookeeper.connectString}")private String connectString;@Value("${zookeeper.sessionTimeout}")private int sessionTimeout;@Value("${zookeeper.connectionTimeout}")private int connectionTimeout;@Value("${zookeeper.retryBaseSleepTime}")private int retryBaseSleepTime;@Value("${zookeeper.retryMaxRetries}")private int retryMaxRetries;@Beanpublic CuratorFramework curatorFramework() {CuratorFramework client = CuratorFrameworkFactory.newClient(connectString,sessionTimeout,connectionTimeout,new ExponentialBackoffRetry(retryBaseSleepTime, retryMaxRetries));client.start();return client;}
}

4. 使用 CuratorFramework

在需要使用 ZooKeeper 的地方,注入 CuratorFramework 并使用:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ZooKeeperController {@Autowiredprivate CuratorFramework curatorFramework;private InterProcessMutex lock;public ZooKeeperController() {this.lock = new InterProcessMutex(curatorFramework, "/my/lock/path");}@GetMapping("/lock")public String acquireLock() {try {lock.acquire();// 執行需要同步的操作return "Lock acquired!";} catch (Exception e) {e.printStackTrace();return "Failed to acquire lock!";} finally {try {lock.release();} catch (Exception e) {e.printStackTrace();}}}
}

5. 使用 Spring Boot 應用配置文件

application.yml 中配置 ZooKeeper 連接參數:

zookeeper:connectString: localhost:2181sessionTimeout: 60000connectionTimeout: 15000retryBaseSleepTime: 1000retryMaxRetries: 3

通過上述步驟,您可以在 Spring Boot 項目中集成 Curator,并使用它來與 ZooKeeper 進行交互。Curator 提供了許多高級功能,如分布式鎖、領導選舉等,可以幫助您簡化分布式系統的開發。

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

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

相關文章

node js安裝、配置(Windows版)

目錄 node js 安裝 node js 全局配置 1、全局安裝路徑 2、全局緩存路徑 3、修改環境變量 pnpm安裝、卸載 全局安裝pnpm 驗證pnpm版本 卸載pnpm 1、移除全局安裝的包 2、移除pnpm cli 腳本直接安裝 npm安裝的使用命令直接卸載 node js 安裝 cmd 查看是否存在&…

容器docker 架構命令案例

文章目錄 前言一、docker1.1 為什么有docker1.2 docker架構1.3 docker 安裝1.4 docker中央倉庫1.5 docker 基本指令1.6 docker數據卷&#xff0c;掛載例&#xff1a;nginx 數據卷掛載例&#xff1a;mysql 本地持久化 1.7 鏡像制作鏡像結構dockerfile基礎指令容器生成鏡像 1.8 d…

宿主機訪問docker容器中的mysql被拒絕

問題&#xff1a; 解決方案&#xff1a; 1.進入docker中的mysql容器 docker exec -it 容器名稱/id /bin/bash 2.登錄用戶 mysql -u root -p 3.進去mysql自帶的管理數據庫mysql use mysql; 4.查詢用戶的訪問權限 SELECT user, host FROM user WHERE userroot;5.發現該用…

繪畫平臺小程序的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;學生管理&#xff0c;講師管理&#xff0c;課程類型管理&#xff0c;課程信息管理&#xff0c;課程購買管理&#xff0c;作業類型管理 開發系統&#xff1a;Windows 架構模式&#xff1a;SSM JDK版本&…

AURORA仿真

AURORA 仿真驗證 定義&#xff1a;AURORA是一種高速串行通信協議&#xff0c;通常用于在數字信號處理系統和其他電子設備之間傳輸數據。它提供了一種高效的方式來傳輸大量數據&#xff0c;通常用于需要高帶寬和低延遲的應用中。AURORA協議通常由Xilinx公司的FPGA器件支持&#…

golang 項目打包部署環境變量設置

最近將 golang 項目打包部署在不同環境&#xff0c;總結一下自己的心得體會&#xff0c;供大家參考。 1、首先要明確自己目標服務器的系統類型(例如 windows 或者Linux) &#xff0c;如果是Linux 還需要注意目標服務器的CPU架構(amd或者arm) 目標服務器的CPU架構可執行命令&…

對Mapper.xml文件進行深入的學習

1. 前言 既上次在Mapper.xml文件出現bug之后&#xff0c;痛改前非&#xff0c;決定吃透Mapper.xml映射文件。 讓我們通過具體的代碼段來進一步理解 MyBatis 的 Mapper XML 文件中的每個組成部分。 <?xml version"1.0" encoding"UTF-8"?> <!…

python 爬取當當網圖書榜

首先查看當當網好評書單頁面&#xff0c;找到翻頁的URL參數 直接用requests請求頁面 resp requests.get(url) 找到想要的信息&#xff0c;使用正則表達式把這些信息提取出來 patternre.compile(list_num.*?(\d).<.*?<img src"(.*?)".*?title"(.*?…

Eel入門還有一些案例

Eel入門還有一些案例 Eel 是一個 Python 庫&#xff0c;它允許 Python 程序通過簡單的 API 與網頁進行交互。它使用 WebSocket 協議來實現 Python 后端和 JavaScript 前端之間的實時通信。下面是關于 Eel 的用法、通信原理和使用場景的一篇博客文章。 Eel的基本原理 Eel的基本原…

針對vue3的render函數添加自定義指令

話不多說 直接上代碼 主要是給h函數設置自定義指令控制 import /styles/reset.css import /styles/global.scss import uno.cssimport { createApp } from vue import App from ./App.vue import { setupRouter } from ./router import { setupStore } from ./store import …

Android studio之編譯提示Could not find :umeng-asms-v1.2.1

1 、問題 Could not determine the dependencies of task :app:compileDebugJavaWithJavac. > Could not resolve all task dependencies for configuration :app:debugCompileClasspath.> Could not find :umeng-asms-v1.2.1:.Required by:project :app> Could not …

FGF14:腦部疾病新潛力靶標

成纖維細胞生長因子14&#xff08;FGF14&#xff09;是FGF11亞家族成員&#xff0c;在神經元的所有基本特性&#xff08;內在放電、興奮性和抑制性神經元的突觸傳遞和可塑性&#xff09;中發揮作用。 &#xff08;數據來源AlphaFold&#xff09; FGF14由247個氨基酸組成&#x…

實戰篇(九):解鎖3D魔方的秘密:用Processing編程實現交互式魔方

解鎖3D魔方的秘密:用Processing編程實現交互式魔方 使用 Processing 創建一個 3D 魔方效果展示1. 安裝 Processing2. 項目結構3. 代碼實現4. 代碼解釋4.1. 初始化魔方4.2. 繪制魔方4.3. 處理鼠標事件4.4. 檢查點擊的面4.5. 旋轉面和最終確定旋轉5. 運行和測試6. 細節解釋6.1. …

【資源調度】2-如何解決資源調度問題?

導讀&#xff1a;本期是全網最全【資源調度】系列推文的第2期(共50期左右)。上期我們在《何為調度&#xff1f;》中&#xff0c;對調度的定義與作用、計劃與調度的關系、調度問題的拆解做了詳細介紹。從本期開始&#xff0c;我們選擇【客服調度】場景作為【資源調度】問題的具象…

51單片機(STC8H8K64U/STC8051U34K64)_RA8889_8080參考代碼(v1.3)

硬件&#xff1a;STC8H8K64U/STC8051U34K64 RA8889開發板 硬件跳線變更為并口8080模式&#xff0c;PS00x&#xff0c;R143&#xff0c;R142不接&#xff0c;R141無關 8080接口電路連接圖&#xff1a; 實物連接圖&#xff1a; RA8889開發板外接MCU連接器之引腳定義&…

IMS架構中的注冊與會話流程:RTPEngine集成及消息路由詳解

目錄 S-CSCF 調用 RTPengine 整體路由 注意 IMS 注冊流程 和 IMS 會話流程 的區別 IMS注冊流程 IMS會話流程(如INVITE請求) 這種設計的原因 P-CSCF 調用 RTPengine S-CSCF 調用 RTPengine 整體路由 UA a生成SDP offer&#xff0c;發送SIP INVITE請求(包含SDP offer)&…

核密度估計KDE和概率密度函數PDF(深入淺出)

目錄 1. 和密度估計&#xff08;KDE&#xff09;核密度估計的基本原理核密度估計的公式核密度估計的應用Python中的KDE實現示例代碼 結果解釋解釋結果 總結 2. 概率密度函數&#xff08;PDF&#xff09;概率密度函數&#xff08;PDF&#xff09;是怎么工作的&#xff1a;用圖畫…

RDNet實戰:使用RDNet實現圖像分類任務(二)

文章目錄 訓練部分導入項目使用的庫設置隨機因子設置全局參數圖像預處理與增強讀取數據設置Loss設置模型設置優化器和學習率調整策略設置混合精度&#xff0c;DP多卡&#xff0c;EMA定義訓練和驗證函數訓練函數驗證函數調用訓練和驗證方法 運行以及結果查看測試完整的代碼 在上…

ubuntu顯卡驅動重啟后失效的解決辦法

寫在前方&#xff1a;ubuntu系統&#xff0c;顯卡重啟后驅動失效&#xff0c;顯卡不可用。網上沖浪之后得以有效解決&#xff0c;以下是解決方案 查看顯卡nvidia-smi&#xff1b;驅動失效消息&#xff1a; (base) rootnode:~# nvidia-smi NVIDIA-SMI has failed because it c…

AI大模型走進汽車車機,智駕將是未來

車機里的AI大模型在汽車行業中的應用越來越廣泛&#xff0c;主要體現在智能座艙和自動駕駛系統的深度融合上。通過將AI大模型應用于車機系統&#xff0c;可以實現更高智能化的人車交互體驗。AI大模型作為人工智能發展的核心引擎&#xff0c;正在成為汽車智能化發展的關鍵之一。…