gRPC ist das leistungsstarke RPC-Framework, das von Google, Netflix, Square und Tausenden von Microservices-Teams verwendet wird. Im Jahr 2026 liefert gRPC mit Protokollpuffern eine 7–10-mal bessere Leistung als REST+JSON für die Service-zu-Service-Kommunikation, mit typsicher generiertem Code in jeder Sprache. Dieser Leitfaden deckt alles ab, vom ersten .proto bis hin zu produktiven gRPC-Diensten.
📋 Table of Contents
gRPC vs. REST
| Besonderheit | gRPC | AUSRUHEN |
|---|---|---|
| Protokoll | HTTP/2 | HTTP/1.1 or HTTP/2 |
| Serialisierung | Protokollpuffer (binär) | JSON (Text) |
| Geschwindigkeit | 7-10x schnellere Serialisierung | Grundlinie |
| Typensicherheit | Generiert, streng | Handbuch (OpenAPI optional) |
| Streaming | Eingebaut (4 Typen) | SSE oder WebSockets |
| Browserunterstützung | Nur grpc-web | Einheimisch |
Schema für Protokollpuffer (.proto).
// user_service.proto
syntax = "proto3";
package userservice.v1;
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
option go_package = "github.com/mycompany/proto/userservice/v1";
// Enums
enum UserRole {
USER_ROLE_UNSPECIFIED = 0;
USER_ROLE_USER = 1;
USER_ROLE_ADMIN = 2;
USER_ROLE_MODERATOR = 3;
}
// Messages
message User {
int64 id = 1;
string name = 2;
string email = 3;
UserRole role = 4;
bool active = 5;
google.protobuf.Timestamp created_at = 6;
}
message CreateUserRequest {
string name = 1;
string email = 2;
string password = 3;
UserRole role = 4;
}
message GetUserRequest {
int64 id = 1;
}
message ListUsersRequest {
int32 page = 1;
int32 page_size = 2;
string filter = 3;
}
message ListUsersResponse {
repeated User users = 1;
int32 total = 2;
int32 page = 3;
}
// Service definition
service UserService {
// Unary RPC
rpc GetUser(GetUserRequest) returns (User);
rpc CreateUser(CreateUserRequest) returns (User);
// Server streaming — server sends multiple messages
rpc ListUsers(ListUsersRequest) returns (stream User);
// Client streaming — client sends multiple messages
rpc UploadUsers(stream CreateUserRequest) returns (ListUsersResponse);
// Bidirectional streaming
rpc SyncUsers(stream User) returns (stream User);
}
Python gRPC-Server
pip install grpcio grpcio-tools
# Generate Python code from .proto
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. user_service.proto
# server.py
import grpc
from concurrent import futures
import user_service_pb2 as pb2
import user_service_pb2_grpc as pb2_grpc
from datetime import datetime
from google.protobuf import timestamp_pb2
class UserServiceServicer(pb2_grpc.UserServiceServicer):
def __init__(self):
self.users: dict[int, pb2.User] = {}
self._next_id = 1
def GetUser(self, request, context):
user = self.users.get(request.id)
if not user:
context.set_code(grpc.StatusCode.NOT_FOUND)
context.set_details(f"User {request.id} not found")
return pb2.User()
return user
def CreateUser(self, request, context):
# Validation
if not request.email or "@" not in request.email:
context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
context.set_details("Invalid email address")
return pb2.User()
ts = timestamp_pb2.Timestamp()
ts.GetCurrentTime()
user = pb2.User(
id=self._next_id,
name=request.name,
email=request.email,
role=request.role or pb2.USER_ROLE_USER,
active=True,
created_at=ts,
)
self.users[self._next_id] = user
self._next_id += 1
return user
def ListUsers(self, request, context):
for user in list(self.users.values()):
if context.is_active():
yield user # streaming!
def serve():
server = grpc.server(
futures.ThreadPoolExecutor(max_workers=10),
interceptors=[LoggingInterceptor()],
)
pb2_grpc.add_UserServiceServicer_to_server(UserServiceServicer(), server)
server.add_insecure_port("0.0.0.0:50051")
server.start()
print("gRPC server started on :50051")
server.wait_for_termination()
if __name__ == "__main__":
serve()
Python gRPC-Client
# client.py
import grpc
import user_service_pb2 as pb2
import user_service_pb2_grpc as pb2_grpc
def run():
with grpc.insecure_channel("localhost:50051") as channel:
stub = pb2_grpc.UserServiceStub(channel)
# Unary call
user = stub.CreateUser(pb2.CreateUserRequest(
name="Alice",
email="alice@example.com",
role=pb2.USER_ROLE_ADMIN,
))
print(f"Created: {user.id} {user.name}")
# Get user
fetched = stub.GetUser(pb2.GetUserRequest(id=user.id))
print(f"Fetched: {fetched.name}")
# Server streaming
for u in stub.ListUsers(pb2.ListUsersRequest(page=1, page_size=10)):
print(f" {u.id}: {u.name}")
# With metadata (auth header)
metadata = [("authorization", "Bearer " + jwt_token)]
user = stub.GetUser(pb2.GetUserRequest(id=1), metadata=metadata)
# With timeout
user = stub.GetUser(pb2.GetUserRequest(id=1), timeout=5.0)
# Handle errors
try:
user = stub.GetUser(pb2.GetUserRequest(id=999))
except grpc.RpcError as e:
print(f"Error: {e.code()} - {e.details()}")
if __name__ == "__main__":
run()
gRPC mit TypeScript
npm install @grpc/grpc-js @grpc/proto-loader
npm install --save-dev ts-proto
// server.ts
import * as grpc from '@grpc/grpc-js';
import * as protoLoader from '@grpc/proto-loader';
import path from 'path';
const PROTO_PATH = path.join(__dirname, 'user_service.proto');
const packageDef = protoLoader.loadSync(PROTO_PATH);
const proto = grpc.loadPackageDefinition(packageDef) as any;
const getUserService = {
getUser: (call: grpc.ServerUnaryCall<any, any>, callback: grpc.sendUnaryData<any>) => {
const { id } = call.request;
const user = db.users.findById(id);
if (!user) {
callback({ code: grpc.status.NOT_FOUND, message: `User ${id} not found` });
return;
}
callback(null, user);
},
};
const server = new grpc.Server();
server.addService(proto.userservice.v1.UserService.service, getUserService);
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
server.start();
console.log('gRPC server on :50051');
});
Produktions-gRPC
- TLS– verwenden
grpc.credentials.createSsl()mit Zertifikatsdateien - Abfangjäger– Authentifizierung, Protokollierung, Nachverfolgung, Ratenbegrenzung als Abfangjäger
- Gesundheitschecks– Implementieren Sie das gRPC Health Checking Protocol
- Gesandter-Proxy— Lastausgleich + gRPC-Web für Browser-Clients
- Buf— moderne Protocol Buffer-Toolchain (Linting, Formatierung, Erkennung von Breaking Changes)
- OpenTelemetry– verteilte Ablaufverfolgung über gRPC-Dienste hinweg
gRPC im Jahr 2026 ist der Standard für leistungsstarke Microservice-Kommunikation. Verwenden Sie es für Service-zu-Service-Anrufe, bei denen es auf die Leistung ankommt, bei denen Sie bidirektionales Streaming benötigen oder bei denen eine sichere Eingabe in verschiedenen Sprachen von entscheidender Bedeutung ist. Behalten Sie REST für öffentliche APIs und browserseitige Endpunkte bei.
🔗 Share this article
✍️ Leave a Comment