Úvod do spoločnosti Finagle

1. Prehľad

V tomto návode sa rýchlo pozrieme na Finagle, knižnicu RPC na Twitteri.

Použijeme ho na vytvorenie jednoduchého klienta a servera.

2. Stavebné bloky

Predtým, ako sa pustíme do implementácie, musíme poznať základné pojmy, ktoré použijeme pri zostavovaní našej aplikácie. Sú všeobecne známe, ale vo Finaglovom svete môžu mať trochu iný význam.

2.1. Služby

Služby sú funkcie reprezentované triedami, ktoré prijímajú žiadosti a vracajú a Budúcnosť obsahujúce konečný výsledok operácie alebo informácie o poruche.

2.2. Filtre

Filtre sú tiež funkcie. Vezmú požiadavku a službu, urobia nejaké operácie na požiadanie, odovzdajú to službe, urobia nejaké operácie na výslednom Budúcnosť, a nakoniec vrátiť finále Budúcnosť. Môžeme ich považovať za aspekty, pretože môžu implementovať logiku, ktorá sa deje okolo vykonávania funkcie a meniť jej vstup a výstup.

2.3. Budúcnosť

Futures predstavujú konečné výsledky asynchrónnych operácií. Môžu byť v jednom z troch stavov: čakajúci na konanie, úspešný alebo neúspešný.

3. Služba

Najskôr implementujeme jednoduchú pozdravnú službu HTTP. Z požiadavky sa vezme parameter name, odpovie sa a pridá sa obvyklá správa „Hello“.

Aby sme to dosiahli, musíme vytvoriť triedu, ktorá rozšíri abstrakt Služby trieda z knižnice Finagle, jeho implementáciu uplatniť metóda.

To, čo robíme, vyzerá podobne ako implementácia funkčného rozhrania. Je zaujímavé, že túto konkrétnu vlastnosť vlastne nemôžeme použiť, pretože Finagle je napísaný v Scale a využívame výhody interoperability Java-Scala:

public class GreetingService rozširuje službu {@Override public Future apply (požiadavka na požiadavku) {String pozdrav = "Dobrý deň" + request.getParam ("meno"); Reader reader = Reader.fromBuf (nový Buf.ByteArray (pozdrav.getBytes (), 0, pozdrav.length ())); návrat Future.value (Response.apply (request.version (), Status.Ok (), čítačka)); }}

4. Filter

Ďalej napíšeme filter, ktorý zaznamená niektoré údaje o požiadavke do konzoly. Podobný Služby, budeme musieť implementovať Filtrovať‘S uplatniť metóda, ktorá vezme žiadosť a vráti a Budúcnosť odpoveď, ale tentoraz to bude služba tiež ako druhý parameter.

Základ Filtrovať trieda má štyri parametre typu, ale veľmi často nemusíme meniť typy požiadaviek a odpovedí vo vnútri filtra.

Na to použijeme SimpleFilter ktorá spája štyri parametre typu do dvoch. Z žiadosti vytlačíme niektoré informácie a potom jednoducho vyvolame uplatniť metóda z poskytovanej služby:

verejná trieda LogFilter rozširuje SimpleFilter {@Override public Future apply (požiadavka na požiadavku, servisná služba) {logger.info ("požiadavka na hostiteľa:" + request.host (). getOrElse (() -> "")); logger.info ("Vyžiadať parametre:"); request.getParams (). forEach (entry -> logger.info ("\ t" + entry.getKey () + ":" + entry.getValue ())); vrátenie služby.aplikovať (žiadosť); }} 

5. Server

Teraz môžeme pomocou služby a filtra vytvoriť server, ktorý bude skutočne poslúchať požiadavky a spracovávať ich.

Poskytneme tomuto serveru službu, ktorá obsahuje náš filter aj službu zreťazenú spolu s a potom metóda:

Servisný serverService = nový LogFilter (). A potom (nový GreetingService ()); Http.serve (": 8080", serverService);

6. Klient

Nakoniec potrebujeme klienta, ktorý pošle požiadavku na náš server.

Za týmto účelom vytvoríme službu HTTP pomocou pohodlného newService metóda od Finaglea Http trieda. Za odoslanie žiadosti bude priamo zodpovedný.

Ďalej použijeme rovnaký filter protokolovania, aký sme implementovali predtým, a zreťazíme ho so službou HTTP. Potom už stačí vyvolať uplatniť metóda.

Posledná operácia je asynchrónna a jej prípadné výsledky sa ukladajú do súboru Budúcnosť inštancia. Mohli sme si počkať Budúcnosť uspieť alebo zlyhať, ale to by bola blokujúca operácia a možno by sme sa jej chceli vyhnúť. Namiesto toho môžeme implementovať spätné volanie, ktoré sa má spustiť, keď Budúcnosť uspeje:

Služba clientService = nový LogFilter (). A potom (Http.newService (": 8080")); Žiadosť request = Request.apply (Method.Get (), "/? Name = John"); request.host ("localhost"); Budúca odpoveď = clientService.apply (požiadavka); Await.result (response .onSuccess (r -> {assertEquals ("Hello John", r.getContentString ()); return BoxedUnit.UNIT;}) .onFailure (r -> {hodiť nový RuntimeException (r);})) ;

Všimnite si, že sa vraciame BoxedUnit.UNIT. Vracia sa Jednotka je spôsob riešenia problému Scaly neplatný metódami, tak to robíme tu, aby sme zachovali interoperabilitu.

7. Zhrnutie

V tomto tutoriáli sme sa naučili, ako vytvoriť jednoduchý server HTTP a klienta pomocou Finagle, ako aj nadviazať komunikáciu medzi nimi a vymieňať si správy.

Ako vždy, zdrojový kód so všetkými príkladmi nájdete na GitHub.


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