Úvod do Apache Curator

1. Úvod

Apache Curator je klient Java pre populárnu koordinačnú službu Apache Zookeeper pre distribuované aplikácie.

V tomto tutoriáli predstavíme niektoré z najdôležitejších funkcií, ktoré poskytuje kurátor:

  • Správa pripojení - správa pripojení a politiky opakovania
  • Async - vylepšenie existujúceho klienta pridaním funkcií asynchronizácie a použitím Java 8 lambdas
  • Správa konfigurácie - s centralizovanou konfiguráciou systému
  • Silne napísané modely - práca s typovými modelmi
  • Recepty - implementácia volieb vedúcich, distribuované zámky alebo pulty

2. Predpoklady

Na úvod sa odporúča rýchlo sa pozrieť na Apache Zookeeper a jeho funkcie.

V tomto tutoriáli predpokladáme, že už existuje samostatná inštancia Zookeeper 127.0.0.1:2181; tu sú pokyny, ako ich nainštalovať a spustiť, ak ešte len začínate.

Najskôr do našej budeme musieť pridať závislosť curator-x-async pom.xml:

 org.apache.curator curator-x-async 4.0.1 org.apache.zookeeper zookeeper 

Posledná verzia Apache Curator 4.X.X má ťažkú ​​závislosť od Zookeeper 3.5.X. ktorá je momentálne stále v beta verzii.

V tomto článku teda použijeme namiesto toho momentálne najnovšiu stabilnú aplikáciu Zookeeper 3.4.11.

Musíme teda vylúčiť závislosť Zookeeper a pridať závislosť pre našu verziu Zookeeper k našej pom.xml:

 org.apache.zookeeper zookeeper 3.4.11 

Viac informácií o kompatibilite nájdete na tomto odkaze.

3. Správa pripojenia

Základným prípadom použitia Apache Curator je pripojenie k bežiacej inštancii Apache Zookeeper.

Tento nástroj poskytuje továreň na vytváranie pripojení k aplikácii Zookeeper pomocou politík opakovania:

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

V tomto rýchlom príklade to skúsime trikrát a v prípade problémov s pripojením počkáme medzi pokusmi 100 ms.

Po pripojení k aplikácii Zookeeper pomocou CuratorFramework klienta, môžeme teraz prechádzať cesty, získavať / nastavovať údaje a v podstate komunikovať so serverom.

4. Async

Modul Curator Async uzatvára vyššie uvedené CuratorFramework klientovi poskytnúť neblokujúce schopnosti pomocou rozhrania CompletionStage Java 8 API.

Pozrime sa, ako vyzerá predchádzajúci príklad pomocou obálky Async:

int sleepMsB BetweenRetries = 100; int maxRetries = 3; RetryPolicy retryPolicy = nový RetryNTimes (maxRetries, sleepMsB BetweenRetries); CuratorFramework client = CuratorFrameworkFactory .newClient ("127.0.0.1:2181", retryPolicy); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (klient); AtomicBoolean existuje = nový AtomicBoolean (false); async.checkExists () .forPath ("/") .thenAcceptAsync (s -> exists.set (s! = null)); await (). until (() -> assertThat (exists.get ()). isTrue ());

Teraz checkExists () prevádzka funguje v asynchrónnom režime, pričom neblokuje hlavné vlákno. Môžeme tiež reťaziť akcie jeden po druhom pomocou thenAcceptAsync () namiesto toho používa metóda CompletionStage API.

5. Správa konfigurácie

V distribuovanom prostredí je jednou z najbežnejších výziev správa zdieľanej konfigurácie medzi mnohými aplikáciami. Zookeeper môžeme použiť ako úložisko dát, kde si môžeme ponechať svoju konfiguráciu.

Pozrime sa na príklad použitia programu Apache Curator na získanie a nastavenie údajov:

CuratorFramework client = newClient (); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (klient); Reťazcový kľúč = getKey (); Očakávaný reťazec = "moja_hodnota"; client.create (). forPath (kľúč); async.setData () .forPath (kľúč, expect.getBytes ()); AtomicBoolean isEquals = new AtomicBoolean (); async.getData () .forPath (kľúč). potom Accept (údaje -> isEquals.set (nový reťazec (údaje) .equals (očakávané))); await (). until (() -> assertThat (isEquals.get ()). isTrue ());

V tomto príklade vytvoríme cestu uzla, nastavíme údaje v aplikácii Zookeeper a potom ich obnovíme a skontrolujeme, či je hodnota rovnaká. The kľúč pole môže byť cesta uzla / config / dev / my_key.

5.1. Strážcovia

Ďalšou zaujímavou funkciou aplikácie Zookeeper je schopnosť sledovať kľúče alebo uzly. Umožňuje nám to počúvať zmeny v konfigurácii a aktualizovať naše aplikácie bez potreby opätovného nasadenia.

Pozrime sa, ako vyzerá vyššie uvedený príklad pri používaní sledovacích zariadení:

CuratorFramework client = newClient () client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (klient); Reťazcový kľúč = getKey (); Očakávaný reťazec = "moja_hodnota"; async.create (). forPath (kľúč); Zoznam zmien = new ArrayList (); async.watched () .getData () .forPath (kľúč) .event () .thAcAccept (sledovanýEvent -> {vyskúšajte {changes.add (nový reťazec (client.getData () .forPath (sledovanýEvent.getPath ()))) ;} catch (Výnimka e) {// zlyhanie ...}}); // Nastaviť hodnotu údajov pre náš kľúč async.setData () .forPath (kľúč, expect.getBytes ()); await () .until (() -> assertThat (changes.size ()). isEqualTo (1));

Nakonfigurujeme sledovač, nastavíme údaje a potom potvrdíme, že sa sledovaná udalosť spustila. Môžeme sledovať jeden uzol alebo množinu uzlov naraz.

6. Silne napísané modely

Aplikácia Zookeeper primárne pracuje s bajtovými poliami, takže musíme naše údaje serializovať a deserializovať. To nám umožňuje určitú flexibilitu pri práci s ľubovoľnou serializovateľnou inštanciou, ale môže byť ťažké ju udržiavať.

Na pomoc tu Curator pridáva koncept písaných modelov, ktoré deleguje serializáciu / deserializáciu a umožňuje nám priamo pracovať s našimi typmi. Pozrime sa, ako to funguje.

Najprv potrebujeme rámec serializátora. Kurátor odporúča použiť Jacksonovu implementáciu, preto k nej pripočítajme Jacksonovu závislosť pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.9.4 

Teraz sa pokúsime vytrvať v našej vlastnej triede HostConfig:

public class HostConfig {private String hostname; súkromný int port; // zakladatelia a zakladatelia}

Musíme poskytnúť mapovanie špecifikácie modelu z HostConfig triedy na cestu a použite vymodelovaný framework wrapper poskytnutý Apache Curator:

ModelSpec mySpec = ModelSpec.builder (ZPath.parseWithIds ("/ config / dev"), JacksonModelSerializer.build (HostConfig.class)) .build (); CuratorFramework client = newClient (); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (klient); ModeledFramework modeledClient = ModeledFramework.wrap (async, mySpec); modeledClient.set (nový HostConfig ("názov hostiteľa", 8080)); modeledClient.read () .whenComplete ((value, e) -> {if (e! = null) {fail ("Can't read host config", e);} else {assertThat (value) .isNotNull (); assertThat ( value.getHostname ()). isEqualTo ("host-name"); assertThat (value.getPort ()). isEqualTo (8080);}});

The whenComplete () metóda pri čítaní cesty / config / dev vráti HostConfig napríklad v aplikácii Zookeeper.

7. Recepty

Zookeeper poskytuje toto usmernenie na implementáciu riešenia alebo recepty na vysokej úrovni, ako sú voľby vodcov, distribuované zámky alebo zdieľané pulty.

Apache Curator poskytuje implementáciu pre väčšinu z týchto receptov. Celý zoznam nájdete v dokumentácii Kurátorské recepty.

Všetky tieto recepty sú k dispozícii v samostatnom module:

 org.apache.curator curator-recepty 4.0.1 

Poďme na to a začneme im porozumieť na niekoľkých jednoduchých príkladoch.

7.1. Voľba vodcu

V distribuovanom prostredí môžeme potrebovať jeden hlavný alebo vedúci uzol na koordináciu zložitej úlohy.

Takto vyzerá použitie receptu Leader Election v aplikácii Curator:

CuratorFramework client = newClient (); client.start (); LeaderSelector leaderSelector = nový LeaderSelector (klient, "/ mutex / select / leader / for / job / A", nový LeaderSelectorListener () {@Override public void stateChanged (klient CuratorFramework, ConnectionState newState) {} @Override public void takeLeadership (klient CuratorFramework) ) hodí výnimku {}}); // pripojte sa k skupine členov leaderSelector.start (); // počkajte, kým sa úloha A nevykoná medzi všetkými členmi leaderSelector.close ();

Keď spustíme selektor vedúcich, náš uzol sa pripojí k skupine členov v rámci cesty / mutex / select / leader / pre / job / A. Akonáhle sa náš uzol stane vodcom, takeLeadership bude použitá metóda a my ako vodcovia môžeme pokračovať v práci.

7.2. Zdieľané zámky

Recept zdieľaného zámku je o tom, že máte plne distribuovaný zámok:

CuratorFramework client = newClient (); client.start (); InterProcessSemaphoreMutex sharedLock = nový InterProcessSemaphoreMutex (klient, "/ mutex / process / A"); sharedLock.acquire (); // urob proces A sharedLock.release ();

Keď získame zámok, Zookeeper zaistí, že neexistuje žiadna iná aplikácia, ktorá by získala rovnaký zámok v rovnakom čase.

7.3. Počítadlá

Recept Counters koordinuje zdieľané Celé číslo medzi všetkými klientmi:

CuratorFramework client = newClient (); client.start (); Počítadlo SharedCount = nový SharedCount (klient, "/ counters / A", 0); counter.start (); counter.setCount (counter.getCount () + 1); assertThat (counter.getCount ()). isEqualTo (1);

V tomto príklade Zookeeper ukladá Celé číslo hodnota v ceste / pulty / A a inicializuje hodnotu na 0 ak cesta ešte nebola vytvorená.

8. Záver

V tomto článku sme videli, ako používať kurzor Apache na pripojenie k Apache Zookeeper a ako využiť jeho hlavné funkcie.

V aplikácii Kurátor sme tiež predstavili niekoľko hlavných receptov.

Ako obvykle, zdroje nájdete na GitHub.


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