HTTP/3-Unterstützung

Salvo bietet Unterstützung für HTTP/3, die durch das quinn-Feature aktiviert werden kann. HTTP/3 basiert auf dem QUIC-Protokoll und bietet im Vergleich zu den traditionellen HTTP/1.1 und HTTP/2 eine geringere Latenz und bessere Leistung, insbesondere in instabilen Netzwerkumgebungen.

HTTP/3-Unterstützung aktivieren

Um HTTP/3-Unterstützung in Salvo zu aktivieren, müssen Sie das quinn-Feature in der Cargo.toml-Datei aktivieren:

salvo = { workspace = true, features = ["quinn"] }

Anwendungsfälle für HTTP/3

HTTP/3 ist besonders geeignet für folgende Szenarien:

  • Anwendungen auf Mobilgeräten und in instabilen Netzwerkumgebungen
  • Echtzeitanwendungen mit geringer Latenz
  • Szenarien mit parallelen Downloads vieler kleiner Dateien
  • Anwendungen, die Verbindungsmigration benötigen (z.B. unterbrechungsfreier Wechsel von WiFi zu Mobilfunk)

Beispielcode

Hier ist ein einfaches Beispiel für einen HTTP/3-Server, der sowohl HTTP/3 (QUIC) als auch HTTPS (TCP) unterstützt:

use salvo::conn::rustls::{Keycert, RustlsConfig};
use salvo::prelude::*;

// Handler-Funktion, die "Hello World" zurückgibt
#[handler]
async fn hello() -> &'static str {
    "Hello World"
}

#[tokio::main]
async fn main() {
    // Initialisierung des Logging-Systems
    tracing_subscriber::fmt().init();

    // Laden des TLS-Zertifikats und des privaten Schlüssels aus eingebetteten PEM-Dateien
    let cert = include_bytes!("../certs/cert.pem").to_vec();
    let key = include_bytes!("../certs/key.pem").to_vec();

    // Erstellen des Routers und Hinzufügen eines Endpunkts
    let router = Router::new().get(hello);

    // Konfiguration der TLS-Einstellungen mit Rustls
    let config = RustlsConfig::new(Keycert::new().cert(cert.as_slice()).key(key.as_slice()));

    // Erstellen eines TCP-Listeners mit TLS-Verschlüsselung, der auf Port 5800 lauscht
    let listener = TcpListener::new(("0.0.0.0", 5800)).rustls(config.clone());

    // Erstellen eines QUIC-Listeners und Kombination mit dem TCP-Listener
    let acceptor = QuinnListener::new(config.build_quinn_config().unwrap(), ("0.0.0.0", 5800))
        .join(listener)
        .bind()
        .await;

    // Starten des Servers mit Unterstützung für HTTP/3 (QUIC) und HTTPS (TCP)
    Server::new(acceptor).serve(router).await;
}

Wichtiger Code erklärt

TLS-Konfiguration

// Konfiguration der TLS-Einstellungen mit Rustls
let config = RustlsConfig::new(Keycert::new().cert(cert.as_slice()).key(key.as_slice()));

Da HTTP/3 auf dem QUIC-Protokoll basiert und QUIC TLS 1.3 für die Verschlüsselung erfordert, müssen TLS-Zertifikate und Schlüssel konfiguriert werden. In Salvo verwenden wir RustlsConfig für die TLS-Konfiguration.

Kombinierte Listener

// Erstellen eines TCP-Listeners mit TLS-Verschlüsselung
let listener = TcpListener::new(("0.0.0.0", 5800)).rustls(config.clone());

// Erstellen eines QUIC-Listeners und Kombination mit dem TCP-Listener
let acceptor = QuinnListener::new(config.build_quinn_config().unwrap(), ("0.0.0.0", 5800))
    .join(listener)
    .bind()
    .await;

Dieser Code ist der Kern der HTTP/3-Verarbeitung in Salvo. Zuerst wird ein TLS-fähiger TCP-Listener erstellt (für HTTP/1.1 und HTTP/2), dann ein QUIC-Listener (für HTTP/3). Mit der join-Methode werden diese beiden Listener kombiniert, sodass der Server Anfragen mit verschiedenen Protokollen gleichzeitig verarbeiten kann.

Beispiel ausführen

Um dieses Beispiel auszuführen, benötigen Sie gültige TLS-Zertifikate und private Schlüssel. In Entwicklungsumgebungen können selbstsignierte Zertifikate verwendet werden. Den vollständigen Beispielcode finden Sie im Salvo GitHub-Repository.

Beachten Sie, dass viele Clients HTTP/3 derzeit noch nicht vollständig unterstützen, daher ist es wichtig, dass dieser Server sowohl HTTP/3 als auch HTTPS unterstützt.

Wichtige Hinweise

  1. HTTP/3 erfordert TLS 1.3, daher müssen gültige Zertifikate und Schlüssel konfiguriert werden.
  2. Clients müssen das HTTP/3-Protokoll unterstützen, um diese Funktion nutzen zu können, andernfalls wird auf HTTP/1.1 oder HTTP/2 zurückgegriffen.
  3. In Produktionsumgebungen sollten Zertifikate von vertrauenswürdigen Zertifizierungsstellen verwendet werden, nicht selbstsignierte Zertifikate.