JavaRush /Java-Blog /Random-DE /Tierpfleger oder wie das Leben eines Tierpflegers aussieh...
Viacheslav
Level 3

Tierpfleger oder wie das Leben eines Tierpflegers aussieht

Veröffentlicht in der Gruppe Random-DE
Tierpfleger oder wie ein Zooangestellter lebt – 1

Einführung

Java-Anwendungen haben oft unterschiedliche Konfigurationen. Zum Beispiel Adresse und Verbindungsport. Wenn wir die Properties- Klasse verwenden, könnte es beispielsweise so aussehen :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
Und das scheint zu reichen, denn... Wir können Eigenschaften aus der Datei abrufen. Und bei uns scheint auf einer Maschine alles gut zu laufen. Aber stellen Sie sich vor, dass unser System aus verschiedenen, voneinander getrennten Systemen zu bestehen beginnt? Ein solches System wird auch als verteiltes System bezeichnet. Auf Wikipedia findet man folgende Definition: Verteilte Systeme sind Systeme, deren Komponenten sich auf verschiedenen Netzwerkrechnern befinden, die miteinander kommunizieren und ihre Aktionen durch den Austausch von Nachrichten untereinander koordinieren. Sie können sich das folgende Diagramm ansehen:
Tierpfleger oder wie ein Zooangestellter lebt - 2
Bei diesem Ansatz wird ein einzelnes System in Komponenten unterteilt. Die Konfiguration ist eine separate gemeinsame Komponente. Jede der anderen Komponenten fungiert als Client für die Konfigurationskomponente. Dieser Fall wird als „ verteilte Konfiguration “ bezeichnet. Es gibt viele verschiedene Implementierungen der verteilten Konfiguration. Und in der heutigen Rezension schlage ich vor, einen von ihnen kennenzulernen, der Zookeeper heißt.
Tierpfleger oder wie ein Zooangestellter lebt - 3

Tierpfleger

Der Weg, Zookeeper kennenzulernen, beginnt auf der offiziellen Website: zookeeper.apache.org . Auf der offiziellen Website müssen Sie zum Abschnitt „ Download “ gehen . Laden Sie in diesem Abschnitt das Archiv im .tar.gz-Format herunter, zum Beispiel „zookeeper-3.4.13.tar.gz“. tar ist ein für Unit-Systeme traditionelles Archivformat. gz – bedeutet, dass gzip zum Komprimieren des Archivs verwendet wird. Wenn wir auf einem Windows-Rechner arbeiten, sollte uns das nicht stören. Die meisten modernen Archivierungsprogramme (z. B. 7-zip ) können damit unter Windows perfekt zusammenarbeiten. Extrahieren wir den Inhalt in ein Verzeichnis. Gleichzeitig werden wir den Unterschied sehen: Auf der Festplatte nimmt sie im entpackten Zustand etwa 60 Megabyte ein, und wir haben ein Archiv mit einer Größe von etwa 35 Megabyte heruntergeladen. Wie Sie sehen, funktioniert die Komprimierung wirklich. Jetzt müssen Sie Zookeeper starten. Im Allgemeinen ist Zookeeper eine Art Server. Zookeeper kann in einem von zwei Modi ausgeführt werden: Standalone oder Replicated . Betrachten wir die einfachste Option, auch als erste Option bekannt – den Standalone-Modus. Damit Zookeper ausgeführt werden kann, ist eine Konfigurationsdatei erforderlich. Deshalb erstellen wir es hier: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Für Windows verwenden wir die Empfehlung von Medium: „ Apache ZooKeeper unter Windows installieren “. Der Inhalt der Konfigurationsdatei sieht etwa so aus:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Fügen wir die Umgebungsvariable ZOOKEEPER_HOME hinzu, die den Pfad zum Zookeeper-Stammverzeichnis enthält (wie in den Anweisungen auf dem Medium), und fügen wir außerdem das folgende Fragment zur Umgebungsvariablen PATH hinzu: ;%ZOOKEEPER_HOME%\bin; Außerdem muss das in dataDir angegebene Verzeichnis vorhanden sein, andernfalls ist Zookeeper nicht vorhanden konnte den Server starten. Jetzt können wir den Server sicher mit dem Befehl zkServer starten. Dank der Tatsache, dass das Zookeeper-Verzeichnis zur Pfadumgebungsvariablen hinzugefügt wurde, können wir Zookeper-Befehle von überall aus aufrufen, nicht nur vom bin-Verzeichnis aus.
Tierpfleger oder wie ein Zooangestellter lebt - 4

ZNode

Wie in der „ Zookeeper-Übersicht “ angegeben, werden Daten in Zookeper in Form von ZNodes (Knoten) dargestellt, die in einer Baumstruktur organisiert sind. Das heißt, jeder ZNode kann Daten enthalten und untergeordnete ZNodes haben. Weitere Informationen zur ZNode-Organisation finden Sie in der Zookeeper-Dokumentation: „ Datenmodell und der hierarchische Namespace “. Um mit Zookeeper und ZNode zu arbeiten, verwenden wir Zookeeper CLI (Befehlszeilenschnittstelle). Zuvor haben wir den Server mit dem Befehl zkServer gestartet. Um nun eine Verbindung herzustellen, führen wir Folgendes aus. zkCli.cmd -server 127.0.0.1:2181 Bei Erfolg wird eine Verbindungssitzung zu Zookeeper erstellt und wir sehen ungefähr die folgende Ausgabe:
Tierpfleger oder wie ein Zooangestellter lebt – 5
Interessanterweise verfügt Zookeeper bereits direkt nach der Installation über ZNode. Es hat den folgenden Pfad:/zookeeper/quota
Tierpfleger oder wie ein Zooangestellter lebt - 6
Dabei handelt es sich um die sogenannten „ Quoten “. Wie in „ Apache ZooKeeper Essentials “ angegeben, kann jedem ZNode ein Kontingent zugeordnet werden, wodurch die Daten begrenzt werden, die er speichern kann. Es kann eine Begrenzung der Anzahl der Knoten und der Menge der gespeicherten Daten festgelegt werden. Darüber hinaus wird bei Überschreitung dieser Grenze der Vorgang mit ZNode nicht abgebrochen, sondern es wird eine Warnung über die Überschreitung der Grenze empfangen. Es wird empfohlen, mehr über ZNode im „ ZooKeeper Programmer's Guide: ZNodes “ zu lesen. Ein paar Beispiele von dort, wie Sie mit ZNode arbeiten können:
Tierpfleger oder wie ein Zooangestellter lebt – 7
Ich möchte auch darauf hinweisen, dass ZNodes unterschiedlich sind. Reguläre ZNodes (sofern Sie keine zusätzlichen Flags angeben) sind vom Typ „ persistent “. Es gibt einen ZNode vom Typ „ Ephemeral Node “. Solche ZNodes existieren nur für die Dauer der Zookeeper-Verbindungssitzung, in der sie erstellt wurden. Es gibt einen ZNode vom Typ „ Sequence Node “. An diese ZNodes wird eine Nummer aus der Sequenz angehängt, um die Eindeutigkeit sicherzustellen. Der Sequenzknoten kann entweder dauerhaft oder kurzlebig sein. Ein paar Hintergrundinformationen zu ZNode sind auch hier empfehlenswert: „ Zookeeper ZNodes – Eigenschaften & Beispiel “.
Tierpfleger oder wie ein Zooangestellter lebt - 8

ZNode Watcher

Ich möchte auch über Beobachter sprechen. Einzelheiten dazu finden Sie in der Dokumentation von Zookeeper: „ ZooKeeper Watches “. Kurz gesagt ist ein Watcher ein einmaliger Auslöser, der durch ein bestimmtes Ereignis ausgelöst wird. Durch das Abrufen von Daten durch Ausführen der Operationen getData(), getChildren() oder exist() können wir einen Trigger als zusätzliche Aktion erstellen. Zookeeper stellt die Reihenfolge sicher, in der das Ereignis verarbeitet wird. Darüber hinaus heißt es in der Dokumentation, dass wir, bevor wir den neuen ZNode-Wert sehen können, ein Ereignis sehen werden, bei dem der alte Wert in den neuen geändert wird. Mehr über Watchers können Sie hier lesen: „ ZooKeeper-Uhren – Funktionen und Garantien “. Um dies zu versuchen, verwenden wir erneut die CLI : Nehmen wir an, wir haben einen ZNode mit einem Wert, in dem wir den Status eines Dienstes speichern:
[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
Wenn sich nun die Daten /services/service1/statusändern, wird unser einmaliger Auslöser ausgelöst:
Tierpfleger oder wie ein Zooangestellter lebt - 9
Interessant ist, dass wir bei der Verbindung mit Zookeeper auch sehen, wie der Watcher funktioniert:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected ist eines der möglichen Zookeper-Ereignisse. Weitere Details dazu finden Sie in der API-Beschreibung.
Tierpfleger oder wie ein Zooangestellter lebt – 10

Zookeeper und Java

Wir haben jetzt ein grundlegendes Verständnis dafür, was Zookeeper tun kann. Lassen Sie uns jetzt über Java damit arbeiten und nicht über die CLI. Und dafür benötigen wir eine Java-Anwendung, in der wir sehen, wie man mit Zookeeper arbeitet. Zum Erstellen der Anwendung verwenden wir das Gradle- Projekt-Build-System . Mit dem „ Gradle Build Init Plugin “ erstellen wir das Projekt. Dazu führen wir den Befehl aus: gradle init --type java-application Wenn Gradle uns um klärende Fragen bittet, belassen wir die Standardwerte (drücken Sie einfach die Eingabetaste). Öffnen wir nun das Build-Skript, d.h. build.gradle-Datei. Es enthält eine Beschreibung, woraus unser Projekt besteht und von welchen Artefakten (Bibliotheken, Frameworks) es abhängt. Weil Wenn wir Zookeeper verwenden möchten, müssen wir ihn hinzufügen. Fügen wir daher dem Abhängigkeitsblock eine Abhängigkeit von Zookeeper hinzu:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Mehr über Gradle können Sie in der Rezension lesen: „ Eine kurze Einführung in Gradle “. Wir haben also ein Java-Projekt und haben die Zookeeper-Bibliothek damit verbunden. Lass uns jetzt etwas schreiben. Wie wir uns erinnern, haben wir mit der CLI etwa Folgendes verbunden: zkCli.cmd -server 127.0.0.1:2181 Lassen Sie uns das „Server“-Attribut in der App-Klasse in der Hauptmethode deklarieren:
String server = "127.0.0.1:2181";
Eine Verbindung ist keine sofortige Aktion. Wir müssen irgendwie im Hauptthread der Programmausführung warten, bis die Verbindung hergestellt wird. Deshalb brauchen wir eine Sperre. Lassen Sie es uns unten erklären:
Object lock = new Object();
Jetzt brauchen wir jemanden, der sagt, dass die Verbindung hergestellt wurde. Wie wir uns erinnern, arbeitete der Watcher für uns, als wir dies über die CLI taten. Im Java-Code ist also alles genau gleich. Unser Beobachter zeigt eine Meldung über den erfolgreichen Abschluss an und benachrichtigt alle Wartenden über ein Schloss darüber. Schreiben wir einem Beobachter:
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();
            }
		}
	}
};
Fügen wir nun die Verbindung zum zooKeeper-Server hinzu:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Hier ist alles einfach. Beim Ausführen der Hauptmethode im Hauptthread des Programms greifen wir auf die Sperre und fordern eine Verbindung zum Zookeeper an. Gleichzeitig lösen wir die Sperre und warten, bis jemand anderes die Sperre greift und uns mitteilt, dass wir fortfahren können. Sobald die Verbindung hergestellt ist, funktioniert der Watcher. Er prüft, ob das SyncConnected-Ereignis eingetroffen ist (wie wir uns erinnern, hat der Beobachter dies über die CLI abgefangen) und schreibt dann eine Nachricht. Als nächstes ergreifen wir die Sperre (da der Hauptthread sie zuvor freigegeben hat) und benachrichtigen alle Threads, die auf die Sperre warten, dass wir fortfahren können. Der Ereignisverarbeitungsthread verlässt den synchronisierten Block und hebt dadurch die Sperre auf. Der Hauptthread hat eine Benachrichtigung erhalten und setzt die Ausführung fort, nachdem er auf die Aufhebung der Sperre gewartet hat, weil Bis es die Sperre erhält, kann es den synchronisierten Block nicht verlassen und weiterarbeiten. Mithilfe von Multithreading und der Zookeeper-API können wir daher verschiedene Aktionen ausführen. Die Zookeeper-API ist viel umfassender als das, was die CLI zulässt. Zum Beispiel:
// Schaffung нового узла
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"));
Wie Sie sehen, können wir beim Erstellen eines Knotens eine ACL konfigurieren. Dies ist ein weiteres wichtiges Merkmal. ACLs sind Berechtigungen, die für Aktionen mit ZNode gelten. Es gibt viele Einstellungen, daher empfehle ich Ihnen, Einzelheiten in der offiziellen Dokumentation zu lesen: „ Zookeeper ACL-Berechtigungen “.
Tierpfleger oder wie ein Zooangestellter lebt – 11

Abschluss

Warum haben wir das gelesen? Weil Zookeeper in anderen beliebten Technologien verwendet wird. Beispielsweise benötigt Apache Kafka Zookeeper, worüber Sie im „ Kafka Quick Start Guide “ nachlesen können. Es wird auch in der NOSQL-Datenbank HBase verwendet, über die Sie mehr im „ HBase Quickstart Guide “ lesen können. Tatsächlich verwenden viele andere Projekte Zookeeper. Einige davon sind in „ Verwendung von Zookeeper in der realen Welt “ aufgeführt. Ich hoffe, ich habe die Frage „Warum“ beantwortet. Die wichtigste Frage lautet nun: „Wie geht es weiter?“ Zunächst können Sie die folgenden Bücher zum Thema Apache Zookeeper lesen: Zweitens gibt es hervorragende Videoberichte über Zookeeper. Empfohlene Besichtigung: Drittens gibt es mehrere nützliche Artikel, die das Bild der Welt ergänzen: Dies ist eine sehr kurze Rezension, aber als einleitende Bemerkung hoffe ich, dass sie nützlich sein wird. #Wjatscheslaw
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION