Compatibilidade com Middleware Tower
O Salvo oferece suporte à compatibilidade com o ecossistema Tower através do recurso tower-compat
. Para APIs específicas, consulte a documentação.
Conceitos Fundamentais do Tower
Tower é uma biblioteca de abstração de serviços, baseada principalmente em dois traits centrais:
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;
}
O Service
é responsável por processar requisições e retornar respostas, semelhante aos manipuladores do Salvo.
Trait Layer
pub trait Layer<S> {
type Service;
fn layer(&self, inner: S) -> Self::Service;
}
O Layer
é usado para encapsular serviços e adicionar funcionalidades extras, análogo aos middlewares do Salvo.
Suporte à Compatibilidade do Salvo
O Salvo fornece a implementação de dois traits essenciais para compatibilidade com o ecossistema Tower:
- TowerLayerCompat: Converte o
Layer
do Tower em um Handler
do Salvo, permitindo seu uso como Hoop (middleware)
- TowerServiceCompat: Transforma o
Service
do Tower em um Handler
do Salvo
Exemplo de uso:
// Utiliza o RateLimitLayer do Tower e o converte para o formato compatível com Salvo via método compat()
let limit = RateLimitLayer::new(5, Duration::from_secs(30)).compat();
let router = Router::new().hoop(limit).get(hello);
Código de Exemplo
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;
}