Docker安裝java-Zookeeper進行操作

Docker安裝Zookeeper
下載Zookeeper鏡像

docker pull zookeeper

啟動容器并添加映射

docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d zookeeper:latest

查看容器是否啟動

docker ps

?

idea提供了一個Zookeeper插件,以供連接Zookeeper服務中心和查看內容

打開idea –》 Settings -》Plugins,搜索Zoo進行下載安裝

?

配置Zookeeper的連接信息

https://img-blog.csdn.net/20180702163121669?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI2NjQxNzgx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70
ZooKeeper常用客戶端
zookeeper的常用客戶端有3種,分別是:zookeeper原生的、Apache Curator、開源的zkclient,下面分別對介紹它們:
zookeeper自帶的客戶端是官方提供的,比較底層、使用起來寫代碼麻煩、不夠直接。
Apache Curator是Apache的開源項目,封裝了zookeeper自帶的客戶端,使用相對簡便,易于使用。
zkclient是另一個開源的ZooKeeper客戶端。

三個客戶端的Maven坐標

?

<dependencies>
<!-- 原生zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency><!--Apache Curator-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.9.0</version>
</dependency><!-- zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency><dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency></dependencies>

?

三種ZooKeeper客戶端比較
由于Apache Curator是其中比較完美的ZooKeeper客戶端,所以主要介紹Curator的特性來進行比較!

Curator幾個組成部分

Client: 是ZooKeeper客戶端的一個替代品, 提供了一些底層處理和相關的工具方法
Framework: 用來簡化ZooKeeper高級功能的使用, 并增加了一些新的功能, 比如管理到ZooKeeper集群的連接, 重試處理
Recipes: 實現了通用ZooKeeper的recipe, 該組件建立在Framework的基礎之上
Utilities:各種ZooKeeper的工具類
Errors: 異常處理, 連接, 恢復等
Extensions: recipe擴展
Curator主要解決了三類問題

封裝ZooKeeper client與ZooKeeper server之間的連接處理
提供了一套Fluent風格的操作API
提供ZooKeeper各種應用場景(recipe, 比如共享鎖服務, 集群領導選舉機制)的抽象封裝
Curator列舉的ZooKeeper使用過程中的幾個問題

初始化連接的問題:
在client與server之間握手建立連接的過程中,如果握手失敗,執行所有的同步方法(比如create,getData等)將拋出異常
自動恢復(failover)的問題: 當client與一臺server的連接丟失,并試圖去連接另外一臺server時,
client將回到初始連接模式
session過期的問題: 在極端情況下,出現ZooKeeper
session過期,客戶端需要自己去監聽該狀態并重新創建ZooKeeper實例
對可恢復異常的處理:當在server端創建一個有序ZNode,而在將節點名返回給客戶端時崩潰,此時client端拋出可恢復的異常,用戶需要自己捕獲這些異常并進行重試
使用場景的問題:Zookeeper提供了一些標準的使用場景支持,但是ZooKeeper對這些功能的使用說明文檔很少,而且很容易用錯.在一些極端場景下如何處理,zk并沒有給出詳細的文檔說明.比如共享鎖服務,當服務器端創建臨時順序節點成功,但是在客戶端接收到節點名之前掛掉了,如果不能很好的處理這種情況,將導致死鎖
Curator主要從以下幾個方面降低了zk使用的復雜性

重試機制:提供可插拔的重試機制, 它將給捕獲所有可恢復的異常配置一個重試策略,并且內部也提供了幾種標準的重試策略(比如指數補償)
連接狀態監控: Curator初始化之后會一直的對zk連接進行監聽, 一旦發現連接狀態發生變化, 將作出相應的處理
zk客戶端實例管理:Curator對zk客戶端到server集群連接進行管理.并在需要的情況, 重建zk實例,保證與zk集群的可靠連接
各種使用場景支持:Curator實現zk支持的大部分使用場景支持(甚至包括zk自身不支持的場景),這些實現都遵循了zk的最佳實踐,并考慮了各種極端情況
Curator聲稱的一些亮點

日志工具
內部采用SLF4J 來輸出日志 采用驅動器(driver)機制, 允許擴展和定制日志和跟蹤處理,
提供了一個TracerDriver接口, 通過實現addTrace()和addCount()接口來集成用戶自己的跟蹤框架
和Curator相比, 另一個ZooKeeper客戶端——zkClient的不足之處
文檔幾乎沒有異常處理弱爆了(簡單的拋出RuntimeException) 重試處理太難用了 沒有提供各種使用場景的實現
對ZooKeeper自帶客戶端(ZooKeeper類)的”抱怨” 只是一個底層實現 要用需要自己寫大量的代碼 很容易誤用
需要自己處理連接丟失, 重試等
測試代碼:

public class CuratorTest {
public static void main(String[] args) throws Exception{
CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.0.183:2181", new RetryNTimes(10, 5000));
client.start();// 連接
// 獲取子節點,順便監控子節點
List<String> children = client.getChildren().usingWatcher(new CuratorWatcher() {
public void process(WatchedEvent event) throws Exception
{
System.out.println("監控: " + event);
}
}).forPath("/");
System.out.println(children);
// 創建節點
String result = client.create().withMode(CreateMode.PERSISTENT).withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE).forPath("/test", "Data".getBytes());
System.out.println(result);
// 設置節點數據
client.setData().forPath("/test", "111".getBytes());
client.setData().forPath("/test", "222".getBytes());
// 刪除節點
//System.out.println(client.checkExists().forPath("/test"));
/*client.delete().withVersion(-1).forPath("/test");
System.out.println(client.checkExists().forPath("/test"));*/
client.close();
System.out.println("OK!");
}
}

?


ZooKeeper自帶客戶端(原生zookeeper)
ZooKeeper自帶客戶端的主要類是ZooKeeper類,ZooKeeper類對象除了需要ZooKeeper服務端連接字符串(IP地址:端口),還必須提供一個Watcher對象。Watcher是一個接口,當服務器節點花發生變化就會以事件的形式通知Watcher對象。所以Watcher常用來監聽節點,當節點發生變化時客戶端就會知道。\

ZooKeeper類還有對節點進行增刪改的操作方法,主要方法如下:

create:用于創建節點,可以指定節點路徑、節點數據、節點的訪問權限、節點類型
delete:刪除節點,每個節點都有一個版本,刪除時可指定刪除的版本,類似樂觀鎖。設置-1,則就直接刪除節點。
exists:節點存不存在,若存在返回節點Stat信息,否則返回null
getChildren:獲取子節點
getData/setData:獲取節點數據
getACL/setACL:獲取節點訪問權限列表,每個節點都可以設置訪問權限,指定只有特定的客戶端才能訪問和操作節點。

public class ZookpeerTest {
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
ZooKeeper zk = new ZooKeeper("192.168.0.183:2181", 3000, new Watcher() {
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent.toString());
}
});
System.out.println("OK!");
// 創建一個目錄節點
/**
* CreateMode:
* PERSISTENT (持續的,相對于EPHEMERAL,不會隨著client的斷開而消失)
* PERSISTENT_SEQUENTIAL(持久的且帶順序的)
* EPHEMERAL (短暫的,生命周期依賴于client session)
* EPHEMERAL_SEQUENTIAL (短暫的,帶順序的)
*/
zk.create("/country", "China".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// 創建一個子目錄節點
zk.create("/country/city", "China/Hangzhou".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/country", false, null)));
// 取出子目錄節點列表
System.out.println(zk.getChildren("/country", true));
// 創建另外一個子目錄節點
zk.create("/country/view", "China/WestLake".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(zk.getChildren("/country", true));
// 修改子目錄節點數據
zk.setData("/country/city", "China/Shanghai".getBytes(), -1);
byte[] datas = zk.getData("/country/city", true, null);
String str = new String(datas, "utf-8");
System.out.println(str);
// 刪除整個子目錄 -1代表version版本號,-1是刪除所有版本
// zk.delete("/path01/path01", -1);
// zk.delete("/path01/path02", -1);
// zk.delete("/path01", -1);
// System.out.println(str);
Thread.sleep(15000);
zk.close();
System.out.println("OK");
}
}

?

?

?


節點類型說明:
節點類型有4種:“PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL”其中“EPHEMERAL、EPHEMERAL_SEQUENTIAL”兩種是客戶端斷開連接(Session無效時)節點會被自動刪除;“PERSISTENT_SEQUENTIAL、EPHEMERAL_SEQUENTIAL”兩種是節點名后綴是一個自動增長序號。

節點訪問權限說明:
節點訪問權限由List確定,但是有幾個便捷的靜態屬性可以選擇:
- Ids.CREATOR_ALL_ACL:只有創建節點的客戶端才有所有權限\
- Ids.OPEN_ACL_UNSAFE:這是一個完全開放的權限,所有客戶端都有權限
- Ids.READ_ACL_UNSAFE:所有客戶端只有讀取的

zkclient :

?

public class Zkclient {
public static void main(String[] args) throws Exception{
ZkClient zkClient = new ZkClient("192.168.0.183:2181");//建立連接
zkClient.create("/root","mydata", CreateMode.PERSISTENT);//創建目錄并寫入數據
String data=zkClient.readData("/root");
System.out.println(data);
//zkClient.delete("/root");//刪除目錄
//zkClient.deleteRecursive("/root");//遞歸刪除節目錄
}
}

?

特別感謝資料來源:https://www.cnblogs.com/LiZhiW/p/4923693.html

轉載于:https://www.cnblogs.com/lijiasnong/p/10064007.html

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

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

相關文章

java反射獲取注解_Java自定義注解和運行時靠反射獲取注解

java自定義注解Java注解是附加在代碼中的一些元信息&#xff0c;用于一些工具在編譯、運行時進行解析和使用&#xff0c;起到說明、配置的功能。注解不會也不能影響代碼的實際邏輯&#xff0c;僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。1、元注解元注解是指注解…

進程間的通訊(IPC)方式

內存映射 為什么要進行進程間的通訊(IPC (Inter-process communication)) 數據傳輸&#xff1a;一個進程需要將它的數據發送給另一個進程&#xff0c;發送的數據量在一個字節到幾M字節之間共享數據&#xff1a;多個進程想要操作共享數據&#xff0c;一個進程對共享數據的修改&a…

開發人員避免編寫測試的2個最常見原因

This post was originally published on Medium這篇文章最初發表于Medium Writing tests represents one of those few stages of software development that is usually overlooked, even though it may be one of the most important one. Developers mention it and usuall…

java ews_Java---使用EWS 寫個ExchangeMailUtil

依賴包&#xff1a;commons-httpclient-3.1.jarcommons-codec-1.10.jarcommons-logging-1.2.jarjcifs-1.3.17.jar代碼示例&#xff1a;創建MailBean類&#xff1a;import java.util.Date;public class MailBean {public BigDecimal getId() {return id;}public void setId(BigD…

Ilya Muromets(DP or 思維)

Ilya Muromets Gym - 100513F Силачом слыву недаром — семерых одним ударом!From the Russian cartoon on the German fairy tale.Ilya Muromets is a legendary bogatyr. Right now he is struggling against Zmej Gorynych, a drago…

C# 裝箱和拆箱

C#的值類型可以分為在棧上分配內存的值類型和在托管堆上分配內存的引用類型。 1、那么值類型和引用類型能否相互轉換呢? 答案是肯定的,C#通過裝箱和拆箱來實現兩者的相互轉換。 (1)、裝箱 ---把值類型強制轉換成引用類型(object類型) (2)、拆箱 ---把引用類型強制轉換成值…

第五章

學會了開發板測試環境的調試和燒寫android系統。 學到的知識&#xff1a; 一、安裝串口調試工具:minicom 第1步&#xff1a;檢測當前系統是否支持USB轉串口。 # lsmod | grep usbserial 第2步&#xff1a;安裝minicom # qpt-get install minicom 第3步:配置minicom # minicom -…

Angular的后院:組件依賴關系的解決

by Dor Moshe通過Dor Moshe Angular的后院&#xff1a;解決 組件依賴關系 (Angular’s Backyard: The Resolving of Components Dependencies) This article originally appeared on dormoshe.io這篇文章 最初出現在dormoshe.io Many of us use the Hierarchical Dependenc…

node中的Stream-Readable和Writeable解讀

在node中&#xff0c;只要涉及到文件IO的場景一般都會涉及到一個類&#xff0d;Stream。Stream是對IO設備的抽象表示&#xff0c;其在JAVA中也有涉及&#xff0c;主要體現在四個類&#xff0d;InputStream、Reader、OutputStream、Writer&#xff0c;其中InputStream和OutputSt…

新Rider預覽版發布,對F#的支持是亮點

JetBrains一直在改進自己的跨平臺.NET IDE產品Rider&#xff0c;努力使其成為Visual Studio家族產品可承擔職能的重要替代者。于今年四月發布的Rider預覽版&#xff08;EAP 21&#xff09;提供了一些新特性&#xff0c;其中的亮點在于對函數式編程語言F#的支持。\\鑒于這是Ride…

java代碼整合_java合并多個文件的實例代碼

在實際項目中&#xff0c;在處理較大的文件時&#xff0c;常常將文件拆分為多個子文件進行處理&#xff0c;最后再合并這些子文件。下面就為各位介紹下Java中合并多個文件的方法。Java中合并子文件最容易想到的就是利用BufferedStream進行讀寫。具體的實現方式如下&#xff0c;…

正則表達式的一些規則

1.限定修飾符只對其緊前的元字符有效 String rex8 "\\d\\D"; 上式中&#xff0c;只對\\D有效&#xff0c;即有至少有1個&#xff08;1個或多個&#xff09;非數字&#xff0c;\\d仍然只許有一個數字。 2.[1,2,3]和[123]是一樣的轉載于:https://www.cnblogs.com/Sabr…

2016版單詞的減法_在2016年最大的電影中,女性只說了27%的單詞。

2016版單詞的減法by Amber Thomas通過琥珀托馬斯 在2016年最大的電影中&#xff0c;女性只說了27&#xff05;的單詞。 (Women only said 27% of the words in 2016’s biggest movies.) Movie trailers in 2016 promised viewers so many strong female characters. Jyn Erso…

軟件工程博客---團隊項目---個人設計2(算法)

針對分析我們團隊項目的需求&#xff0c;我們選定Dijkstra算法。 算法的基本思想&#xff1a; Dijkstra算法是由E.W.Dijkstra于1959年提出&#xff0c;又叫迪杰斯特拉算法&#xff0c;它應用了貪心算法模式&#xff0c;是目前公認的最好的求解最短路徑的方法。算法解決的是有向…

UWP 雜記

UWP用選取文件對話框 http://blog.csdn.net/u011033906/article/details/65448394 文件選取器、獲取文件屬性、寫入和讀取、保存讀取和刪除應用數據 https://yq.aliyun.com/articles/839 UWP判斷文件是否存在 http://blog.csdn.net/lindexi_gd/article/details/51387901…

微信上傳素材 java_微信素材上傳(JAVA)

public String uploadMaterial(String url,InputStream sbs,String filelength,String filename, String type) throws Exception {try {DataInputStream innew DataInputStream(sbs);url url.replace("TYPE", type);URL urlObj new URL(url);// 創建Http連接HttpU…

SQL Server讀寫分離之發布訂閱

一、發布 上面有多種發布方式&#xff0c;這里我選擇事物發布&#xff0c;具體區別請自行百度。 點擊下一步、然后繼續選擇需要發布的對象。 如果需要篩選發布的數據點擊添加。 根據自己的計劃選擇發布的時間。 點擊安全設置&#xff0c;設置代理信息。 最后單擊完成系統會自動…

碼農和程序員的幾個重要區別!

如果一個企業老板大聲嚷嚷說&#xff0c;“我要招個程序員”&#xff0c;那么十之八九指的是“碼農”——一種純粹為了錢而寫代碼的技術人員。這其實是一種非常狹隘和錯誤的做法&#xff0c;原因么&#xff0c;且聽我一一道來。1、碼農寫代碼&#xff0c;程序員寫系統從本質上講…

sql server2008禁用遠程連接

1.打開SQL Server 配置管理器&#xff0c;雙擊左邊 SQL Server 網絡配置&#xff0c;點擊TCP/IP協議,在協議一欄中,找到 全部偵聽,修改為否&#xff0c;然后點擊IP地址,將IP地址為127.0.0.1(IPV4)或::1(IPV6)的已啟用修改為是,其它的IP地址的已啟用修改為否 注意&#xff1a;如…

snapchat注冊不到_從Snapchat獲得開發人員職位中學到的經驗教訓

snapchat注冊不到Here are three links worth your time:這是三個值得您花費時間的鏈接&#xff1a; I just got a developer job at Snapchat. Here’s what I learned and how it can help you with your job search (15 minute read) 我剛剛在Snapchat獲得開發人員職位。 這…