Uvod u Apache Custora

1. Uvod

Apache Curator je Java klijent za Apache Zookeeper, popularnu uslugu koordinacije distribuiranih aplikacija.

U ovom uputstvu predstavit ćemo neke od najrelevantnijih značajki koje pruža kustos:

  • Upravljanje vezama - upravljanje vezama i ponovnim pravilima
  • Async - poboljšanje postojećeg klijenta dodavanjem async mogućnosti i upotrebom Java 8 lambdas
  • Upravljanje konfiguracijom - ima centraliziranu konfiguraciju za sustav
  • Snažno tipizirani modeli - rad s tipiziranim modelima
  • Recepti - provođenje izbora za vođu, podijeljene brave ili brojači

2. Preduvjeti

Za početak se preporučuje da na brzinu pogledate čuvara zoološkog vrta Apache i njegove značajke.

Za ovaj vodič pretpostavljamo da već postoji samostalna instanca Zookeeper 127.0.0.1:2181; evo uputa kako ga instalirati i pokrenuti ako tek započinjete.

Prvo ćemo morati dodati ovisnost curator-x-async u našu pom.xml:

 org.apache.curator kurator-x-async 4.0.1 org.apache.zookeeper čuvar zoološkog vrta 

Najnovija verzija Apache Curator 4.X.X teško ovisi o Zookeeper 3.5.X koja je trenutno još uvijek u beta verziji.

Dakle, u ovom ćemo članku umjesto njega koristiti trenutno najnoviji stabilni Zookeeper 3.4.11.

Dakle, moramo isključiti ovisnost o Zookeeperu i dodati ovisnost za našu verziju Zookeeper u našu pom.xml:

 org.apache.zookeeper čuvar zoološkog vrta 3.4.11 

Za više informacija o kompatibilnosti pogledajte ovu vezu.

3. Upravljanje vezama

Osnovni slučaj upotrebe Apache Cutora je povezivanje s pokrenutom instancom Apache Zookeeper.

Alat nudi tvornicu za izgradnju veza sa Zookeeper-om pomoću pravila ponovnog pokušaja:

int sleepMsBetweenRetries = 100; int maxRetries = 3; RetryPolicy retryPolicy = novi RetryNTimes (maxRetries, sleepMsBetweenRetries); CuratorFramework client = CuratorFrameworkFactory .newClient ("127.0.0.1:2181", retryPolicy); client.start (); assertThat (client.checkExists (). forPath ("/")). isNotNull ();

U ovom brzom primjeru ponovit ćemo 3 puta i pričekat ćemo 100 ms između pokušaja u slučaju problema s povezivanjem.

Jednom kada se povežete sa Zookeeper-om pomoću KustosFramework klijenta, sada možemo pregledavati putove, dobivati ​​/ postavljati podatke i u osnovi komunicirati s poslužiteljem.

4. Asinkronizacija

Kurator Async modul obuzima gore navedeno KustosOkvir klijentu pružiti neblokirajuće mogućnosti koristeći CompletionStage Java 8 API.

Pogledajmo kako izgleda prethodni primjer pomoću omotača Async:

int sleepMsBetweenRetries = 100; int maxRetries = 3; RetryPolicy retryPolicy = novi RetryNTimes (maxRetries, sleepMsBetweenRetries); CuratorFramework client = CuratorFrameworkFactory .newClient ("127.0.0.1:2181", retryPolicy); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (klijent); AtomicBoolean postoji = novi AtomicBoolean (netačno); async.checkExists () .forPath ("/"). thenAcceptAsync (s -> postoji.set (s! = null)); await (). dok (() -> assertThat (существу.get ()). isTee ());

Sada, checkExists () operacija radi u asinkronom načinu rada, ne blokirajući glavnu nit. Također možemo lančati akcije jednu za drugom, koristeći thenAcceptAsync () umjesto toga, koja koristi CompletionStage API.

5. Upravljanje konfiguracijom

U distribuiranom okruženju jedan je od najčešćih izazova upravljanje zajedničkom konfiguracijom među mnogim aplikacijama. Zookeeper možemo koristiti kao spremište podataka u kojem ćemo zadržati našu konfiguraciju.

Pogledajmo primjer korištenja Apache Cutora za dobivanje i postavljanje podataka:

CuratorFramework client = newClient (); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (klijent); Ključ niza = getKey (); Očekivani niz = "moja_vrijednost"; client.create (). forPath (ključ); async.setData () .forPath (ključ, očekivani.getBytes ()); AtomicBoolean isEquals = novo AtomicBoolean (); async.getData () .forPath (ključ) .thenAccept (podaci -> isEquals.set (novi String (podaci) .equals (očekuje se))); await (). dok (() -> assertThat (isEquals.get ()). isTrue ());

U ovom primjeru kreiramo putanju čvora, postavljamo podatke u Zookeeper, a zatim ih oporavljamo provjeravajući je li vrijednost ista. The ključ polje može biti put čvora poput / config / dev / my_key.

5.1. Promatrači

Još jedna zanimljiva značajka Zookeeper-a je mogućnost gledanja tipki ili čvorova. Omogućuje nam osluškivanje promjena u konfiguraciji i ažuriranje naših aplikacija bez potrebe za ponovnim rasporedom.

Pogledajmo kako izgleda gornji primjer kada se koriste promatrači:

CuratorFramework client = newClient () client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (klijent); Ključ niza = getKey (); Očekivani niz = "moja_vrijednost"; async.create (). forPath (ključ); Promjene popisa = novi ArrayList (); async.watched () .getData () .forPath (ključ) .event (). thenAccept (WatchEvent -> {try {changes.add (novi String (client.getData () .forPath (gledanEvent.getPath ()))) ;} catch (Iznimka e) {// neuspjeh ...}}); // Postavljanje vrijednosti podataka za naš ključ async.setData () .forPath (ključ, očekivani.getBytes ()); await () .until (() -> assertThat (changes.size ()). isEqualTo (1));

Konfiguriramo promatrača, postavljamo podatke i zatim potvrđujemo da je pokrenuti promatrani događaj. Možemo odjednom gledati jedan čvor ili skup čvorova.

6. Snažno tipizirani modeli

Zookeeper prvenstveno radi s nizovima bajtova, pa moramo svoje podatke serializirati i deserializirati. To nam omogućuje određenu fleksibilnost za rad s bilo kojom serizibilnom instancom, ali može biti teško održavati.

Kao pomoć ovdje, kustos dodaje koncept tipiziranih modela koji delegira serializaciju / deserializaciju i omogućuje nam izravni rad s našim vrstama. Da vidimo kako to funkcionira.

Prvo, trebamo okvir serializatora. Kustos preporučuje uporabu Jacksonove implementacije, pa dodajmo ovisnost Jacksona našoj pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.9.4 

Pokušajmo sada održati našu prilagođenu klasu HostConfig:

javna klasa HostConfig {ime privatnog niza host; privatna int luka; // geteri i postavljači}

Moramo pružiti mapiranje specifikacija modela iz HostConfig klase do staze i upotrijebite modelirani omot okvira koji pruža Apache Curator:

ModelSpec mySpec = ModelSpec.builder (ZPath.parseWithIds ("/ config / dev"), JacksonModelSerializer.build (HostConfig.class)) .build (); CuratorFramework client = newClient (); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (klijent); ModeledFramework modeledClient = ModeledFramework.wrap (async, mySpec); modeledClient.set (novi HostConfig ("ime-domaćina", 8080)); modeledClient.read () .whenComplete ((value, e) -> {if (e! = null) {fail ("Cannot read host config", e);} else {assertThat (value) .isNotNull (); assertThat ( value.getHostname ()). isEqualTo ("ime-hosta"); assertThat (value.getPort ()). isEqualTo (8080);}});

The whenComplete () metoda pri čitanju putanje / config / dev vratit će HostConfig primjer u čuvaru zooloških vrtova.

7. Recepti

Zookeeper pruža ove smjernice za primjenu rješenja na visokoj razini ili recepti poput izbora čelnika, podijeljenih brava ili zajedničkih šaltera.

Apache Curator nudi primjenu za većinu ovih recepata. Da biste vidjeli cijeli popis, posjetite dokumentaciju Kustos recepti.

Svi ovi recepti dostupni su u zasebnom modulu:

 org.apache.curator kustos-recepti 4.0.1 

Krenimo odmah i krenimo ih razumijevati na nekoliko jednostavnih primjera.

7.1. Izbor za čelnika

U distribuiranom okruženju možda će nam trebati jedan glavni ili čvor voditelja za koordinaciju složenog posla.

Evo kako izgleda upotreba recepta za izbor vođe u kustosu:

CuratorFramework client = newClient (); client.start (); LeaderSelector leaderSelector = novi LeaderSelector (klijent, "/ mutex / select / leader / for / job / A", novi LeaderSelectorListener () {@Override public void stateChanged (CuratorFramework client, ConnectionState newState) {} @Override public void takeLeadership (CuratorFraderme) ) baca iznimku {}}); // pridruživanje članovima grupe leaderSelector.start (); // čekamo dok se posao A ne završi među svim članovima leaderSelector.close ();

Kada pokrenemo selektor voditelja, naš čvor se pridružuje grupi članova unutar putanje / mutex / select / lider / za / posao / A. Jednom kada naš čvor postane vođa, takeLeadership bit će pozvana metoda, a mi kao vođe možemo nastaviti posao.

7.2. Dijeljene brave

Recept Shared Lock odnosi se na potpuno distribuiranu bravu:

CuratorFramework client = newClient (); client.start (); InterProcessSemaphoreMutex sharedLock = novi InterProcessSemaphoreMutex (klijent, "/ mutex / process / A"); sharedLock.acquire (); // obrađujemo A sharedLock.release ();

Kada nabavimo bravu, Zookeeper osigurava da nijedna druga aplikacija ne stječe istu bravu u isto vrijeme.

7.3. Brojači

Recept Counters koordinira zajedničko korištenje Cijeli broj među svim klijentima:

CuratorFramework client = newClient (); client.start (); SharedCount brojač = novi SharedCount (klijent, "/ brojači / A", 0); counter.start (); counter.setCount (counter.getCount () + 1); assertThat (counter.getCount ()). isEqualTo (1);

U ovom primjeru Zookeeper pohranjuje Cijeli broj vrijednost na putu / brojači / A i inicijalizira vrijednost na 0 ako put još nije stvoren.

8. Zaključak

U ovom smo članku vidjeli kako koristiti Apache Curator za povezivanje s Apache Zookeeperom i iskoristiti njegove glavne značajke.

Također smo predstavili nekoliko glavnih recepata u Curatoru.

Kao i obično, izvore možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found