Mikroservices in Swift: Architektur und Praxis für Profis

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

Einleitung: Warum Swift eine ausgereifte Plattform für Mikroservices ist

Traditionell wird Swift mit der Entwicklung für iOS und macOS assoziiert. Mit dem Aufkommen der Frameworks Vapor und Hummingbird sowie der Bibliothek SwiftNIO ist Swift jedoch zu einer vollwertigen Sprache für die Serverentwicklung geworden. Die Mikroservice-Architektur mit Swift ist nicht nur ein Trend, sondern eine pragmatische Wahl für Projekte, bei denen Leistung, Typsicherheit und native Integration in das Apple-Ökosystem wichtig sind.

In diesem Artikel betrachten wir fortgeschrittene Aspekte der Erstellung von Mikroservices in Swift: von der Wahl des Transports bis zum Deployment in Docker. Die Codebeispiele sind auf Swift 5.9+ und macOS/Linux ausgelegt.



Mikroservice-Architektur in Swift: Vom Monolithen zum verteilten System

Framework-Wahl: Vapor vs Hummingbird

Für Produktionslösungen werden Vapor 4 (stabil, große Community) oder Hummingbird (leichtgewichtig, minimalistisch) empfohlen. Beide basieren auf SwiftNIO.

Die grundlegende Struktur eines Mikroservices mit Vapor umfasst:

  • Routes (Routen) — Verarbeitung von HTTP-Anfragen.
  • Controllers (Controller) — Geschäftslogik.
  • Services (Dienste) — isolierte Module (Datenbank, externe APIs).
  • Models (Modelle) — Fluent ORM für die Datenbankarbeit.


// Beispiel einer grundlegenden Mikroservice-Struktur mit Vaporimport Vapor

func routes(_ app: Application) throws { let orderController = OrderController() app.get("orders", ":id", use: orderController.getOrder) app.post("orders", use: orderController.createOrder)}

final class OrderController { func getOrder(req: Request) async throws -> Order { let orderID = try req.parameters.require("id", as: UUID.self) return try await Order.find(orderID, on: req.db) ?? Abort(.notFound) }}


Protokolle und Dependency Injection

Für lose Kopplung verwenden Sie Protokolle. Dies vereinfacht das Testen und den Austausch von Komponenten.

protocol PaymentServiceProtocol {    func processPayment(amount: Double, currency: String) async throws -> PaymentResult}

final class StripeService: PaymentServiceProtocol { func processPayment(amount: Double, currency: String) async throws -> PaymentResult { // Logik zum Aufruf der Stripe API }}

// Registrierung im DI-Container von Vaporapp.services.register(PaymentServiceProtocol.self) { _ in StripeService() }


Fortgeschrittene Kommunikation: gRPC und Async/Await

Warum gRPC statt REST

Für interne Mikroservices ist gRPC REST vorzuziehen aufgrund von:

  • Strikter Typisierung durch Protocol Buffers.
  • Binärem Protokoll (weniger Traffic).
  • Integrierter Streaming-Unterstützung.

Swift unterstützt gRPC über die Bibliothek grpc-swift. Beispiel einer Dienstdefinition:



// user.protoservice UserService {    rpc GetUser (UserRequest) returns (UserResponse);    rpc ListUsers (Empty) returns (stream UserResponse);}

message UserRequest { string user_id = 1;}

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


Generierung des Swift-Codes:

protoc --swift_out=. --grpc-swift_out=. user.proto


Implementierung des Servers in Swift:

import GRPCimport NIO

final class UserServiceImpl: UserServiceProvider { func getuser(request: UserRequest, context: StatusOnlyCallContext) -> EventLoopFuture { let user = UserResponse.with { $0.id = request.userID $0.name = "John Doe" $0.email = "john@example.com" } return context.eventLoop.makeSucceededFuture(user) }}


Async/Await in Mikroservices

Swift 5.5+ brachte

Blogs

Buchempfehlungen