API Gateway für Swift-Dienste: Wie man Microservices zu einem einheitlichen System zusammenführt

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

API Gateway für Swift-Dienste: Eine Brücke zwischen Microservices bauen

\n\n

Stellen Sie sich vor, Ihr Backend ist ein riesiges Einkaufszentrum. Darin befinden sich Dutzende von Geschäften (Microservices): Authentifizierung, Produktkatalog, Warenkorb, Zahlungen, Benachrichtigungen. Der Client (iOS-App) müsste jedes Geschäft einzeln betreten – das ist Chaos, langsam und unsicher. API Gateway ist der Haupteingang, die Sicherheit und der Navigator in einem. Es nimmt Anfragen entgegen, prüft die Berechtigungen, leitet an die richtige Abteilung weiter und gibt das Ergebnis zurück.

\n\n

In der Welt von Swift, wo Vapor und Hummingbird an Fahrt gewinnen, ist die Erstellung eines eigenen API Gateways kein Luxus, sondern eine Notwendigkeit für skalierbare Projekte. Heute werden wir uns ansehen, wie man ein leichtgewichtiges Gateway in Swift schreibt, das Ihre Dienste zu einem einheitlichen Ökosystem verbindet.

\n\n

Warum ein API Gateway in der Swift-Architektur?

\n\n

Wenn Sie 2-3 Microservices haben, kann der Client direkt mit jedem kommunizieren. Aber wenn es 10+ sind (ein typisches Szenario für Fintech, E-Commerce oder SaaS), treten Probleme auf:

\n\n
    \n
  • Aufgeblähter Client-Code – jeder Dienst hat seinen eigenen Endpoint, sein eigenes Fehlerformat und Authentifizierungsprotokoll
  • \n
  • Sicherheitslücken – jeder Dienst muss sich selbst um CORS, Rate Limiting und JWT-Überprüfung kümmern
  • \n
  • Komplexität bei der Refaktorisierung – Dienst umbenannt? Ändern Sie den Code auf allen Clients
  • \n
  • Überflüssiger Traffic – der Client macht 5 Anfragen statt einer, um eine Seite zusammenzustellen
  • \n
\n\n

Ein API Gateway löst diese Probleme, indem es ein einziger Einstiegspunkt wird. Es kann Daten aus mehreren Microservices in einer Antwort aggregieren, Sicherheitsrichtlinien anwenden und alle Anfragen protokollieren. Für Swift-Entwickler ist dies auch eine Gelegenheit, die strenge Typisierung der Sprache auf Gateway-Ebene zu nutzen.

\n\n

Werkzeugauswahl: Vapor + Hummingbird

\n\n

Für die Erstellung eines API Gateways in Swift ist Vapor ideal – das ausgereifteste Web-Framework des Ökosystems. Es bietet Middleware, Routing, Client-Anfragen (über Client) und Unterstützung für async/await. Eine Alternative ist Hummingbird (leicht, schnell, von Apple), aber für das Beispiel nehmen wir Vapor, da es besser dokumentiert ist.

\n\n

Unser Gateway wird drei Funktionen erfüllen:

\n
    \n
  • Proxy-Anfragen an den entsprechenden Microservice
  • \n
  • Authentifizierung über JWT
  • \n
  • Aggregation von Daten aus zwei Diensten in einer Antwort
  • \n
\n\n

Schritt 1. Grundlegende Projektstruktur

\n\n

Ein neues Vapor-Projekt erstellen:

\n
vapor new APIGateway --template=api\ncd APIGateway
\n\n

Fügen Sie in Package.swift die Abhängigkeit für JWT hinzu:

\n
.package(url: "https://github.com/vapor/jwt.git", from: "4.0.0")
\n\n

Und binden Sie sie im Target ein:

\n
.target(name: "App", dependencies: [\n    .product(name: "Vapor", package: "vapor"),\n    .product(name: "JWT", package: "jwt")\n])
\n\n

Schritt 2. Middleware für Authentifizierung

\n\n

Erstellen wir eine Middleware, die das JWT-Token überprüft und die Benutzerinformationen weitergibt. Dies ist ein klassisches Muster für API Gateways in Swift:

\n\n
import Vapor\nimport JWT\n\nstruct JWTAuthenticator: AsyncMiddleware {\n    func respond(to request: Request, chainingTo next: AsyncResponder) async throws -> Response {\n        guard let token = request.headers.bearerAuthorization?.token else {\n            throw Abort(.unauthorized, reason: "Missing Bearer token")\n        }\n        \n        // Signatur und Gültigkeitsdauer prüfen\n        let payload = try await request.jwt.verify(token, as: UserPayload.self)\n        \n        // Benutzer im Anfragespeicher ablegen\n        request.storage.set(UserPayloadKey.self, to: payload)\n        \n        return try await next.respond(to: request)\n    }\n}\n\nstruct UserPayload: JWTPayload {\n    var userID: UUID\n    var role: String\n    var exp: ExpirationClaim\n    \n    func verify(using signer: JWTSigner) throws {\n                

Blogs

Buchempfehlungen