Uvod u Finagle

1. Pregled

U ovom ćemo uputstvu na brzinu pogledati Finagle, Twitterovu RPC biblioteku.

Upotrijebit ćemo ga za izgradnju jednostavnog klijenta i poslužitelja.

2. Građevinski blokovi

Prije nego što istražimo implementaciju, moramo upoznati osnovne pojmove koje ćemo koristiti za izgradnju svoje aplikacije. Široko su poznate, ali u Finaglovom svijetu mogu imati malo drugačije značenje.

2.1. Usluge

Usluge su funkcije predstavljene klasama koje uzimaju zahtjeve i vraćaju a Budućnost koji sadrži konačni rezultat operacije ili informacije o kvaru.

2.2. Filteri

Filteri su također funkcije. Uzimaju zahtjev i uslugu, izvršavaju neke radnje na zahtjevu, prosljeđuju ga službi i rade neke radnje na rezultirajućem Budućnost, i konačno vratiti finale Budućnost. Možemo ih smatrati aspektima jer mogu implementirati logiku koja se događa oko izvršavanja funkcije i promijeniti njezin ulaz i izlaz.

2.3. Budućnosti

Futures predstavljaju konačne rezultate asinkronih operacija. Mogu biti u jednoj od tri države: na čekanju, uspjeli ili nisu uspjeli.

3. Usluga

Prvo ćemo implementirati jednostavnu uslugu HTTP pozdravljanja. Uzet će parametar imena iz zahtjeva, odgovoriti i dodati uobičajenu poruku "Zdravo".

Da bismo to učinili, moramo stvoriti klasu koja će proširiti sažetak Servis razred iz knjižnice Finagle, provodeći svoje primijeniti metoda.

Ovo što radimo izgleda slično implementaciji funkcionalnog sučelja. Zanimljivo je da tu specifičnu značajku zapravo ne možemo koristiti jer je Finagle napisan na Scali, a mi koristimo interoperabilnost Java-Scala:

javna klasa GreetingService proširuje uslugu {@Override public Future apply (zahtjev za zahtjevom) {String pozdrav = "Pozdrav" + request.getParam ("name"); Čitač čitača = Reader.fromBuf (novi Buf.ByteArray (pozdrav.getBytes (), 0, pozdrav.duljina ())); return Future.value (Response.apply (request.version (), Status.Ok (), čitač)); }}

4. Filtar

Zatim ćemo napisati filtar koji će zabilježiti neke podatke o zahtjevu na konzolu. Slično Servis, trebat ćemo provesti filtar‘S primijeniti metoda koja će uzeti zahtjev i vratiti a Budućnost odgovor, ali ovaj put će i uslugu uzeti kao drugi parametar.

Osnovni filtar klasa ima četiri parametra tipa, ali vrlo često ne trebamo mijenjati vrste zahtjeva i odgovora unutar filtra.

Za to ćemo upotrijebiti SimpleFilter koji spaja četiri parametra tipa u dva. Ispisat ćemo neke podatke iz zahtjeva, a zatim jednostavno pozvati primijeniti metoda iz pružene usluge:

javna klasa LogFilter proširuje SimpleFilter {@Override public Future apply (Zahtjev za zahtjev, usluga servisa) {logger.info ("Zahtjev domaćina:" + request.host (). getOrElse (() -> "")); logger.info ("Zahtjev za params:"); request.getParams (). forEach (entry -> logger.info ("\ t" + entry.getKey () + ":" + entry.getValue ())); usluga povrata.apply (zahtjev); }} 

5. Poslužitelj

Sada možemo koristiti uslugu i filtar za izgradnju poslužitelja koji će zapravo osluškivati ​​zahtjeve i obrađivati ​​ih.

Ovom ćemo poslužitelju pružiti uslugu koja sadrži i naš filtar i uslugu povezane u lancu i onda metoda:

Usluga serverService = novi LogFilter (). AndThen (novi GreetingService ()); Http.serve (": 8080", serverService);

6. Klijent

Konačno, trebamo klijenta da pošalje zahtjev našem poslužitelju.

Za to ćemo stvoriti HTTP uslugu pomoću prikladnog newService metoda iz Finagleove Http razred. Izravno će biti odgovoran za slanje zahtjeva.

Uz to, koristit ćemo isti filtar za bilježenje koji smo prije implementirali i povezati ga s HTTP uslugom. Tada ćemo samo trebati pozvati primijeniti metoda.

Ta posljednja operacija je asinkrona i njezini se konačni rezultati pohranjuju u Budućnost primjer. Mogli bismo pričekati ovo Budućnost uspjeti ili ne uspjeti, ali to bi bila operacija blokiranja i možda bismo je htjeli izbjeći. Umjesto toga, možemo implementirati povratni poziv koji će se aktivirati kada Budućnost uspije:

Usluga clientService = novi LogFilter (). AndThen (Http.newService (": 8080")); Zahtjev za zahtjevom = Zahtjev.apply (Method.Get (), "/? Name = John"); request.host ("localhost"); Budući odgovor = clientService.apply (zahtjev); Await.result (response .onSuccess (r -> {assertEquals ("Hello John", r.getContentString ()); return BoxedUnit.UNIT;}) .onFailure (r -> {throw new RuntimeException (r);})) ;

Imajte na umu da se vraćamo BoxedUnit.UNIT. Povratak Jedinica je Scalan način suočavanja s poništiti metode, pa to radimo ovdje kako bismo održali interoperabilnost.

7. Sažetak

U ovom uputstvu naučili smo kako izraditi jednostavan HTTP poslužitelj i klijenta pomoću Finagle-a, kao i kako uspostaviti međusobnu komunikaciju i razmjenu poruka.

Kao i uvijek, izvorni kod sa svim primjerima možete pronaći na GitHubu.


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