Bevezetés a Finagle-ba

1. Áttekintés

Ebben az oktatóanyagban gyorsan megnézzük a Finagle-t, a Twitter RPC könyvtárát.

Egy egyszerű kliens és szerver felépítésére használjuk fel.

2. Építőelemek

Mielőtt belemerülnénk a megvalósításba, meg kell ismernünk azokat az alapfogalmakat, amelyeket az alkalmazásunk felépítéséhez használunk. Széles körben ismertek, de Finagle világában kissé eltérő jelentéssel bírhatnak.

2.1. Szolgáltatások

A szolgáltatások olyan osztályok által képviselt funkciók, amelyek fogadják a kéréseket és visszaadják a Jövő amely tartalmazza a művelet végeredményét vagy információt a meghibásodásról.

2.2. Szűrők

A szűrők szintén funkciók. Fognak egy kérést és egy szolgáltatást, elvégeznek néhány műveletet a kérésen, továbbítják a szolgáltatásnak, elvégeznek néhány műveletet az eredményül Jövő, és végül adja vissza a döntőt Jövő. Gondolhatunk rájuk, mint szempontokra, mivel megvalósíthatják a függvény végrehajtása körüli logikát, és megváltoztathatják annak bemenetét és kimenetét.

2.3. Határidős

A jövő határozza meg az aszinkron műveletek végeredményét. A három állapot egyikében lehetnek: függőben, sikeresek vagy sikertelenek.

3. Szolgáltatás

Először egy egyszerű HTTP-üdvözlő szolgáltatást valósítunk meg. Kiveszi a névparamétert a kérésből, válaszol, és hozzáadja a szokásos „Hello” üzenetet.

Ehhez létre kell hoznunk egy osztályt, amely kiterjeszti az absztraktot Szolgáltatás osztály a Finagle könyvtárból, annak végrehajtása alkalmaz módszer.

Amit csinálunk, hasonlóan néz ki mint egy funkcionális felület. Érdekes, hogy valójában nem használhatjuk ezt a speciális szolgáltatást, mert a Finagle Scalában van megírva, és kihasználjuk a Java-Scala interoperabilitás előnyeit:

a GreetingService nyilvános osztály kiterjeszti a szolgáltatást. Reader olvasó = Reader.fromBuf (új Buf.ByteArray (üdvözlet.getBytes (), 0, üdvözlet.hossz ())); return Future.value (Response.apply (request.version (), Status.Ok (), olvasó)); }}

4. Szűrés

Ezután írunk egy szűrőt, amely naplózza a kérelem egyes adatait a konzolra. Hasonló Szolgáltatás, végre kell hajtanunk Szűrő’S alkalmaz metódus, amely fogadja a kérést és visszaadja a Jövő válasz, de ezúttal a szolgáltatást is második paraméterként veszi fel.

Az alap Szűrő osztálynak négy típusparamétere van, de nagyon gyakran nem kell megváltoztatnunk a szűrőn belüli kérések és válaszok típusát.

Ehhez a SimpleFilter amely a négy típusparamétert ketté egyesíti. Kinyomtatunk néhány információt a kérésből, majd egyszerűen meghívjuk a alkalmaz módszer a nyújtott szolgáltatásból:

a public class LogFilter kiterjeszti a SimpleFilter {@Override public Future Apply (Request request, Service service) {logger.info ("Request host:" + request.host (). getOrElse (() -> "")); logger.info ("Paramek kérése:"); request.getParams (). forEach (bejegyzés -> logger.info ("\ t" + entry.getKey () + ":" + entry.getValue ())); visszatérési szolgáltatás.alkalmazás (kérés); }} 

5. Szerver

Most a szolgáltatás és a szűrő segítségével felépíthetünk egy szervert, amely valóban meghallgatja a kéréseket és feldolgozza azokat.

Ezt a szervert olyan szolgáltatással látjuk el, amely mind a szűrőnket, mind a szolgáltatással együtt láncolt szolgáltatást tartalmazza és akkor módszer:

Service serverService = new LogFilter (). AndThen (új GreetingService ()); Http.serve (": 8080", serverService);

6. Ügyfél

Végül szükségünk van egy kliensre, aki kérést küld a szerverünkre.

Ehhez létrehozunk egy HTTP szolgáltatást a kényelmes használatával newService módszer a Finagle-től Http osztály. Közvetlenül felelős lesz a kérés elküldéséért.

Ezenkívül ugyanazt a naplózási szűrőt fogjuk használni, amelyet korábban megvalósítottunk, és láncoljuk a HTTP szolgáltatással. Akkor csak meg kell hívnunk a alkalmaz módszer.

Ez az utolsó művelet aszinkron, és annak eredményeit a Jövő példa. Várhatnánk erre Jövő sikert vagy kudarcot, de ez blokkoló művelet lenne, és érdemes lehet elkerülnünk. Ehelyett megvalósíthatunk egy visszahívást, amelyet akkor kell elindítani, amikor a Jövő sikerül:

Service clientService = új LogFilter (). És akkor (Http.newService (": 8080")); Request request = Request.apply (Method.Get (), "/? Name = John"); request.host ("localhost"); Jövőbeni válasz = clientService.apply (kérés); Várjon.eredmény (válasz .onSuccess (r -> {assertEquals ("Hello John", r.getContentString ()); return BoxedUnit.UNIT;}) .onFailure (r -> {dobjon új RuntimeException (r);})) ;

Vegye figyelembe, hogy visszatérünk BoxedUnit.UNIT. Visszatérve Mértékegység a Scala megbirkózási módja üres módszereket, ezért itt tesszük az interoperabilitás fenntartása érdekében.

7. Összegzés

Ebben az oktatóanyagban megtanultuk, hogyan kell felépíteni egy egyszerű HTTP kiszolgálót és egy klienst a Finagle segítségével, valamint hogyan lehet kommunikációt létrehozni közöttük és cserélni üzeneteket.

Mint mindig, a forráskód és az összes példa megtalálható a GitHubon.


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