JavaRush /Java Blog /Random-TW /動物園管理員或動物園管理員的生活是什麼樣的
Viacheslav
等級 3

動物園管理員或動物園管理員的生活是什麼樣的

在 Random-TW 群組發布
動物園管理員或動物園工作人員的生活方式 - 1

介紹

Java 應用程式通常有不同的配置。例如,地址和連接埠。例如,如果我們使用Properties類,它可能看起來像這樣:
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
這似乎就夠了,因為… 我們可以從文件中取得屬性。一切似乎都在一台機器上與我們相處得很好。但是想像一下,我們的系統開始由彼此分離的不同系統組成?這樣的系統也稱為分散式系統。在維基百科上,您可以找到以下定義:分散式系統是其元件位於不同網路電腦上的系統,這些電腦相互通訊並透過相互交換訊息來協調其操作。你可以看下圖:
動物園管理員或動物園工作人員的生活方式 - 2
透過這種方法,單一系統被分成多個組件。配置是一個單獨的公共組件。其他每個組件都充當配置組件的客戶端。這種情況稱為「分散式配置」。分散式配置有許多不同的實作。在今天的評論中,我建議熟悉其中之一,稱為 Zookeeper。
動物園管理員或動物園工作人員的生活方式 - 3

動物園管理員

了解 Zookeeper 的路徑始於其官方網站:zookeeper.apache.org在官方網站上,您需要前往「下載」 部分。在本部分中,下載 .tar.gz 格式的存檔,例如「zookeeper-3.4.13.tar.gz」。tar 是 Unit 系統的傳統存檔格式。gz - 表示使用 gzip 來壓縮檔案。如果我們在 Windows 機器上工作,那麼這不應該困擾我們。大多數現代歸檔程式(例如7-zip)可以在 Windows 上與它們完美配合。讓我們將內容提取到某個目錄中。同時,我們將看到差異 - 在解壓縮狀態下的磁碟上,它將佔用大約 60 兆位元組,而我們下載的存檔大小約為 35 兆位元組。正如您所看到的,壓縮確實有效。現在您需要啟動 Zookeeper。總的來說,Zookeeper是一種伺服器。Zookeeper 可以以兩種模式之一運行:StandaloneReplicated。讓我們考慮最簡單的選項,也稱為第一個選項 - 獨立模式。為了運行 Zookeper,它需要一個設定檔。因此,讓我們在這裡創建它:[КаталогРаспаковкиZookeeper]/conf/zoo.cfg。對於 Windows,我們將使用 Medium 的建議:「在 Windows 上安裝 Apache ZooKeeper」。設定檔的內容將是這樣的:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
讓我們加入包含zookeper根目錄路徑的ZOOKEEPER_HOME環境變數(如medium上的說明),同時將以下片段新增至PATH環境變數:另外,;%ZOOKEEPER_HOME%\bin; dataDir中指定的目錄必須存在,否則Zookeeper將不會能夠啟動伺服器。現在我們可以使用指令:zkServer 安全地啟動伺服器。由於Zookeeper目錄已加入path環境變數中,我們可以從任何地方呼叫Zookeeper命令,而不僅僅是從bin目錄。
動物園管理員或動物園工作人員的生活方式 - 4

Z節點

如《 Zookeeper 概述》所述,Zookeeper 中的資料以ZNode (節點)的形式表示,這些 ZNode 被組織成樹狀結構。也就是說,每個 ZNode 都可以包含資料並具有子 ZNode。關於ZNode組織的更多資訊可以在Zookeeper文件中找到:「資料模型和分層命名空間」。為了與 Zookeeper 和 ZNode 搭配使用,我們將使用Zookeeper CLI(命令列介面)。之前,我們使用 zkServer 命令啟動伺服器。現在,要連接,讓我們執行。zkCli.cmd -server 127.0.0.1:2181 如果成功,將創建到 Zookeeper 的連接會話,我們將看到大約以下輸出:
動物園管理員或動物園工作人員的生活方式 - 5
有趣的是,即使安裝之後,Zookeeper 就已經擁有了 ZNode。它有以下路徑:/zookeeper/quota
動物園管理員或動物園工作人員的生活方式 - 6
這些就是所謂的「配額」。正如「 Apache ZooKeeper Essentials 」中所述,每個 ZNode 都可以有一個與之關聯的配額,限制它可以儲存的資料。可以指定 znode 數量和儲存資料量的限制。而且,如果超過這個限制,那麼對ZNode的操作就不會被取消,但會收到超過限制的警告。建議閱讀《ZooKeeper 程式設計師指南:ZNodes》中有關 ZNode 的內容。其中的一些範例說明如何使用 ZNode:
動物園管理員或動物園工作人員的生活方式 - 7
我還想指出 ZNode 是不同的。常規 ZNode(除非您指定其他標誌)的類型為「permanent」。有一個「臨時節點」類型的 ZNode。此類 ZNode 僅在建立它們的 Zookeeper 連線會話期間存在。有一個「序列節點」類型的 ZNode。這些 ZNode 會附加序列中的編號以確保唯一性。序列節點可以是持久的或短暫的。關於 ZNode,我們也在這裡推薦一些背景資訊:「Zookeeper ZNodes – 特徵和範例」。
動物園管理員或動物園工作人員的生活方式 - 8

Z節點觀察者

我還想談談觀察者。關於它們的詳細資訊寫在 Zookeeper 的文檔中:「ZooKeeper Watches」。簡而言之,觀察者是由某個事件觸發的一次性觸發器。透過執行 getData()、getChildren() 或 Exists() 操作來擷取數據,我們可以建立觸發器作為附加操作。Zookeeper 確保事件的處理順序。此外,文件指出,在我們看到新的 ZNode 值之前,我們將看到一個有關將舊值更改為新值的事件。您可以在此處閱讀有關觀察者的更多資訊:「ZooKeeper 觀察 – 功能和保證」。為了嘗試這個,讓我們再次使用CLI:假設我們有一些 ZNode,其值用於儲存某些服務的狀態:
[zk: 127.0.0.1:2181(CONNECTED) 0] create /services/service1/status stopped
Created /services/service1/status
[zk: 127.0.0.1:2181(CONNECTED) 1] get /services/service1/status [watch]
stopped
現在,如果資料/services/service1/status發生變化,我們的一次性觸發器將觸發:
動物園管理員或動物園工作人員的生活方式 - 9
有趣的是,當連接到 Zookeeper 時,我們還可以看到觀察者是如何運作的:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected是可能的 Zookeper 事件之一。有關它的更多詳細資訊可以在 API 描述中找到。
動物園管理員或動物園工作人員的生活方式 - 10

動物園管理員和Java

現在我們對 Zookeeper 的功能有了一些基本的了解。現在讓我們透過 Java 而不是透過 CLI 來使用它。為此,我們需要一個 Java 應用程序,在其中我們將了解如何與 Zookeeper 一起工作。為了創建應用程序,我們將使用Gradle專案建置系統。我們將使用「Gradle Build Init 插件」來建立專案。為此,我們執行命令:gradle init --type java-application 如果 Gradle 要求我們澄清問題,那麼我們將保留預設值(只需按 Enter)。現在讓我們打開建置腳本,即 建置.gradle 檔案。它包含對我們的專案的組成以及它所依賴的工件(庫、框架)的描述。因為 我們想要使用Zookeeper,那我們需要添加它。因此,我們將 Zookeeper 的依賴項加入到依賴項區塊中:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
您可以在評論中閱讀有關 Gradle 的更多資訊:「Gradle 簡介」。因此,我們有一個 Java 項目,我們將 Zookeeper 庫連接到它。現在讓我們來寫點東西吧。我們記得,使用 CLI 我們連接了這樣的東西:zkCli.cmd -server 127.0.0.1:2181 讓我們在 App 類別的 main 方法中宣告「server」屬性:
String server = "127.0.0.1:2181";
連結不是一個即時動作。我們必須以某種方式在程式執行的主執行緒中等待連線的發生。因此,我們需要一把鎖。下面我們來聲明一下:
Object lock = new Object();
現在我們需要有人告訴我們連線已經建立。我們記得,當我們透過 CLI 執行此操作時,觀察者為我們工作。所以在 Java 程式碼中一切都是完全相同的。我們的觀察者將顯示一條有關成功完成的訊息,並透過鎖通知等待的每個人。我們來寫一個觀察者:
Watcher connectionWatcher = new Watcher() {
	public void process(WatchedEvent we) {
		if (we.getState() == Event.KeeperState.SyncConnected) {
			System.out.println("Connected to Zookeeper in " + Thread.currentThread().getName());
			synchronized (lock) {
            	lock.notifyAll();
            }
		}
	}
};
現在讓我們加入到zooKeeper伺服器的連線:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
這裡一切都很簡單。當在程式主執行緒中執行main方法時,我們取得鎖定並向zookeeper請求連線。同時,我們釋放鎖並等待,直到其他人搶到鎖並通知我們可以繼續。當連結建立後,觀察者就會開始工作。他將檢查 SyncConnected 事件是否已到達(我們記得,這是觀察者透過 CLI 捕獲的事件),然後寫入一條訊息。接下來,我們取得鎖(因為主執行緒之前釋放了它)並通知所有等待鎖的執行緒我們可以繼續。事件處理執行緒退出同步區塊,從而釋放鎖定。主執行緒收到通知,等待鎖定釋放後,繼續執行,因為 在收到鎖之前,它將無法退出同步區塊並繼續工作。因此,使用多執行緒和 Zookeeper API,我們可以執行各種操作。Zookeeper API 比 CLI 允許的範圍要廣泛得多。例如:
// Creation нового узла
String znodePath = "/zookeepernode2";
List<ACL> acls = ZooDefs.Ids.OPEN_ACL_UNSAFE;
if (zooKeeper.exists(znodePath, false) == null) {
	zooKeeper.create(znodePath, "data".getBytes(), acls, CreateMode.PERSISTENT);
}

// Получение данных из узла
byte[] data = zooKeeper.getData(znodePath, null, null);
System.out.println("Result: " + new String(data, "UTF-8"));
正如你所看到的,在創建節點時我們可以配置ACL。這是另一個重要特徵。ACL 是適用於 ZNode 操作的權限。設定比較多,建議大家詳細參考官方文件:《Zookeeper ACL權限》。
動物園管理員或動物園工作人員的生活方式 - 11

結論

我們為什麼要讀這個?因為Zookeeper被用於其他流行的技術。例如,Apache Kafka需要Zookeeper,您可以在「Kafka快速入門指南」中閱讀有關Zookeeper的資訊。它也用於 NOSQL 資料庫 HBase,您可以在他們的“ HBase 快速入門指南”中閱讀更多資訊。事實上,許多其他項目都使用 Zookeeper。其中一些列在“在現實世界中使用 Zookeeper ”。我希望我回答了「為什麼」這個問題。現在最重要的問題是:“下一步是什麼?” 首先,您可以閱讀以下有關 Apache Zookeeper 主題的書籍: 其次,有關於Zookeeper的精彩影片報道。推薦觀看: 第三,有幾篇有用的文章可以補充世界的圖像: 這是一篇非常簡短的評論,但作為介紹性的文字,我希望它會有用。#維亞切斯拉夫
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION