gRPC (original) (raw)

View this page

Toggle table of contents sidebar

gRPC ist ein modernes Open-Source-RPC (Remote Procedure Call)-Framework. Standardmäßig verwendet gRPCProtocol Buffers (Protobuf) als Interface Definition Language (IDL) zur Beschreibung sowohl des Interfaces als auch der Struktur der_Payload Messages_. In gRPC kann eine Clientanwendung direkt eine Methode auf einer entfernten Serveranwendung aufrufen als wäre es ein lokales Objekt, sodass verteilte Anwendungen und Dienste einfacher erstellt werden können. Wie in vielen RPC-Systemen basiert gRPC auf der Idee, einen Service zu definieren und die Methoden anzugeben, die mit ihren Parametern und Rückgabetypen aus der Ferne aufgerufen werden können. Der Server implementiert dieses Interface, um die Client-Aufrufe zu verarbeiten. Für den Client wurde ein sog. Stub generiert, der dieselben Methoden wie der Server bereitstellt.

Im folgenden die wesentlichen Design-Prinzipien von gRPC:

Ausgehend von einer Schnittstellendefinition in einer .proto-Datei bietet gRPC Protocol-Compiler-Plugins, die clientseitige und serverseitige APIs generieren. Das gRPC-Protokoll gibt abstrakt die Kommunikation zwischen Clients und Servern an:

  1. Zuerst wird der Stream vom Client mit einem obligatorischen Call Headergestartet
    1. gefolgt von optionalen Initial-Metadata
    2. gefolgt von optionalen Payload Messages.
      Die Inhalte von Call Header und Initial Metadata werden als HTTP/2-Headers mit HPACK komprimiert.
  2. Der Server antwortet mit optionalen Initial-Metadata
    1. gefolgt von Payload Messages
    2. und schließlich mit obligatorischem Status und optionalenStatus-Metadata.
      Payload-Nachrichten werden in einen Byte-Stream serialisiert, der in HTTP/2-Frames fragmentiert ist. Status und Trailing-Metadata werden als HTTP/2-Trailing-Headers gesendet.

Im Gegensatz zu FastAPI kann die gRPC-API jedoch nicht einfach auf der Kommandozeile mit cURL getestet werden. Ggf. könnt ihr jedoch grpcurl verwenden. Dies setzt jedoch voraus, dass der gRPC-Server das GRPC Server Reflection Protocol unterstützt. Üblicherweise sollte Reflection jedoch nur in der Entwicklungsphase zur Verfügung stehen. Dann könnt ihr jedoch grpcurl aufrufen, z.B. mit:

$ grpcurl localhost:9111 list