gRPC

Ein RPC-Framework für effiziente Service-zu-Service-Kommunikation – häufig performanter als JSON-basierte REST-Setups, mit starker Typisierung und Streaming-Support.

Experte2 Min Lesezeit

Erklärung starten

Auf einen Blick

3 Punkte

  1. Binäres Protokoll (Protocol Buffers) statt JSON – oft kompakter und effizienter
  2. Starke Typisierung durch Schema-Definition (.proto-Dateien)
  3. Bidirektionales Streaming für Echtzeit-Kommunikation

Sofortantwort

gRPC einfach erklärt

Hochperformantes RPC-Framework für Microservices-Kommunikation.

Kurz gesagt
Binäres Protokoll (Protocol Buffers) statt JSON – oft kompakter und effizienter
Typischer Einsatz
Microservices-Kommunikation, Mobile Backends, Real-Time Streaming
Wichtig zu wissen
Bidirektionales Streaming für Echtzeit-Kommunikation

gRPC im Überblick

gRPC ist ein Framework für Remote Procedure Calls – du rufst Funktionen auf einem anderen Server auf, als wären sie lokal. Es kann effizienter als JSON-basierte REST-Kommunikation sein, weil es Protocol Buffers und HTTP/2 nutzt.

REST vs. gRPC:

AspektRESTgRPC
FormatJSON (Text)Protocol Buffers (Binär)
ProtokollHTTP/1.1 oder 2HTTP/2
TypisierungOptional (OpenAPI)Pflicht (.proto)
Streamingje nach Technik zusätzlicher Aufwandnative Unterstützung
Performancegut, setupabhängigoft sehr gut, setupabhängig
Browser-SupportJaEingeschränkt

Beispiel – User-Service:

// user.proto
syntax = "proto3";

service UserService {
  rpc GetUser(GetUserRequest) returns (User);
  rpc ListUsers(ListUsersRequest) returns (stream User);
}

message GetUserRequest {
  int32 id = 1;
}

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
}

Aufruf (Python):

response = stub.GetUser(GetUserRequest(id=user_id))
print(response.name)

Technisch betrachtet

Protocol Buffers

Schema definieren:

syntax = "proto3";

package myapp;

message Product {
  int32 id = 1;
  string name = 2;
  double price = 3;
  repeated string tags = 4;  // Array
  optional string description = 5;
  
  enum Status {
    UNKNOWN = 0;
    ACTIVE = 1;
    DISCONTINUED = 2;
  }
  Status status = 6;
}

Code generieren:

protoc --python_out=. --grpc_python_out=. product.proto

Generiert typsichere Klassen für unterstützte Programmiersprachen.

Streaming-Patterns

1. Unary (Standard):

rpc GetUser(Request) returns (Response);

Ein Request → Eine Response

2. Server Streaming:

rpc ListUsers(Request) returns (stream User);

Ein Request → Viele Responses

3. Client Streaming:

rpc UploadChunks(stream Chunk) returns (Response);

Viele Requests → Eine Response

4. Bidirectional Streaming:

rpc Chat(stream Message) returns (stream Message);

Viele Requests ↔ Viele Responses (gleichzeitig)

Server-Implementierung (Python)

import grpc
from concurrent import futures
import user_pb2
import user_pb2_grpc

class UserServicer(user_pb2_grpc.UserServiceServicer):
    def GetUser(self, request, context):
        user = db.get_user(request.id)
        if not user:
            context.set_code(grpc.StatusCode.NOT_FOUND)
            context.set_details('User not found')
            return user_pb2.User()
        return user_pb2.User(
            id=user.id,
            name=user.name,
            email=user.email
        )

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=max_workers))
    user_pb2_grpc.add_UserServiceServicer_to_server(UserServicer(), server)
    server.add_insecure_port(server_address)
    server.start()
    server.wait_for_termination()

Client-Implementierung

import grpc
import user_pb2
import user_pb2_grpc

channel = grpc.insecure_channel(server_address)
stub = user_pb2_grpc.UserServiceStub(channel)

# Unary Call
response = stub.GetUser(user_pb2.GetUserRequest(id=user_id))

# Server Streaming
for user in stub.ListUsers(user_pb2.ListUsersRequest()):
    print(user.name)

Error Handling

try:
    response = stub.GetUser(request)
except grpc.RpcError as e:
    if e.code() == grpc.StatusCode.NOT_FOUND:
        print("User not found")
    elif e.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
        print("Timeout")
    else:
        print(f"Error: {e.details()}")

gRPC vs. REST – Wann was?

SzenarioEmpfehlung
Öffentliche APIhäufig REST oder GraphQL
Browser-Clienthäufig REST / GraphQL oder gRPC-Web
Interne Microserviceshäufig gRPC
Mobile mit begrenztem NetzgRPC kann sinnvoll sein
Real-Time StreaminggRPC kann sinnvoll sein
Einfaches CRUDhäufig REST
Polyglotte ServicesgRPC kann sinnvoll sein

01Einsatzbereiche

Wann ist gRPC sinnvoll?

Geeignet für

  • Microservices-KommunikationInterne Service-zu-Service-Calls mit niedriger Latenz
  • Mobile BackendsEffiziente Kommunikation bei begrenzter Bandbreite
  • Real-Time StreamingBidirektionale Streams für Chat, Gaming, IoT
  • Polyglotte SystemeServices in verschiedenen Sprachen kommunizieren typsicher

↑ Inhalt

02Werkzeuge

Womit gRPC umgesetzt wird

↑ Inhalt

Merksatz

gRPC ist wie ein Direkttelefon zwischen Services

Statt Briefe zu schreiben (REST/JSON), rufst du direkt an – schneller, effizienter, und beide Seiten sprechen dieselbe Sprache (Protocol Buffers).

  1. Binäres Protokoll (Protocol Buffers) statt JSON – oft kompakter und effizienter
  2. Starke Typisierung durch Schema-Definition (.proto-Dateien)
  3. Bidirektionales Streaming für Echtzeit-Kommunikation

04Redaktion

Herkunft und Stand

Redaktion und Aktualität

Ebenex RedaktionRedaktion

Veröffentlicht
Aktualisiert

Dieses Feld entwickelt sich schnell. Oben stehen Veröffentlichung und letzte Änderung; ein Prüfdatum kommt dazu, sobald die Erklärung nach ihrer letzten Änderung geprüft wurde.

↑ Inhalt

05FAQ

Häufige Fragen zu gRPC

Wann gRPC statt REST?

gRPC eignet sich häufig für interne Services, performancekritische Kommunikation, Streaming und polyglotte Systeme. REST eignet sich oft für öffentliche APIs, Browser-Clients, einfache CRUD-Szenarien und breite Kompatibilität.

Funktioniert gRPC im Browser?

Im Browser ist gRPC wegen Web- und HTTP/2-Einschränkungen nicht so direkt nutzbar wie auf Servern. gRPC-Web oder Proxies können helfen. Für Browser-Clients sind REST oder GraphQL oft einfacher.

Ist gRPC schwerer zu debuggen?

Es kann schwieriger sein, weil das binäre Format nicht direkt menschenlesbar ist. Tools wie grpcurl, GUI-Clients, Reflection, Logging und optionales JSON-Transcoding helfen beim Debugging.

Wie verhält sich gRPC zu GraphQL?

Unterschiedliche Ziele: gRPC wird häufig für Service-zu-Service-Kommunikation genutzt, GraphQL oft für flexible Client-zu-Server-Abfragen. Beide können koexistieren.

↑ Inhalt

06Weiterlernen

Was möchtest du als Nächstes verstehen?

↑ Inhalt