Práca s Apache Thrift
1. Prehľad
V tomto článku zistíme, ako vyvíjať multiplatformné aplikácie typu klient-server pomocou RPC frameworku s názvom Apache Thrift.
Pokryjeme:
- Definovanie dátových typov a servisných rozhraní s IDL
- Inštalácia knižnice a generovanie zdrojov pre rôzne jazyky
- Implementácia definovaných rozhraní v konkrétnom jazyku
- Implementácia softvéru typu klient / server
Ak chcete ísť priamo k príkladom, pokračujte priamo k časti 5.
2. Apache Thrift
Apache Thrift bol pôvodne vyvinutý vývojovým tímom Facebooku a v súčasnosti je udržiavaný spoločnosťou Apache.
V porovnaní s protokolmi Buffers, ktoré riadia procesy serializácie / deserializácie objektov naprieč platformami, Thrift sa zameriava hlavne na komunikačnú vrstvu medzi komponentmi vášho systému.
Thrift používa na definovanie dátových typov a servisných rozhraní, ktoré sú uložené ako špeciálny jazyk IDL (Interface Description Language) . šetrnosť súbory a použité neskôr ako vstup kompilátora na generovanie zdrojového kódu klientskeho a serverového softvéru, ktorý komunikuje v rôznych programovacích jazykoch.
Ak chcete vo svojom projekte použiť Apache Thrift, pridajte túto závislosť Maven:
org.apache.thrift libthrift 0.10.0
Najnovšiu verziu nájdete v úložisku Maven.
3. Jazyk popisu rozhrania
Ako už bolo opísané, IDL umožňuje definovanie komunikačných rozhraní v neutrálnom jazyku. Ďalej nájdete aktuálne podporované typy.
3.1. Základné typy
- bool - boolovská hodnota (true alebo false)
- bajt - 8-bitové celé číslo so znamienkom
- i16 - 16-bitové celé číslo so znamienkom
- i32 - 32-bitové celé číslo so znamienkom
- i64 - 64-bitové celé číslo so znamienkom
- dvojitý - 64-bitové číslo s pohyblivou rádovou čiarkou
- povrázok - textový reťazec kódovaný pomocou kódovania UTF-8
3.2. Špeciálne typy
- binárne - postupnosť nekódovaných bajtov
- voliteľné - Java 8 Voliteľné typu
3.3. Štruktúry
Šetrnosť štruktúr sú ekvivalentom tried v jazykoch OOP, ale bez dedenia. A štruktúr má množinu polí so silným typom, každé s jedinečným názvom ako identifikátorom. Polia môžu mať rôzne anotácie (ID číselných polí, voliteľné predvolené hodnoty atď.).
3.4. Kontajnery
Šetrné kontajnery sú silne typované kontajnery:
- zoznam - zoradený zoznam prvkov
- nastaviť - neusporiadaná sada jedinečných prvkov
- mapa - mapa prísne jedinečných kľúčov k hodnotám
Prvky kontajnera môžu byť ľubovoľného platného typu Thrift.
3.5. Výnimky
Výnimky sú funkčne ekvivalentné s štruktúr, až na to, že dedia po pôvodných výnimkách.
3.6. Služby
Služby sú vlastne komunikačné rozhrania definované pomocou typov Thrift. Pozostávajú zo sady pomenovaných funkcií, každá so zoznamom parametrov a návratovým typom.
4. Generovanie zdrojového kódu
4.1. Jazyková podpora
Existuje dlhý zoznam momentálne podporovaných jazykov:
- C ++
- C #
- Choď
- Haskell
- Java
- Javascript
- Node.js
- Perl
- PHP
- Python
- Ruby
Celý zoznam si môžete pozrieť tu.
4.2. Používanie spustiteľného súboru knižnice
Stiahnite si najnovšiu verziu, podľa potreby ju zostavte a nainštalujte a použite nasledujúcu syntax:
cesta cd / do / šetrnosť šetrnosť -r --gen [JAZYK] [FILENAME]
Vo vyššie uvedených príkazoch [JAZYK] je jedným z podporovaných jazykov a [NÁZOV SÚBORU] je súbor s definíciou IDL.
Všimnite si -r vlajka. Povie Thriftu, aby generoval kód rekurzívne, akonáhle si všimne, že obsahuje daný kód . šetrnosť spis.
4.3. Používanie doplnku Maven
Pridajte doplnok do súboru pom.xml spis:
org.apache.thrift.tools maven-thrift-plugin 0.1.11 cesta / k / thrift thrift-sources generovať-zdroje kompilovať
Potom stačí vykonať nasledujúci príkaz:
mvn čistá inštalácia
Upozorňujeme, že tento doplnok už nebude mať žiadnu ďalšiu údržbu. Viac informácií nájdete na tejto stránke.
5. Príklad aplikácie klient-server
5.1. Definovanie súboru šetrenia
Napíšme niekoľko jednoduchých služieb s výnimkami a štruktúrami:
namespace cpp com.baeldung.thrift.impl namespace java com.baeldung.thrift.impl výnimka InvalidOperationException {1: kód i32, 2: popis reťazca} struct CrossPlatformResource {1: i32 id, 2: názov reťazca, 3: voliteľný pozdrav reťazca} služba CrossPlatformService {CrossPlatformResource get (1: i32 id) hodí (1: InvalidOperationException e), void save (1: CrossPlatformResource zdroj) hodí (1: InvalidOperationException e), zoznam getList () hodí (1: InvalidOperationException e), bool ping ( ) hodí (1: InvalidOperationException e)}
Ako vidíte, syntax je dosť jednoduchá a zrozumiteľná. Definujeme množinu menných priestorov (podľa implementačného jazyka), typ výnimky, štruktúru a nakoniec rozhranie služby, ktoré sa bude zdieľať medzi rôznymi komponentmi.
Potom ho stačí uložiť ako služba. šetrnosť spis.
5.2. Zostavenie a generovanie kódu
Teraz je čas spustiť kompilátor, ktorý nám vygeneruje kód:
thrift -r -out vygenerovaný --gen java /path/to/service.thrift
Ako ste mohli vidieť, pridali sme špeciálnu vlajku -von určiť výstupný adresár pre vygenerované súbory. Ak ste nedostali žiadne chyby, generované adresár bude obsahovať 3 súbory:
- CrossPlatformResource.java
- CrossPlatformService.java
- InvalidOperationException.java
Vygenerujme verziu služby v C ++ spustením:
thrift -r -out vygenerovaný --gen cpp /path/to/service.thrift
Teraz dostaneme 2 rôzne platné implementácie (Java a C ++) toho istého rozhrania služby.
5.3. Pridanie implementácie služby
Aj keď Thrift za nás odviedol väčšinu práce, stále musíme napísať vlastné implementácie CrossPlatformService. Aby sme to dosiahli, musíme iba implementovať a CrossPlatformService.Iface rozhranie:
verejná trieda CrossPlatformServiceImpl implementuje CrossPlatformService.Iface {@Override public CrossPlatformResource get (int id) hodí InvalidOperationException, TException {return new CrossPlatformResource (); } @Override public void save (prostriedok CrossPlatformResource) vyvolá InvalidOperationException, TException {saveResource (); } @Override public List getList () vyvolá InvalidOperationException, TException {return Collections.emptyList (); } @Override public boolean ping () hodí InvalidOperationException, TException {return true; }}
5.4. Zápis na server
Ako sme už povedali, chceme vytvoriť multiplatformnú aplikáciu klient-server, preto pre ňu potrebujeme server. Skvelá vec na Apache Thrift je, že má svoj vlastný komunikačný rámec klient-server, vďaka ktorému je komunikácia hračkou:
public class CrossPlatformServiceServer {public void start () hodí TTransportException {TServerTransport serverTransport = nový TServerSocket (9090); server = nový TSimpleServer (nový TServer.Args (serverTransport) .processor (nový CrossPlatformService.Processor (nový CrossPlatformServiceImpl ()))); System.out.print ("Spustenie servera ..."); server.serve (); System.out.println ("hotovo."); } public void stop () {if (server! = null && server.isServing ()) {System.out.print ("Zastavenie servera ..."); server.stop (); System.out.println ("hotovo."); }}}
Prvá vec je definovať transportnú vrstvu s implementáciou TServerTransport rozhranie (alebo presnejšia abstraktná trieda). Keďže hovoríme o serveri, musíme poskytnúť port, ktorý budeme počúvať. Potom musíme definovať a TServer inštanciu a vyberte jednu z dostupných implementácií:
- TSimpleServer - pre jednoduchý server
- TThreadPoolServer - pre server s viacerými vláknami
- TNonblockingServer - pre neblokujúci server s viacerými vláknami
A nakoniec poskytnite implementáciu procesora pre vybraný server, ktorý pre nás už vygeneroval Thrift, t.j. CrossPlatofformService.Procesor trieda.
5.5. Písanie klientov
A tu je implementácia klienta:
TTopravná doprava = nový TSocket ("localhost", 9090); transport.open (); Protokol TProtocol = nový TBinaryProtocol (prenos); CrossPlatformService.Client client = nový CrossPlatformService.Client (protokol); boolovsky vysledok = client.ping (); transport.close ();
Z pohľadu klienta sú akcie dosť podobné.
Najskôr definujte prenos, nasmerujte ho na našu inštanciu servera a potom vyberte vhodný protokol. Jediný rozdiel je v tom, že tu inicializujeme inštanciu klienta, ktorá bola už raz vygenerovaná Thriftom, t.j. CrossPlatformService.Client trieda.
Keďže vychádza . šetrnosť definície súborov, ktoré môžeme priamo nazvať metódami, ktoré sú tam opísané. V tomto konkrétnom príklade client.ping () uskutoční vzdialené volanie na server, ktorý odpovie pomocou pravda.
6. Záver
V tomto článku sme si ukázali základné koncepty a kroky pri práci s Apache Thrift a ukázali sme, ako vytvoriť pracovný príklad, ktorý využíva knižnicu Thrift.
Všetky príklady ako obvykle vždy nájdete v úložisku GitHub.