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
- HTTP/3 erfordert TLS 1.3, daher müssen gültige Zertifikate und Schlüssel konfiguriert werden.
- 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.
- In Produktionsumgebungen sollten Zertifikate von vertrauenswürdigen Zertifizierungsstellen verwendet werden, nicht selbstsignierte Zertifikate.