Compatibilité avec les Middlewares Tower
Salvo offre une prise en charge de la compatibilité avec l'écosystème Tower via la fonctionnalité tower-compat
. Pour les API spécifiques, veuillez consulter la documentation.
Concepts clés de Tower
Tower est une bibliothèque d'abstraction de services, principalement basée sur deux traits fondamentaux :
Le trait Service
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;
}
Le Service
est responsable du traitement des requêtes et de la génération des réponses, similaire aux gestionnaires de Salvo.
Le trait Layer
pub trait Layer<S> {
type Service;
fn layer(&self, inner: S) -> Self::Service;
}
Le Layer
permet d'encapsuler un service pour y ajouter des fonctionnalités supplémentaires, à l'instar des middlewares de Salvo.
Prise en charge de la compatibilité par Salvo
Salvo propose deux implémentations de traits clés pour assurer la compatibilité avec l'écosystème Tower :
- TowerLayerCompat : Convertit un
Layer
de Tower en Handler
de Salvo, permettant son utilisation comme Hoop (middleware)
- TowerServiceCompat : Convertit un
Service
de Tower en Handler
de Salvo
Exemple d'utilisation :
// Utilisation de RateLimitLayer de Tower converti au format compatible Salvo via la méthode compat()
let limit = RateLimitLayer::new(5, Duration::from_secs(30)).compat();
let router = Router::new().hoop(limit).get(hello);
Exemple de code
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;
}