GRPC

gRPC
Sorts ram för anrop för fjärranrop
Utvecklaren Google
Skrivet i Android Java, C#, C++, Dart, Go, Java, Kotlin/JVM, Node.js, Objective-C, PHP, Python, Ruby
Första upplagan augusti 2016  ( 2016-08 )
senaste versionen 1.33.2
Licens Apache-licens 2.0
Hemsida grpc.io

gRPC ( Remote Procedure Calls ) är ett RPC -system ( Remote Procedure Call) med öppen källkod som ursprungligen utvecklades av Google 2015. HTTP/2 används som transport, Protocol Buffers används som gränssnittsbeskrivningsspråk . gRPC tillhandahåller funktioner som autentisering, dubbelriktad strömning och flödeskontroll, blockerande eller icke-blockerande bindningar, och annullering och timeout. Genererar plattformsoberoende klient- och serverbindningar för många språk. Det används oftast för att ansluta tjänster i en arkitektur av mikrotjänster och för att ansluta mobila enheter och webbläsarklienter till back-end-tjänster.

Den komplexa användningen av HTTP/2 i gRPC gör det omöjligt att implementera en gRPC-klient i en webbläsare – istället krävs en proxy.

Autentisering

gRPC stöder användningen av TLS och tokenbaserad autentisering . Anslutning till Googles tjänster måste använda TLS . Det finns två typer av autentiseringsuppgifter: kanaluppgifter och anropsuppgifter.

Datakodningsmetod

gRPC använder Protocol Buffers för att koda data. Till skillnad från HTTP API med JSON har de en striktare specifikation.

Översikt

I gRPC kan en klientapplikation direkt anropa en serverapplikationsmetod på en annan maskin som om det vore ett lokalt objekt, vilket gör det lättare att skapa distribuerade applikationer och tjänster. Liksom många RPC-system är gRPC baserad på idén om att definiera en tjänst, definiera metoder som kan anropas på distans med sina parametrar och returtyper. På serversidan implementerar servern detta gränssnitt och startar gRPC-servern för att behandla klientanrop. På klientsidan finns en stubb (som helt enkelt kallas klienten på vissa språk) som exponerar samma metoder som servern.

gRPC- klienter och -servrar kan köras och kommunicera med varandra i en mängd olika miljöer och kan skrivas på något av de gRPC-språk som stöds.

Kärnkoncept, arkitektur och livscykel

Som standard använder gRPC Protobuf som gränssnittsdefinitionsspråk ( IDL ) för att beskriva tjänstegränssnittet och nyttolastmeddelandestrukturen. Andra alternativ kan användas om så önskas.

gRPC låter dig definiera fyra typer av servicemetoder:

Använda API

Från och med en tjänstdefinition i .protoen fil tillhandahåller gRPC Protocol Buffers kompilatorplugin som genererar klient- och serverkod. gRPC-användare anropar vanligtvis dessa API:er på klientsidan och implementerar motsvarande API på serversidan.

Synkronicitet och asynkroni

Synkrona RPC:er, som blockerar tills ett svar tas emot från servern, är den närmaste approximationen till den proceduranropsabstraktion som RPC strävar efter. Å andra sidan är nätverk i sig asynkrona och i många scenarier är det användbart att kunna köra RPC utan att blockera den aktuella tråden.

gRPC programmerings-API på de flesta språk har både synkrona och asynkrona smaker.

RPC livscykel

Enär RPC

Klienten skickar en begäran och returnerar ett svar.

  1. Efter att en klient anropat en stubmetod meddelas servern att en RPC har anropats med klientens metadata för det anropet, metodnamnet och den angivna deadline, om tillämpligt.
  2. Servern kan då antingen omedelbart skicka tillbaka sin egen ursprungliga metadata (som måste skickas innan något svar) eller vänta på ett begäranmeddelande från klienten. Vad som händer först beror på den specifika applikationen.
  3. När servern tar emot ett klientbegäranmeddelande utför den allt arbete som krävs för att skapa och fylla i svaret. Svaret returneras sedan (om framgångsrikt) till klienten, tillsammans med statusinformation (en statuskod och ett valfritt statusmeddelande) och valfri slutlig metadata.
  4. Om svarsstatusen är "OK" får klienten ett svar som avslutar samtalet på klientsidan.

RPC för streaming på serversidan

Serverströmmande RPC liknar unär RPC, förutom att servern returnerar en ström av meddelanden som svar på en klientförfrågan. Efter att alla meddelanden har skickats skickas serverstatusinformation (en statuskod och ett valfritt statusmeddelande) och ytterligare slutlig metadata till klienten. Detta slutför bearbetningen på serversidan. Klienten avslutas när den har tagit emot alla meddelanden från servern.

RPC-strömmande klient

Strömmande klient RPC liknar unär RPC, förutom att klienten skickar en ström av meddelanden till servern istället för ett enda meddelande. Servern svarar med ett enda meddelande (tillsammans med dess statusinformation och ytterligare slutlig metadata), vanligtvis men inte nödvändigtvis efter att den har tagit emot alla klientens meddelanden.

Dubbelriktad strömmande RPC

I RPC med dubbelriktad streaming initieras samtalet genom att klienten anropar metoden och servern tar emot klientens metadata, metodnamn och deadline. Servern kan välja att skicka sin ursprungliga metadata, eller vänta på att klienten ska börja streama meddelanden.

Strömbehandling på klientsidan och på serversidan beror på applikationen. Eftersom de två trådarna är oberoende kan klienten och servern läsa och skriva meddelanden i valfri ordning. Servern kan till exempel vänta tills den har tagit emot alla klientens meddelanden innan de skriver sina egna meddelanden, eller så kan servern och klienten spela " ping pong " - servern tar emot en förfrågan, skickar sedan ett svar, sedan skickar klienten en annan begäran baserad på svaret och så vidare.

Deadlines / Timeouts

gRPC tillåter klienter att ange hur länge de är villiga att vänta på att en RPC ska slutföras innan RPC misslyckas. På serversidan kan servern fråga om en viss RPC har tagit timeout eller hur mycket tid som är kvar för RPC att slutföra.

Att ange en deadline eller timeout är språkberoende: vissa språk-API:er fungerar i termer av timeouts (en lång tid), och vissa språk-API:er fungerar i termer av en deadline (en fast tidpunkt) och kan ha eller inte ha en standarddeadline .

Uppsägning av RPC

I gRPC gör både klienten och servern oberoende och lokala bestämningar om framgången för ett samtal, och deras slutsatser kanske inte stämmer överens. Det betyder att man till exempel skulle kunna ha en RPC som lyckas på serversidan men misslyckas på klientsidan. Servern kan också besluta att avsluta innan klienten har skickat alla sina förfrågningar.

Avbryt RPC

Klienten eller servern kan avbryta RPC när som helst. Avbokning avslutar RPC omedelbart, så inget ytterligare arbete görs.

Metadata

Metadata är information om ett visst RPC-anrop (som autentiseringsdetaljer) i form av en lista med nyckel-värdepar, där nycklar är strängar och värden vanligtvis är strängar, men kan vara binära data. Metadatan är ogenomskinlig för själva gRPC - den tillåter klienten att tillhandahålla information relaterad till anropet till servern och vice versa.

Metadataåtkomst varierar beroende på språk.

Kanaler

En gRPC-kanal tillhandahåller en anslutning till en gRPC-server på den angivna värden och porten. Används när du skapar en klientstub. Klienter kan ange kanalargument för att ändra standardbeteendet för gRPC, som att aktivera eller inaktivera meddelandekomprimering.

Hur gRPC bestämmer sig för att stänga kanalen beror på språket. Vissa språk låter dig också fråga status för en kanal.

Acceptans

Ett antal olika organisationer har antagit gRPC som Square , Netflix , IBM , CoreOS , Docker , CockroachDB , Cisco , Juniper Networks , [1] Spotify , [2] och Dropbox . [3]

Open source-projektet u-bmc använder gRPC istället för IPMI . Den 8 januari 2019 tillkännagav Dropbox att nästa version av Courier, deras RPC-ramverk i hjärtat av deras SOA-arkitektur, kommer att migreras till gRPC, främst för att det passar bra med deras befintliga anpassade RPC-ramverk.

Se även

Anteckningar

  1. gRPC . grpc.io. _ Hämtad 24 februari 2020. Arkiverad från originalet 24 november 2020.
  2. gRPC på Spotify . jfokus.se _ Hämtad 12 maj 2020. Arkiverad från originalet 27 oktober 2021.
  3. Hur vi migrerade Dropbox från Nginx till Envoy . Dropbox.Tech . Hämtad 30 oktober 2020. Arkiverad från originalet 4 januari 2022.

Länkar