Úvod do gRPC

1. Úvod

gRPC je vysoko výkonný open source RPC rámec pôvodne vyvinutý spoločnosťou Google. Pomáha eliminovať štandardný kód a pomáha pri pripájaní služieb polyglot v dátových centrách a medzi nimi.

2. Prehľad

Rámec je založený na modeli klient-server vzdialených volaní procedúr. Klientska aplikácia môže priamo volať metódy na serverovej aplikácii, akoby išlo o lokálny objekt.

Tento článok použije nasledujúce kroky na vytvorenie typickej aplikácie klient-server pomocou gRPC:

  1. Definujte službu v a .protokolovať spis
  2. Generujte kód servera a klienta pomocou kompilátora medzipamäte protokolu
  3. Vytvorte serverovú aplikáciu, implementujte vygenerované servisné rozhrania a vytvorte server gRPC
  4. Vytvorte klientsku aplikáciu a uskutočňujte hovory RPC pomocou vygenerovaných stubov

Definujme jednoduchý HelloService ktorý vracia pozdravy výmenou za meno a priezvisko.

3. Závislosti Maven

Pridajme závislosti grpc-netty, grpc-protobuf a grpc-stub:

 io.grpc grpc-netty 1.16.1 io.grpc grpc-protobuf 1.16.1 io.grpc grpc-stub 1.16.1 

4. Definovanie služby

Začíname definovaním služby, špecifikovanie metód, ktoré možno volať na diaľku spolu s ich parametrami a návratovými typmi.

To sa deje v .protokolovať súbor pomocou vyrovnávacích pamätí protokolu. Používajú sa tiež na opis štruktúry správ o užitočnom zaťažení.

4.1. Základné konfigurácie

Vytvorme HelloService.proto súbor pre našu vzorku HelloService. Začneme pridaním niekoľkých základných podrobností konfigurácie:

syntax = "proto3"; možnosť java_multiple_files = true; balík org.baeldung.grpc;

Prvý riadok informuje kompilátor o tom, aká syntax sa používa v tomto súbore. Kompilátor štandardne generuje všetok kód Java v jednom súbore Java. Druhý riadok prepíše toto nastavenie a všetko sa vygeneruje v jednotlivých súboroch.

Na záver určíme balíček, ktorý chceme použiť pre naše generované triedy Java.

4.2. Definovanie štruktúry správy

Ďalej definujeme správu:

správa HelloRequest {string firstName = 1; reťazec priezvisko = 2; }

Toto definuje užitočné zaťaženie žiadosti. Tu je definovaný každý atribút, ktorý vstupuje do správy, spolu s jej typom.

Každému atribútu je potrebné priradiť jedinečné číslo, ktoré sa nazýva značka. Túto značku používa medzipamäť protokolu na vyjadrenie atribútu namiesto použitia názvu atribútu.

Takže na rozdiel od JSON, kde by sme odovzdali názov atribútu krstné meno zakaždým by vyrovnávacia pamäť protokolu reprezentovala číslo 1 krstné meno. Definícia užitočného zaťaženia odpovede je podobná požiadavke.

Rovnakú značku môžeme použiť vo viacerých typoch správ:

správa HelloResponse {string pozdrav = 1; }

4.3. Definovanie zmluvy o poskytovaní služieb

Na záver definujeme zmluvu o poskytovaní služieb. Pre naše HelloService definujeme a Ahoj() prevádzka:

služba HelloService {rpc ahoj (HelloRequest) vráti (HelloResponse); }

The Ahoj() operácia prijme unárnu požiadavku a vráti unárnu odpoveď. gRPC podporuje aj streamovanie pomocou prefixov Prúd kľúčové slovo na požiadavku a odpoveď.

5. Generovanie kódu

Teraz míňame HelloService.proto súbor do kompilátora vyrovnávacej pamäte protokolu protoc na generovanie súborov Java. Existuje niekoľko spôsobov, ako to spustiť.

5.1. Pomocou protokolu Buffer Compiler

Najprv potrebujeme kompilátor vyrovnávacej pamäte protokolu. Môžeme si vybrať z mnohých predkompilovaných binárnych súborov, ktoré sú tu k dispozícii.

Ďalej musíme získať modul gRPC Java Codegen Plugin.

Nakoniec môžeme na vygenerovanie kódu použiť nasledujúci príkaz:

protoc --plugin = protoc-gen-grpc-java = $ PATH_TO_PLUGIN -I = $ SRC_DIR --java_out = $ DST_DIR --grpc-java_out = $ DST_DIR $ SRC_DIR / HelloService.proto

5.2. Používanie doplnku Maven

Ako vývojár by ste chceli, aby bolo generovanie kódu úzko integrované s vašim zostavovacím systémom. gRPC poskytuje a protobuf-maven-plugin pre systém zostavenia Maven:

   kr.motd.maven os-maven-plugin 1.6.1 org.xolstice.maven.plugins protobuf-maven-plugin 0.6.1 com.google.protobuf: protoc: 3.3.0: exe: $ {os.detected.classifier} grpc-java io.grpc: protoc-gen-grpc-java: 1.4.0: exe: $ {os.detected.classifier} kompilovať kompiláciu-custom 

Prípona / doplnok os-maven-plugin generuje rôzne užitočné vlastnosti projektu závislé od platformy, ako napr $ {os.detected.classifier}

6. Vytvorenie servera

Bez ohľadu na to, akú metódu použijete na generovanie kódu, budú vygenerované nasledujúce kľúčové súbory:

  • HelloRequest.java - obsahuje HelloRequest definícia typu
  • HelloResponse.javatoto obsahuje HelleResponse definícia typu
  • HelloServiceImplBase.javatoto obsahuje abstraktnú triedu HelloServiceImplBase ktorá poskytuje implementáciu všetkých operácií, ktoré sme definovali v rozhraní služby

6.1. Prekonanie triedy základnej služby

The predvolená implementácia abstraktnej triedy HelloServiceImplBase je hodiť runtime výnimkuio.grpc.StatusRuntimeException hovorí, že metóda sa neimplementuje.

Túto triedu rozšírime a prepíšeme Ahoj() metóda uvedená v našej definícii služby:

verejná trieda HelloServiceImpl rozširuje HelloServiceImplBase {@Override public void ahoj (požiadavka HelloRequest, StreamObserver responseObserver) {pozdrav reťazca = nový StringBuilder () .append ("Hello,") .append (request.getFirstName ()) .append (""). append (request.getLastName ()) .toString (); Odpoveď HelloResponse = HelloResponse.newBuilder () .setGreeting (pozdrav) .build (); responseObserver.onNext (odpoveď); responseObserver.onCompleted (); }}

Ak porovnáme podpis Ahoj() s tým, ktorý sme napísali v HellService.proto súboru, všimneme si, že sa nevráti HelloResponse. Namiesto toho berie druhý argument ako StreamObserver, čo je pozorovateľ odpovedí, spätné volanie pre server, aby zavolal s jeho odpoveďou.

Tadiaľto klient dostane možnosť uskutočniť blokujúci hovor alebo neblokujúci hovor.

gRPC používa na vytváranie objektov pomocné programy. Používame HelloResponse.newBuilder () a nastavte text pozdravu na vytvorenie a HelloResponse objekt. Tento objekt sme nastavili na responseObserver onNext () spôsob jeho zaslania klientovi.

Nakoniec musíme zavolať onCompleted () špecifikovať, že sme ukončili prácu s RPC, inak bude spojenie pozastavené a klient bude iba čakať na ďalšie informácie.

6.2. Spustenie servera Grpc

Ďalej musíme spustiť server gRPC, aby sme mohli počúvať prichádzajúce požiadavky:

public class GrpcServer {public static void main (String [] args) {Server server = ServerBuilder .forPort (8080) .addService (new HelloServiceImpl ()). build (); server.start (); server.awaitTermination (); }}

Tu opäť použijeme program na vytvorenie servera gRPC na porte 8080 a pridáme server HelloServiceImpl službu, ktorú sme definovali. štart () by spustil server. V našom príklade zavoláme awaitTermination () aby server fungoval v popredí a blokoval výzvu.

7. Vytvorenie klienta

gRPC poskytuje konštrukciu kanála, ktorá abstrahuje základné detaily ako pripojenie, združenie pripojení, vyvažovanie záťaže atď.

Vytvoríme kanál pomocou ManagedChannelBuilder. Tu zadáme adresu servera a port.

Budeme používať obyčajný text bez šifrovania:

public class GrpcClient {public static void main (String [] args) {ManagedChannel channel = ManagedChannelBuilder.forAddress ("localhost", 8080) .usePlaintext () .build (); HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub (kanál); HelloResponse helloResponse = stub.hello (HelloRequest.newBuilder () .setFirstName ("Baeldung") .setLastName ("gRPC") .build ()); channel.shutdown (); }}

Ďalej musíme vytvoriť pahýľ, ktorý použijeme na uskutočnenie vzdialeného hovoru Ahoj(). Pahýľ je hlavný spôsob interakcie klientov so serverom. Pri použití automaticky generovaných stubov bude mať trieda stubov konštruktory na zabalenie kanála.

Tu používame blokovanie / synchrónny stub, aby volanie RPC čakalo na odpoveď servera, a buď vráti odpoveď, alebo vyvolá výnimku. GRPC poskytuje ďalšie dva typy stubov, ktoré uľahčujú neblokujúce / asynchrónne volania.

Nakoniec je čas urobiť Ahoj() Hovor RPC. Tu míňame HelloRequest. Na nastavenie môžeme použiť automaticky generované nastavovače krstné meno, priezvisko atribúty HelloRequest objekt.

Vraciame sa späť HelloResponse objekt vrátený zo servera.

8. Záver

V tomto tutoriáli sme videli, ako by sme mohli pomocou gRPC uľahčiť vývoj komunikácie medzi dvoma službami zameraním na definovanie služby a nechať gRPC spracovať všetok štandardný kód.

Ako obvykle, zdroje nájdete na GitHub.


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