Services sicher und zuverlässig kommunizieren lassen mit gRPC

Der Nachrichtenaustausch über Remote Procedure Calls lässt sich zum Beispiel in Go einfach einrichten, von der Messages- und Server-Definition bis zum Client.

In Pocket speichern vorlesen Druckansicht 14 Kommentare lesen
Services sicher und zuverlässig kommunizieren lassen mit gRPC

(Bild: Vladimir Sukhachev/Shutterstock.com)

Lesezeit: 18 Min.
Von
  • Frank Müller
Inhaltsverzeichnis

Die Geschichte der Interprozesskommunikation via Remote Procedure Calls (RPC) ist lang – Beispiele sind CORBA, RMI, XML-RPC und JSON-RPC sowie die heute in vielen Webanwendungen eingesetzten RESTful APIs. Alle RPC-Varianten haben ihre Stärken und Schwächen. Als Anbieter zahlreicher Internet- und Clouddienste hat Google ein besonderes Interesse an einem gut funktionierenden Stack für die Kommunikation im Netzwerk und daher bereits vor 15 Jahren Stubby intern entwickelt und eingesetzt. Daraus sind die allgemein verfügbaren gRPC (Google Remote Procedure Calls) hervorgegangen.

In die Entwicklung von Stubby konnte Google Erfahrung mit heterogenen und verteilten Rechenzentren sowie Programmiersprachen wie Go einfließen lassen. Ziel dabei war es, die Anforderungen an eine zuverlässige und sichere Kommunikation zu erfüllen, die zudem effizient arbeitet und das weitere Wachstum des Unternehmens unterstützt. Das proprietäre Stubby erhielt jedoch schnell Konkurrenz durch SPDY und HTTP/2 sowie weitere offene Standards, die neue Funktionen boten. Auch den Anforderungen durch zunehmendes Mobile Computing, die Cloud und das Internet der Dinge konnte Stubby nicht erfüllen.

Für die Weiterentwicklung definierte Google einige Rahmenbedingungen, die schließlich den Weg für die gRPC Remote Procedure Calls freimachen sollten. Anstelle der Kommunikation zwischen Objekten, wie von RMI oder CORBA bekannt, sollten beliebige Clients und auf Servern arbeitende Services untereinander Nachrichten austauschen – und das auf der bewährten Infrastruktur des Internets. Darüber hinaus sollte gRPC portabel sein und sich auf unterschiedlichsten Plattformen bis hin zu Systemen mit eingeschränkter CPU- und Speicherausstattung nutzen lassen – beispielsweise auch in IoT-Umgebungen. Auch das vom Messaging bekannte bidirektionale Streaming zwischen einem Client und einem Service floss in die gRPC-Entwicklung ein.

Der Stack des Protokolls sollte eine saubere Trennung der implementierten Geschäftslogik von vertikalen Aspekten wie Sicherheit, Zustand, Lastenverteilung, Ausfallsicherung, Überwachung, Verfolgung und Protokollierung bieten. Diesbezügliche Erweiterungen lassen sich transparent in den Stapel der gRPC-Implementierung einbringen. Dies geschieht über Metadaten in Form von Schlüssel-Werte-Paaren, die nicht Bestandteil der Messages im Geschäftsprotokoll sind. Dies kann bei Bedarf erweitert werden.

Weitere Herausforderungen für verteilte Anwendungen sind langfristige Operationen mit hohen Latenzen und eventuellen Timeouts, die sich mit gRPC definiert so behandeln lassen sollten, dass auch dabei verwendete Ressourcen nach ihrem Gebrauch wieder erkennbar und nachvollziehbar freigegeben werden. Darüber hinaus hat das Google-Entwicklerteam auch den Austausch von Kodierungen und Typen der Nachrichten unabhängig von den definierten APIs und ihrer Nutzung implementiert. Die Möglichkeit zum Zurückweisen von Verbindungen, falls der Server zum Zeitpunkt des Requests herunterfährt, rundet den gRPC-Stack für eine saubere Kommunikation ab.

Google stellt gRPC – anders als Stubby – erfreulicherweise frei nutzbar bereit. Das ist angesichts des anhaltenden Trends zum Einsatz von Open-Source-Software wichtig für den Erfolg der zugrundeliegenden Bibliotheken und zugehörenden Produkte. Alle Komponenten sind mit einer Lizenz veröffentlicht, die eine Übernahme durch andere erleichtert. Heute betreut die Cloud Native Computing Foundation (CNCF) das Projekt.

Unabhängig von der genutzten Programmiersprache beginnt die Arbeit mit gRPC mit der Definition der API. Die Protokollcompiler der verschiedenen Sprachen setzen dies in die entsprechenden Bibliotheken um. Das hierfür notwendige Werkzeug ist zuerst auf dem eigenen Computer zu installieren: auf dem Mac mit Homebrew und dem Kommando brew install protobuf, unter Linux, je nach Distribution, mit apt install -y protobuf-compiler. Ohne Paketmanager sind ein paar zusätzliche Kommandos erforderlich.

$ PB_REL="https://github.com/protocolbuffers/protobuf/releases"
$ curl -LO $PB_REL/download/v3.20.1/protoc-3.20.1-linux-x86_64.zip
$ unzip protoc-3.20.1-linux-x86_64.zip -d $HOME/bin

Neben dem Werkzeug sind die Plug-ins für die genutzten Sprachen nötig. In diesem Artikel ist es Go. Dessen Installation nutzt das Go-Tool mit dem Kommando go install.

$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

Mit den auf diesem Weg installierten Programmen im Pfad kann die Arbeit an den Services und deren Clients beginnen.