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.


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