JavaRush /Blog Java /Random-MS /Penjaga zoo atau bagaimana kehidupan seorang penjaga zoo

Penjaga zoo atau bagaimana kehidupan seorang penjaga zoo

Diterbitkan dalam kumpulan
Penjaga zoo atau cara hidup pekerja zoo - 1

pengenalan

Aplikasi Java selalunya mempunyai konfigurasi yang berbeza. Contohnya, alamat dan port sambungan. Sebagai contoh, ia mungkin kelihatan seperti ini jika kami menggunakan kelas Properties :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
Dan ini nampaknya sudah cukup, kerana... kita boleh mendapatkan Properties daripada fail. Dan segala-galanya nampaknya sesuai dengan kami pada satu mesin. Tetapi bayangkan bahawa sistem kita mula terdiri daripada sistem yang berbeza yang dipisahkan antara satu sama lain? Sistem sedemikian juga dipanggil sistem teragih. Di Wikipedia anda boleh menemui definisi berikut: Sistem teragih ialah sistem yang komponennya terletak pada komputer rangkaian berbeza yang berkomunikasi antara satu sama lain dan menyelaraskan tindakan mereka dengan bertukar-tukar mesej antara satu sama lain. Anda boleh melihat rajah berikut:
Penjaga zoo atau cara hidup pekerja zoo - 2
Dengan pendekatan ini, satu sistem dibahagikan kepada komponen. Konfigurasi ialah komponen biasa yang berasingan. Setiap komponen lain bertindak sebagai pelanggan untuk komponen konfigurasi. Kes ini dipanggil " Konfigurasi teragih ". Terdapat banyak pelaksanaan berbeza konfigurasi diedarkan. Dan dalam ulasan hari ini saya mencadangkan untuk berkenalan dengan salah seorang daripada mereka, yang dipanggil Zookeeper.
Penjaga zoo atau cara hidup pekerja zoo - 3

Penjaga zoo

Laluan untuk mengenali Zookeeper bermula dengan tapak web rasmi mereka: zookeeper.apache.org Di tapak web rasmi anda perlu pergi ke bahagian " Muat Turun " . Dalam bahagian ini, muat turun arkib dalam format .tar.gz, contohnya "zookeeper-3.4.13.tar.gz". tar ialah format arkib tradisional untuk sistem Unit. gz - bermakna gzip digunakan untuk memampatkan arkib. Jika kita bekerja pada mesin Windows, maka ini tidak sepatutnya mengganggu kita. Kebanyakan pengarkib moden (contohnya, 7-zip ) boleh berfungsi dengan sempurna dengan mereka pada Windows. Mari kita ekstrak kandungan ke dalam beberapa direktori. Pada masa yang sama, kita akan melihat perbezaannya - pada cakera dalam keadaan yang diekstrak ia akan menduduki kira-kira 60 megabait, dan kami memuat turun arkib bersaiz kira-kira 35 megabait. Seperti yang anda lihat, pemampatan benar-benar berfungsi. Kini anda perlu melancarkan Zookeeper. Secara umum, Zookeeper adalah sejenis pelayan. Zookeeper boleh dijalankan dalam salah satu daripada dua mod: Standalone atau Replicated . Mari kita pertimbangkan pilihan paling mudah, juga dikenali sebagai pilihan pertama - Mod kendiri. Untuk Zookeper berjalan, ia memerlukan fail konfigurasi. Oleh itu, mari kita cipta di sini: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Untuk Windows, kami akan menggunakan pengesyoran daripada Medium: “ Memasang Apache ZooKeeper pada Windows ”. Kandungan fail konfigurasi akan menjadi seperti ini:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Mari tambahkan pembolehubah persekitaran ZOOKEEPER_HOME yang mengandungi laluan ke direktori akar zookeper (seperti dalam arahan pada medium), dan juga tambahkan serpihan berikut pada pembolehubah persekitaran PATH: Juga ;%ZOOKEEPER_HOME%\bin; , direktori yang dinyatakan dalam dataDir mesti wujud, jika tidak, Zookeeper tidak akan dapat memulakan pelayan. Sekarang kita boleh memulakan pelayan dengan selamat menggunakan arahan: zkServer. Terima kasih kepada fakta bahawa direktori Zookeeper telah ditambahkan pada pembolehubah persekitaran laluan, kami boleh memanggil arahan Zookeper dari mana-mana sahaja, bukan hanya dari direktori bin.
Penjaga zoo atau cara hidup pekerja zoo - 4

ZNod

Seperti yang dinyatakan dalam " Gambaran Keseluruhan Zookeper ", data dalam Zookeper diwakili dalam bentuk ZNod (nod) yang disusun menjadi struktur pokok. Iaitu, setiap ZNode boleh mengandungi data dan mempunyai ZNode anak. Maklumat lanjut tentang organisasi ZNode boleh didapati dalam dokumentasi Zookeeper: " Model data dan ruang nama hierarki ". Untuk bekerja dengan Zookeeper dan ZNode kami akan menggunakan Zookeeper CLI (antara muka Talian Perintah). Sebelum ini, kami memulakan pelayan menggunakan arahan zkServer. Sekarang, untuk menyambung, mari jalankan. zkCli.cmd -server 127.0.0.1:2181 Jika berjaya, sesi sambungan ke Zookeeper akan dibuat dan kita akan melihat lebih kurang output berikut:
Penjaga zoo atau cara hidup pekerja zoo - 5
Menariknya, walaupun selepas pemasangan, Zookeeper sudah mempunyai ZNode. Ia mempunyai laluan berikut:/zookeeper/quota
Penjaga zoo atau cara hidup pekerja zoo - 6
Ini adalah apa yang dipanggil " kuota ". Seperti yang dinyatakan dalam " Apache ZooKeeper Essentials ", setiap ZNode boleh mempunyai kuota yang dikaitkan dengannya, mengehadkan data yang boleh disimpannya. Had bilangan znod dan jumlah data yang disimpan boleh ditentukan. Selain itu, jika had ini melebihi, maka operasi dengan ZNode tidak dibatalkan, tetapi amaran akan diterima tentang melebihi had. Adalah disyorkan untuk membaca tentang ZNode dalam " Panduan Pengaturcara ZooKeeper: ZNodes ". Beberapa contoh dari sana tentang cara anda boleh bekerja dengan ZNode:
Penjaga zoo atau cara hidup pekerja zoo - 7
Saya juga ingin ambil perhatian bahawa ZNodes adalah berbeza. ZNod biasa (melainkan anda menyatakan bendera tambahan) adalah jenis " persisten ". Terdapat ZNod jenis " Ephemeral Node ". ZNod sedemikian wujud hanya untuk tempoh sesi sambungan Zookeeper di mana ia dicipta. Terdapat ZNod jenis " Nod Urutan ". ZNod ini dilampirkan dengan nombor daripada jujukan untuk memastikan keunikan. Nod Jujukan boleh sama ada berterusan atau fana. Sedikit maklumat latar belakang tentang ZNode juga disyorkan di sini: “ Zookeeper ZNodes – Ciri & Contoh ”.
Penjaga zoo atau cara hidup pekerja zoo - 8

Pemerhati ZNode

Saya juga ingin bercakap tentang pemerhati. Butiran tentang mereka ditulis dalam dokumentasi Zookeeper: " ZooKeeper Watches ". Ringkasnya, pemerhati ialah pencetus sekali sahaja yang dicetuskan oleh beberapa peristiwa. Dengan mendapatkan semula data dengan melakukan operasi getData(), getChildren() atau exists(), kami boleh mencipta pencetus sebagai tindakan tambahan. Zookeeper memastikan susunan acara diproses. Selain itu, dokumentasi menyatakan bahawa sebelum kita dapat melihat nilai ZNode baharu, kita akan melihat peristiwa tentang menukar nilai lama kepada nilai baharu. Anda boleh membaca lebih lanjut mengenai Watchers di sini: " Jam Tangan ZooKeeper - Ciri & Jaminan ". Untuk mencuba ini, mari kita gunakan CLI sekali lagi : Mari kita anggap kita mempunyai beberapa ZNode dengan nilai di mana kita menyimpan status sesetengah perkhidmatan:
[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
Sekarang, jika data /services/service1/statusberubah, pencetus sekali kami akan menyala:
Penjaga zoo atau cara hidup pekerja zoo - 9
Menariknya apabila menyambung ke Zookeeper, kami juga melihat cara pemerhati berfungsi:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected ialah salah satu acara Zookeper yang mungkin. Butiran lanjut mengenainya boleh didapati dalam penerangan API.
Penjaga zoo atau cara hidup pekerja zoo - 10

Penjaga zoo dan Jawa

Kami kini mempunyai beberapa pemahaman asas tentang perkara yang boleh dilakukan oleh Zookeeper. Sekarang mari kita bekerja dengannya melalui Java, dan bukan melalui CLI. Dan untuk ini kita memerlukan aplikasi Java, di mana kita akan melihat cara bekerja dengan Zookeeper. Untuk mencipta aplikasi, kami akan menggunakan sistem binaan projek Gradle . Menggunakan " pemalam Gradle Build Init " kami akan mencipta projek. Untuk melakukan ini, mari jalankan arahan: gradle init --type java-application Jika Gradle meminta kami untuk menjelaskan soalan, maka kami akan meninggalkan nilai lalai (hanya tekan Enter). Sekarang mari buka skrip binaan, i.e. fail build.gradle. Ia mengandungi penerangan tentang apa projek kami dibuat dan artifak (perpustakaan, rangka kerja) yang bergantung padanya. Kerana kita mahu menggunakan Zookeeper, maka kita perlu menambahnya. Oleh itu, mari tambahkan kebergantungan pada Zookeeper pada blok kebergantungan:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Anda boleh membaca lebih lanjut tentang Gradle dalam ulasan: " Pengenalan Ringkas kepada Gradle ". Jadi, kami mempunyai projek Java, kami menyambungkan perpustakaan Zookeeper kepadanya. Jom tulis sesuatu sekarang. Seperti yang kita ingat, menggunakan CLI kita menyambungkan sesuatu seperti ini: zkCli.cmd -server 127.0.0.1:2181 Mari kita isytiharkan atribut "pelayan" dalam kelas App dalam kaedah utama:
String server = "127.0.0.1:2181";
Sambungan bukan tindakan segera. Entah bagaimana kita perlu menunggu dalam utas utama pelaksanaan program untuk sambungan berlaku. Oleh itu, kita memerlukan kunci. Mari kita isytiharkannya di bawah:
Object lock = new Object();
Sekarang kita memerlukan seseorang untuk mengatakan bahawa sambungan telah diwujudkan. Seperti yang kami ingat, apabila kami melakukan ini melalui CLI, pemerhati bekerja untuk kami. Jadi dalam kod Java semuanya betul-betul sama. Pemerhati kami akan memaparkan mesej tentang kejayaan penyiapan dan memberitahu semua orang yang menunggu mengenainya melalui kunci. Mari kita tulis pemerhati:
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();
            }
		}
	}
};
Sekarang mari tambah sambungan ke pelayan zooKeeper:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Semuanya mudah di sini. Apabila melaksanakan kaedah utama dalam utas utama program, kami mengambil kunci dan meminta sambungan kepada penjaga zoo. Pada masa yang sama, kami melepaskan kunci dan menunggu sehingga orang lain mengambil kunci dan memberitahu kami bahawa kami boleh meneruskan. Apabila sambungan diwujudkan, pemerhati akan berfungsi. Dia akan menyemak sama ada acara SyncConnected telah tiba (seperti yang kita ingat, inilah yang ditangkap oleh pemerhati melalui CLI), dan kemudian menulis mesej. Seterusnya, kami mengambil kunci (sejak benang utama sebelum ini mengeluarkannya) dan memberitahu semua utas menunggu kunci yang boleh kami teruskan. Benang pemprosesan acara keluar dari blok disegerakkan, dengan itu melepaskan kunci. Benang utama menerima pemberitahuan dan, selepas menunggu kunci dilepaskan, meneruskan pelaksanaan, kerana sehingga ia menerima kunci, ia tidak akan dapat keluar dari blok yang disegerakkan dan terus bekerja. Oleh itu, menggunakan multithreading dan API Zookeeper, kita boleh melakukan pelbagai tindakan. API Zookeeper jauh lebih luas daripada yang dibenarkan oleh CLI. Sebagai contoh:
// 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"));
Seperti yang anda lihat, apabila mencipta nod kita boleh mengkonfigurasi ACL. Ini adalah satu lagi ciri penting. ACL ialah kebenaran yang digunakan pada tindakan dengan ZNode. Terdapat banyak tetapan, jadi saya syorkan anda merujuk kepada dokumentasi rasmi untuk butiran: " Kebenaran ACL Penjaga Zoo ".
Penjaga zoo atau cara hidup pekerja zoo - 11

Kesimpulan

Mengapa kita membaca ini? Kerana Zookeeper digunakan dalam teknologi popular yang lain. Contohnya, Apache Kafka memerlukan Zookeeper, yang boleh anda baca dalam " Panduan Mula Pantas Kafka ". Ia juga digunakan dalam pangkalan data NOSQL HBase, yang boleh anda baca lebih lanjut dalam " Panduan Mula Pantas HBase " mereka. Malah, banyak projek lain menggunakan Zookeeper. Sebahagian daripada mereka disenaraikan dalam " Menggunakan Zookeeper di Dunia Nyata ". Saya harap saya menjawab soalan "mengapa". Soalan yang paling penting sekarang ialah: "Apa yang seterusnya?" Mula-mula, anda boleh membaca buku berikut mengenai topik Apache Zookeeper: Kedua, terdapat laporan video yang sangat baik tentang Zookeeper. Tontonan yang disyorkan: Ketiga, terdapat beberapa artikel berguna yang akan melengkapkan gambaran dunia: Ini adalah ulasan yang sangat singkat, tetapi sebagai kata pengantar, saya harap ia akan berguna. #Viacheslav
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION