zookeeperAPI操作與寫數據原理

?

要執行API操作需要在idea中創建maven項目

(改成自己的阿里倉庫)導入特定依賴

添加日志文件

上邊操作做成后就可以進行一些API的實現了

目錄

?導入maven依賴:

創建日志文件:

創建API客戶端:

(1)創建全局變量:

(2)初始化(init):

(3)創建節點(create):

(4)監聽API:

(5)檢測節點是否存在:

寫數據原理:

(1)寫流程之寫入請求直接發送給Leader節點:

(2)寫流程之寫入請求發送給follower節點

?導入maven依賴:

<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version>
</dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.7</version> </dependency> 
</dependencies> 

創建日志文件:

需要在項目的 src/main/resources 目錄下,新建一個文件,命名為“log4j.properties”

log4j.rootLogger=INFO, stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] 
- %m%n 
log4j.appender.logfile=org.apache.log4j.FileAppender 
log4j.appender.logfile.File=target/spring.log 
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] 
- %m%n 

創建API客戶端:

(1)創建全局變量:

  String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";int sessionTimeout=2000;ZooKeeper zkClient=null;
String connectString---要連接那個zookeeper,
int sessionTimeout ---延遲時間
ZooKeeper zkClient ---表示要創建的客戶端  申請為全局變量有助于后邊各方法的調用

(2)初始化(init):

  @Before
public void init() throws Exception {// Watcher watcher ---監聽器zkClient= new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {List<String> children = null;System.out.println("-------------------------------");try {children = zkClient.getChildren("/", true);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}for (String child : children) {System.out.println(child);}}});
}

@Befor注解在此不在解釋不會可看本人前面文章(Java注解篇)

首先初始化了一個zookeeper的客戶端對象

重寫了process方法,這個方法在不使用監聽器的時候可以不寫代碼

在開啟監聽器的時候(可以聽后續監聽器API)

由于監聽器是調用一次只能使用一次,不能實時監聽,所以我們要在初始化方法里添加監聽邏輯(process方法),就會在每次所監聽的數據發生改變的時候調用該方法,我們在創建客戶端對象的時候為該對象設置了監聽器,從而在刪除的時候也會觸發監聽

(3)創建節點(create):

@Test
public void create() throws Exception {//String path,---在那個節點下創建節點// byte[] data, ----節點數據// List<ACL> acl,----權限// CreateMode createMode)----創建節點的類型String nodecreate = zkClient.create("/atguigu","tangxiaocong".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}

(4)監聽API:

@Testpublic void getChildren() throws Exception {//String path----監聽路徑, boolean watch---設置監聽器為true//true注冊一次監聽(記不起來就去看監聽原理)就只能生效一次,所以在init哪里就需要添加注冊List<String> children = zkClient.getChildren("/", true);for (String child : children) {System.out.println(child);}// 延時阻塞--實時監控Thread.sleep(Long.MAX_VALUE);}

(5)檢測節點是否存在:

 @Test//查看節點是否存在public void exists() throws InterruptedException, KeeperException {//關閉監聽Stat exists = zkClient.exists("/atguigu", false);System.out.println(exists==null?"not exist":"exist");}

寫數據原理:

(1)寫流程之寫入請求直接發送給Leader節點:

? ? ? ? 1.客戶端向leader發出寫請求

? ? ? ? 2.leader接收到寫請求會通知靠近它的follower執行寫請求

? ? ? ? 3.follower回應給leader(三臺服務器現在已經有兩臺做出了回應(大于1/2)就會開始進行寫操作,讓后再處理后續服務器---效率高)

? ? ? ? 4.現在得出的回應大于1/2,則leader對客戶端給出回應

? ? ? ? 5.leader會繼續給其他的follower發送寫請求

? ? ? ? 6.follower得到請求給出回應

(2)寫流程之寫入請求發送給follower節點:

? ? ? ? 1. 客戶端向follower發出寫請求

? ? ? ? 2.寫請求轉發從follower需要轉請求給leader(轉請求后于上述操作相似)

? ? ? ? 3.先通知(轉發請求的)follower執行寫請求

? ? ? ? 4.follower對leader的請求做出回應(已經超過半數服務器做出回應,則執行寫操作)

? ? ? ? 5.leader做出回應返回給轉發請求的follower

? ? ? ? 6.該follower返回給客戶端(Client)

? ? ? ? 7.leader通知其他follower執行寫請求

? ? ? ? 8.做出回應后重復5.6步驟

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

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

相關文章

Springboot 實踐(5)springboot添加資源訪問目錄及目錄測試

前文講解了swagger測試服務控制器&#xff0c;實現了數據庫數據訪問&#xff0c;這些功能都是運行在后臺服務器上&#xff0c;實際用戶并不能直接調用接口獲取數據&#xff0c;即使用戶能夠利用接口獲取到數據&#xff0c;數據也是結構化數據&#xff0c;不能爭取轉化成用戶使用…

基于OFDM+64QAM系統的載波同步matlab仿真,輸出誤碼率,星座圖,鑒相器,鎖相環頻率響應以及NCO等

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 2.1 OFDM原理 2.2 64QAM調制 2.3 載波同步 5.算法完整程序工程 1.算法運行效果圖預覽 2.算法運行軟件版本 MATLAB2022a 3.部分核心程序 ............................................…

【從零學習python 】31.深入理解Python中的高階函數和閉包

文章目錄 高階函數定義一個變量指向函數高階函數函數做為另一個函數的參數函數作為另一個函數的返回值 閉包函數嵌套什么是閉包修改外部變量的值原因分析解決方案 進階案例 高階函數 在Python中&#xff0c;函數其實也是一種數據類型。 def test():return hello worldprint(t…

NestJs 中使用 mongoose

在 NestJS 中鏈接 MongoDB 有兩種方法。一種方法就是使用TypeORM來進行連接&#xff0c;另外一種方法就是使用Mongoose。 此筆記主要是記錄使用Mongoose的。所以我們先安裝所需的依賴&#xff1a; npm i nestjs/mongoose mongoose安裝完成后&#xff0c;需要在AppModule中引入…

SpringBoot后端服務開啟Https協議提供訪問(使用阿里云資源)

目錄 概述 申請/下載證書 部署證書 本地測試訪問 服務器部署訪問 最后/擴展 總結 概述 本篇博客說明如何將SpringBoot項目開啟Https協議提供訪問。 博文以步驟【申請/下載證書】&#xff0c;【部署證書】&#xff0c;【本地測試訪問】&#xff0c;【服務器部署訪問】 &a…

SIP/VoIP之常見的視頻問題

除了語音通話外&#xff0c;視頻通話也是SIP協議通話中重要的功能&#xff0c;在實際應用中&#xff0c;經常會遇到一些視頻問題&#xff0c;如下&#xff08;以h264為例&#xff09; 一、 己方未顯示對方視頻圖像 排查方法&#xff1a; 查看網絡抓包中有沒有發給已方的視頻…

LORA開發板采集溫濕度數據,連接PC上位機顯示和液晶屏顯示

一、準備材料 準備以下板子和器件 Lora開發板x2 USB數據線x2 OLED 屏幕x2 StLink下載器x1 母對母杜邦線x3 DHT11 x2 二、設備連接 如圖所示先將OLED 屏幕插入到開發板中 接著按照圖中所示的&#xff0c;將串口一以及lora的撥碼開關撥到指定方向 接著將USB數據線一端插入到…

SQL Server用sql語句添加列,添加列注釋

SQL Server用sql語句添加列&#xff0c;添加列注釋 微軟文檔&#xff1a; https://learn.microsoft.com/zh-cn/sql/relational-databases/tables/add-columns-to-a-table-database-engine?viewsql-server-ver15 alter table article add RedirectURL varchar(600) nu…

(七)Unity VR項目升級至Vision Pro需要做的工作

Vision Pro 概述 定位為混合現實眼鏡&#xff0c;對AR支持更友好 無手柄&#xff0c;支持手&#xff08;手勢&#xff09;、眼&#xff08;注視&#xff09;、語音交互 支持空間音頻&#xff0c;相比立體聲、環繞聲更有沉浸感和空間感 支持VR/AR應用&#xff0c;支持多種應用模…

八字精批API接口

接口平臺&#xff1a;https://api.yuanfenju.com/ 開發文檔&#xff1a;https://doc.yuanfenju.com/ 支持格式&#xff1a;JSON 請求方式&#xff1a;HTTP POST <?php//密鑰 $api_secret "wD******XhOUW******pvr"; //請求網關 $gateway_host_url "ht…

FPGA應用學習筆記-----復位電路(二)和小結

不可復位觸發器若和可復位觸發器混合寫的話&#xff0c;不可復位觸發器是由可復位觸發器饋電的。 不應該出現的復位&#xff0c;因為延時導致了冒險&#xff0c;異步復位存在靜態冒險 附加素隱含項&#xff0c;利用數電方法&#xff0c;消除靜態冒險 這樣多時鐘區域還是算異步的…

【Docker】如何在設計 dockerfile 過程中,設置容器啟動后的定時任務

如何在設計 dockerfile 過程中&#xff0c;設置容器啟動后的定時任務 jwensh 2023.08.14 文章目錄 如何在設計 dockerfile 過程中&#xff0c;設置容器啟動后的定時任務1. 基于 alpine 設計 dockerfile 過程中&#xff0c;設置容器啟動后的定時任務2. 基于 CentOS 設計 Dockerf…

深度學習實戰基礎案例——卷積神經網絡(CNN)基于SqueezeNet的眼疾識別|第1例

文章目錄 前言一、數據準備1.1 數據集介紹1.2 數據集文件結構 二、項目實戰2.1 數據標簽劃分2.2 數據預處理2.3 構建模型2.4 開始訓練2.5 結果可視化 三、數據集個體預測 前言 SqueezeNet是一種輕量且高效的CNN模型&#xff0c;它參數比AlexNet少50倍&#xff0c;但模型性能&a…

Linkedin為什么要退出中國市場?

在迅速發展的時代,職場也在不斷變換,只有不斷地提升專業技能和進行培訓,才能在職場中獲得成功。Linkedin作為一家專注于職業發展的平臺,專業的學習體驗以及熱門技能贏得了人們青睞。然而遺憾的是這個曾經讓人備受青睞的平臺,如今卻在中國市場中黯然落幕,究竟是何種原因讓曾經風…

大數據Flink(六十一):Flink流處理程序流程和項目準備

文章目錄 Flink流處理程序流程和項目準備 一、Flink流處理程序的一般流程

Springboot 設置統一的請求返回格式

現在開發過程中主要采用前后端分離的方式進行開發測試&#xff0c;也就是前端封裝請求&#xff0c;后端提供標準的API接口服務。一般現在json 格式受到開發者們的青睞&#xff0c;學習過程中我們可以設置接口的返回類型&#xff0c;那么怎么做到設置統一的返回格式呢&#xff1…

數據在內存中的存儲(二進制形式存儲)

計算機要處理的信息是多種多樣的&#xff0c;如數字、文字、符號、圖形、音頻、視頻等&#xff0c;這些信息在人們的眼里是不同的。但對于計算機來說&#xff0c;它們在內存中都是一樣的&#xff0c;都是以二進制的形式來表示。 要想學習編程&#xff0c;就必須了解二進制&…

Spark SQL優化:NOT IN子查詢優化解決

背景 有如下的數據查詢場景。 SELECT a,b,c,d,e,f FROM xxx.BBBB WHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} AND predict_type not IN ( SELECT distinct a FROM xxx.AAAAAWHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} ) 分析 通過查看SQL語句的執行計劃基本…

Dubbo基礎學習(筆記一)

目錄 第一章、概念介紹1.1&#xff09;什么是RPC框架1.2&#xff09;什么是分布式系統1.3&#xff09;Dubbo概述1.3&#xff09;Dubbo基本架構 第二章、服務提供者2.1&#xff09;目錄結構和依賴2.2&#xff09;model層2.3&#xff09;service層2.4&#xff09;resources配置文…

ARTS 挑戰打卡的第8天 ---volatile 關鍵字在MCU中的作用,四個實例講解(Tips)

前言 &#xff08;1&#xff09;volatile 關鍵字作為嵌入式面試的常考點&#xff0c;很多人都不是很了解&#xff0c;或者說一知半解。 &#xff08;2&#xff09;可能有些人會說了&#xff0c;volatile 關鍵字不就是防止編譯器優化的嗎&#xff1f;有啥好詳細講解的&#xff1…