Mikroservices in Rust: Architektur und Praxis von A bis Z

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

Mikroservices in Rust: Architektur und Praxis von A bis Z



Die Mikroservice-Architektur ist zum Standard für die Entwicklung moderner skalierbarer Anwendungen geworden. Die Sprache Rust mit ihrem Fokus auf Leistung, Speichersicherheit und Parallelität bietet einzigartige Vorteile für die Entwicklung von Mikroservices. In diesem Artikel betrachten wir den gesamten Zyklus der Erstellung eines Mikroservices in Rust: von der Auswahl der Werkzeuge bis zur Bereitstellung.



Warum Rust für Mikroservices?



Rust vereint die Low-Level-Kontrolle von C/C++ mit der Sicherheit einer modernen Sprache. Für Mikroservices bedeutet dies:



  • Speichersicherheit ohne Garbage Collector — vorhersehbarer Ressourcenverbrauch, keine GC-"Bremsen".
  • Hohe Leistung — auf dem Niveau von C++, was für stark ausgelastete Dienste entscheidend ist.
  • Ownership-Modell — schließt Datenrennen bereits zur Kompilierzeit aus.
  • Kleine Binärdateigröße — schneller Start und geringer Speicherverbrauch.


Dadurch eignet sich Rust ideal für Edge-Services, API-Gateways und kritische Komponenten.



Wichtige Werkzeuge für Mikroservices in Rust



Im Rust-Ökosystem gibt es mehrere ausgereifte Bibliotheken und Frameworks:



  • Actix-web — leistungsstarkes asynchrones Web-Framework mit Akteur-Modell. Hervorragend geeignet für REST-APIs.
  • Tokio — asynchrone Laufzeitumgebung, Grundlage der meisten Netzwerkanwendungen.
  • Axum — modernes Framework vom Tokio-Team, das tower und hyper verwendet.
  • Warp — leichtgewichtiges, filterbasiertes Framework.
  • Tonic — gRPC-Implementierung in Rust.


Zur Demonstration verwenden wir Actix-web und Tokio.



Architektur eines Mikroservices in Rust



Betrachten wir die Architektur eines einfachen Benutzerverwaltungsdienstes. Ein typischer Mikroservice umfasst:



  1. HTTP-Schicht — Anfragebearbeitung, Validierung.
  2. Geschäftslogik — Dienstschicht.
  3. Datenschicht — Datenbankarbeit (in der Regel asynchron).
  4. Kommunikationsschicht — gRPC- oder HTTP-Clients für andere Dienste.


Beispiel: Einfache REST-API mit Actix-web



Erstellen wir einen grundlegenden Mikroservice mit Endpunkten für CRUD-Operationen auf Benutzer.



// Cargo.toml[dependencies]actix-web = "4"actix-rt = "2"serde = { version = "1", features = ["derive"] }tokio = { version = "1", features = ["full"] }sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }


Hauptdatei main.rs:



use actix_web::{web, App, HttpServer, Responder, HttpResponse};use serde::{Deserialize, Serialize};use sqlx::postgres::PgPoolOptions;

#[derive(Serialize, Deserialize, Clone)]struct User { id: i32, name: String, email: String,}

// In-Memory-Speicher (für das Beispiel, in der Praxis — Datenbank)use std::sync::Mutex;struct AppState { users: Mutex<Vec<User>>,}

async fn get_users(data: web::Data<AppState>) -> impl Responder { let users = data.users.lock().unwrap(); HttpResponse::Ok().json(users.clone())}

async fn create_user( data: web::Data<AppState>, new_user: web::Json<User>,) -> impl Responder { let mut users = data.users.lock().unwrap(); let user = User { id: users.len() as i32 + 1, ..new_user.into_inner() }; users.push(user.clone()); HttpResponse::Created().json(user)}

#[actix_web::main]async fn main() -> std::io::Result<()> { let app_state = web::Data::new(AppState { users: Mutex::new(vec![]), });

HttpServer::new(move || { App::new()

Blogs

Buchempfehlungen