API (Application Programming Interface)
Eine definierte Schnittstelle, über die Softwaresysteme miteinander kommunizieren können – der Standard für die Integration von KI-Diensten in Anwendungen.
Ein modernes RPC-Framework von Google für effiziente Service-zu-Service-Kommunikation – schneller als REST, mit starker Typisierung und Streaming-Support.
gRPC ist ein Framework für Remote Procedure Calls – du rufst Funktionen auf einem anderen Server auf, als wären sie lokal. Schneller als REST, weil es binäre Daten statt JSON verwendet.
REST vs. gRPC:
| Aspekt | REST | gRPC |
|---|---|---|
| Format | JSON (Text) | Protocol Buffers (Binär) |
| Protokoll | HTTP/1.1 oder 2 | HTTP/2 |
| Typisierung | Optional (OpenAPI) | Pflicht (.proto) |
| Streaming | Umständlich | Native Unterstützung |
| Performance | Gut | Sehr gut |
| Browser-Support | Ja | Eingeschrä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=123))
print(response.name) # "Max Mustermann"
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 Python, Go, Java, etc.
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)
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=10))
user_pb2_grpc.add_UserServiceServicer_to_server(UserServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
import grpc
import user_pb2
import user_pb2_grpc
channel = grpc.insecure_channel('localhost:50051')
stub = user_pb2_grpc.UserServiceStub(channel)
# Unary Call
response = stub.GetUser(user_pb2.GetUserRequest(id=123))
# Server Streaming
for user in stub.ListUsers(user_pb2.ListUsersRequest()):
print(user.name)
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()}")
| Szenario | Empfehlung |
|---|---|
| Öffentliche API | REST |
| Browser-Client | REST / GraphQL |
| Interne Microservices | gRPC |
| Mobile mit schlechtem Netz | gRPC |
| Real-Time Streaming | gRPC |
| Einfaches CRUD | REST |
| Polyglotte Services | gRPC |
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).
Binäres Protokoll (Protocol Buffers) statt JSON – kleiner und schneller
Starke Typisierung durch Schema-Definition (.proto-Dateien)
Bidirektionales Streaming für Echtzeit-Kommunikation
Microservices-Kommunikation
Interne Service-zu-Service-Calls mit niedriger Latenz
Mobile Backends
Effiziente Kommunikation bei begrenzter Bandbreite
Real-Time Streaming
Bidirektionale Streams für Chat, Gaming, IoT
Polyglotte Systeme
Services in verschiedenen Sprachen kommunizieren typsicher
gRPC für: interne Services, Performance-kritisch, Streaming, polyglotte Systeme. REST für: öffentliche APIs, Browser-Clients, einfache CRUD, breite Kompatibilität.
Nicht direkt (HTTP/2 Einschränkungen). gRPC-Web ist ein Proxy-basierter Workaround. Für Browser-Clients ist REST/GraphQL oft praktischer.
Ja, binäres Format ist nicht menschenlesbar. Tools wie grpcurl, BloomRPC und Logging helfen. JSON-Transcoding für Debugging möglich.
Unterschiedliche Ziele: gRPC für Service-zu-Service (Performance). GraphQL für Client-zu-Server (Flexibilität). Können koexistieren.