Munka az Apache Thrift-szel

1. Áttekintés

Ebben a cikkben megtudhatjuk, hogyan lehet cross-platform kliens-szerver alkalmazásokat fejleszteni az Apache Thrift nevű RPC keretrendszer segítségével.

Kitérünk:

  • Adattípusok és szolgáltatási interfészek meghatározása az IDL-hez
  • A könyvtár telepítése és a források előállítása különböző nyelvekhez
  • A meghatározott interfészek megvalósítása egy adott nyelven
  • Kliens / szerver szoftver bevezetése

Ha egyenesen a példákra kíván térni, folytassa egyenesen az 5. szakasszal.

2. Apache takarékosság

Az Apache Thrift-et eredetileg a Facebook fejlesztői csapata fejlesztette ki, és jelenleg az Apache fenntartja.

Összehasonlítva a protokoll-pufferekkel, amelyek a platformok közötti objektumok sorosítási / deserializációs folyamatait kezelik, A Thrift elsősorban a rendszer összetevői közötti kommunikációs rétegre összpontosít.

A Thrift egy speciális interfészleíró nyelvet (IDL) használ az adattípusok és a szolgáltatási interfészek meghatározásához, amelyek a .takarékosság fájlokat, amelyeket később a fordító bemenetként használ a kliens és szerver szoftver forráskódjának előállításához, amelyek különböző programozási nyelveken kommunikálnak.

Az Apache Thrift használatához a projektben adja hozzá ezt a Maven-függőséget:

 org.apache.thrift libthrift 0.10.0 

A legújabb verziót a Maven tárházban találja meg.

3. Interfész Leírás Nyelv

Mint már leírtuk, az IDL lehetővé teszi a kommunikációs interfészek definiálását semleges nyelven. Az alábbiakban megtalálja a jelenleg támogatott típusokat.

3.1. Alaptípusok

  • bool - logikai érték (igaz vagy hamis)
  • byte - 8 bites előjelű egész szám
  • i16 - 16 bites előjelű egész szám
  • i32 - 32 bites előjelű egész szám
  • i64 - 64 bites előjelű egész szám
  • kettős - 64 bites lebegőpontos szám
  • húr - UTF-8 kódolással kódolt szöveges karakterlánc

3.2. Speciális típusok

  • bináris - kódolatlan bájtsorozat
  • választható - Java 8-as Választható típus

3.3. Struktúrák

Takarékosság felépíti egyenértékűek az OOP nyelvű osztályokkal, de öröklés nélkül. A strukturált erősen beírt mezőkből áll, amelyek mindegyikének egyedi neve van azonosítóként. A mezők különféle megjegyzésekkel rendelkezhetnek (numerikus mezőazonosítók, opcionális alapértelmezett értékek stb.).

3.4. Konténerek

A takarékos konténerek erősen tipizált konténerek:

  • lista - az elemek rendezett listája
  • készlet - egyedi elemek rendezetlen halmaza
  • térkép - az értékek szigorúan egyedi kulcsainak térképe

A konténerelemek bármilyen érvényes Thrift típusúak lehetnek.

3.5. Kivételek

A kivételek funkcionálisan egyenértékűek a következőkkel: felépíti, kivéve, hogy a bennszülött kivételektől örökölnek.

3.6. Szolgáltatások

A szolgáltatások valójában a Thrift típusok segítségével definiált kommunikációs interfészek. Ezek megnevezett függvényekből állnak, mindegyik paraméter-listával és visszatérési típussal rendelkezik.

4. Forráskód generálás

4.1. Nyelvi támogatás

A jelenleg támogatott nyelvek hosszú listája található:

  • C ++
  • C #
  • Megy
  • Haskell
  • Jáva
  • Javascript
  • Node.js
  • Perl
  • PHP
  • Piton
  • Rubin

A teljes listát itt ellenőrizheti.

4.2. A Library futtatható fájljának használata

Csak töltse le a legújabb verziót, szükség esetén készítse el és telepítse, és használja a következő szintaxist:

cd path / to / takarékos takarékosság -r --gen [LANGUAGE] [FILENAME]

A fenti parancsokban [NYELV] a támogatott nyelvek egyike és [FÁJL NÉV] egy IDL definíciójú fájl.

Vegye figyelembe a -r zászló. Azt mondja a Thriftnek, hogy rekurzívan állítson elő kódot, ha észreveszi, hogy tartalmaz egy adott elemet .takarékosság fájl.

4.3. A Maven beépülő modul használata

Adja hozzá a bővítményt a pom.xml fájl:

 org.apache.thrift.tools maven-thrift-plugin 0.1.11 path / to / takarékos takarékosság-források 

Ezután hajtsa végre a következő parancsot:

mvn tiszta telepítés

Ne feledje, hogy ennek a bővítménynek már nincs további karbantartása. Kérjük, látogasson el erre az oldalra további információkért.

5. Példa kliens-szerver alkalmazásra

5.1. A takarékosság fájl meghatározása

Írjunk néhány egyszerű szolgáltatást kivételekkel és struktúrákkal:

névtér cpp com.baeldung.thrift.impl névtér java com.baeldung.thrift.impl kivétel InvalidOperationException {1: i32 kód, 2: karakterlánc leírás} struct CrossPlatformResource {1: i32 id, 2: karakterlánc neve, 3: választható karakterlánc üdvözlet} szolgáltatás CrossPlatformService {CrossPlatformResource get (1: i32 id) dobások (1: InvalidOperationException e), érvénytelen mentés (1: CrossPlatformResource erőforrás) dobások (1: InvalidOperationException e), lista getList () dobások (1: InvalidOperationException e ) dob (1: InvalidOperationException e)}

Mint látható, a szintaxis meglehetősen egyszerű és magától értetődő. Meghatározunk egy névtérkészletet (implementációs nyelvenként), egy kivételtípust, egy struktúrát és végül egy szolgáltatási felületet, amelyet megosztanak a különböző összetevők.

Akkor csak tárolja a-ként szolgáltatás.takarékosság fájl.

5.2. Kód összeállítása és generálása

Itt az ideje, hogy futtassunk egy fordítót, amely előállítja nekünk a kódot:

takarékosság -r -out generált --gen java /path/to/service.thrift

Mint láthatja, külön zászlót adtunk hozzá -ki a létrehozott fájlok kimeneti könyvtárának megadásához. Ha nem talált hibát, a generált könyvtár 3 fájlt tartalmaz:

  • CrossPlatformResource.java
  • CrossPlatformService.java
  • InvalidOperationException.java

Generáljuk a szolgáltatás C ++ változatát a futtatással:

takarékosság -r -out generált --gen cpp /path/to/service.thrift

Most 2 különböző érvényes implementációt (Java és C ++) kapunk ugyanarról a szolgáltatási felületről.

5.3. Szolgáltatási megvalósítás hozzáadása

Bár a Thrift elvégezte helyettünk a munka nagy részét, mégis meg kell írnunk a saját megvalósításait CrossPlatformService. Ehhez csak a CrossPlatformService.Iface felület:

public class CrossPlatformServiceImpl implementálja a CrossPlatformService.Iface {@Override public CrossPlatformResource get (int id) dobja InvalidOperationException, TException {return new CrossPlatformResource (); } @Orride public void save (CrossPlatformResource resource) dobja az InvalidOperationException, TException {saveResource (); } @A nyilvános lista felülbírálása A getList () dobja az InvalidOperationException, TException {return Collections.emptyList (); } @Orride public boolean ping () InvalidOperationException, TException {return true; }}

5.4. Kiszolgáló írása

Mint mondtuk, egy platformon átívelő kliens-szerver alkalmazást akarunk létrehozni, ezért szükségünk van egy szerverre. Az Apache Thrift nagyszerű tulajdonsága, hogy saját kliens-szerver kommunikációs keretrendszerrel rendelkezik, amely a kommunikációt egy csomó torta teszi:

public class CrossPlatformServiceServer {public void start () dobja a TTransportException {TServerTransport serverTransport = új TServerSocket (9090); szerver = új TSimpleServer (új TServer.Args (serverTransport) .processzor (új CrossPlatformService.Processor (új CrossPlatformServiceImpl ()))); System.out.print ("A szerver indítása ..."); server.serve (); System.out.println ("kész."); } public void stop () {if (szerver! = null && server.isServing ()) {System.out.print ("A kiszolgáló leállítása ..."); server.stop (); System.out.println ("kész."); }}} 

Első dolog egy szállítási réteg meghatározása a TServerTransport interfész (vagy pontosabban absztrakt osztály). Mivel szerverről beszélünk, biztosítanunk kell egy portot a meghallgatáshoz. Akkor meg kell határoznunk a TServer példányt, és válassza ki a rendelkezésre álló megvalósítások egyikét:

  • TSimpleServer - egyszerű szerverhez
  • TThreadPoolServer - többszálas kiszolgálóhoz
  • TNonblockingServer - nem blokkoló többszálú szerverhez

És végül nyújtson egy processzor megvalósítást a kiválasztott szerver számára, amelyet a Thrift már generált nekünk, azaz CrossPlatofformService.Processor osztály.

5.5. Ügyfél írása

És itt van az ügyfél megvalósítása:

TTransport transport = új TSocket ("localhost", 9090); szállítás.nyit (); TProtocol protokoll = új TBinaryProtocol (szállítás); CrossPlatformService.Client kliens = új CrossPlatformService.Client (protokoll); logikai eredmény = kliens.ping (); szállítás.zár ();

Az ügyfél szempontjából a cselekvések meglehetősen hasonlóak.

Először határozza meg a szállítást, és irányítsa a szerver példányunkra, majd válassza ki a megfelelő protokollt. Az egyetlen különbség az, hogy itt inicializáljuk azt az ügyfélpéldányt, amelyet ismét a Thrift generált, azaz CrossPlatformService.Client osztály.

Mivel arra épül .takarékosság fájldefiníciókat közvetlenül az ott leírt módszereknek hívhatjuk. Ebben a konkrét példában client.ping () távoli hívást kezdeményez a kiszolgálóval, amelyikre válaszol igaz.

6. Következtetés

Ebben a cikkben bemutattuk az Apache Thrift használatának alapelveit és lépéseit, valamint bemutattuk, hogyan lehet létrehozni egy működő példát, amely a Thrift könyvtárat használja.

Mint általában, az összes példa mindig megtalálható a GitHub adattárban.