Kompatibilität mit Tower-Middleware

Salvo bietet Kompatibilitätsunterstützung für das Tower-Ökosystem über die tower-compat-Funktion. Detaillierte APIs finden Sie in der Dokumentation.

Kernkonzepte von Tower

Tower ist eine Dienstabstraktionsbibliothek, die hauptsächlich auf zwei zentralen Traits basiert:

Service-Trait

pub trait Service<Request> {
    type Response;
    type Error;
    type Future: Future<Output = Result<Self::Response, Self::Error>>;

    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>;
    fn call(&mut self, req: Request) -> Self::Future;
}

Der Service ist für die Verarbeitung von Anfragen und die Rückgabe von Antworten verantwortlich, ähnlich wie Salvos Handler.

Layer-Trait

pub trait Layer<S> {
    type Service;
    fn layer(&self, inner: S) -> Self::Service;
}

Der Layer wird verwendet, um Dienste zu verpacken und zusätzliche Funktionalität hinzuzufügen, ähnlich wie Salvos Middleware.

Kompatibilitätsunterstützung von Salvo

Salvo bietet zwei zentrale Traits zur Kompatibilität mit dem Tower-Ökosystem:

  • TowerLayerCompat: Konvertiert Towers Layer in Salvos Handler, sodass es als Hoop (Middleware) verwendet werden kann
  • TowerServiceCompat: Konvertiert Towers Service in Salvos Handler

Anwendungsbeispiel:

// Verwendung von Towers RateLimitLayer und Konvertierung in ein Salvo-kompatibles Format über die compat()-Methode
let limit = RateLimitLayer::new(5, Duration::from_secs(30)).compat();
let router = Router::new().hoop(limit).get(hello);

Beispielcode

main.rs
Cargo.toml
with-tower/src/main.rs
use salvo::prelude::*;
use tokio::time::Duration;
use tower::limit::RateLimitLayer;

#[handler]
async fn hello() -> &'static str {
    "Hello World"
}

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let limit = RateLimitLayer::new(5, Duration::from_secs(30)).compat();
    let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
    let router = Router::new().hoop(limit).get(hello);
    Server::new(acceptor).serve(router).await;
}