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.