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.