< 返回版块

dakai-chen 发表于 2024-03-17 02:54

Boluo

这是一个简单易用的异步网络框架,借鉴axum,基于tokiohyper构建,目前缺乏文档和测试。

起因

在使用axum的过程中,我遇到了两个问题:

  • 错误和响应不分离:错误离开处理程序就变为响应,中间件无法对特定错误进行捕获,并将错误转为自己想要的响应格式。
  • 多次创建服务副本:每次处理请求时,axum会多次对Service进行克隆,这可能会导致一些中间件无法产生预计的行为。(案例:https://github.com/tokio-rs/axum/discussions/2520)。

上述两个问题使我放弃使用axum,并自己创建一个网络框架。

示例

use boluo::http::StatusCode;
use boluo::response::IntoResponse;
use boluo::response::Response;
use boluo::route::{RouteError, RouteErrorKind, Router};
use boluo::server::Server;
use boluo::service::ServiceExt;
use boluo::BoxError;
use tokio::net::TcpListener;

#[tokio::main]
async fn main() {
    let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();

    let app = Router::new().mount(hello).or_else(handle_error);

    Server::new(listener).run(app).await.unwrap();
}

#[boluo::route("/", method = "GET")]
async fn hello() -> Result<(), MyError> {
    Err(MyError)
}

/// 错误处理
async fn handle_error(err: BoxError) -> Result<Response, BoxError> {
    // 处理框架抛出的路由错误,并自定义响应方式
    if let Some(e) = err.downcast_ref::<RouteError>() {
        let status_code = match e.kind() {
            RouteErrorKind::NotFound => StatusCode::NOT_FOUND,
            RouteErrorKind::MethodNotAllowed => StatusCode::METHOD_NOT_ALLOWED,
        };
        return Ok((status_code, format!("{status_code}")).into_response()?);
    }
    if let Some(_) = err.downcast_ref::<MyError>() {
        // 记录错误、转为响应等等
    }
    Err(err)
}

#[derive(Debug, thiserror::Error)]
#[error("some error message")]
struct MyError;

项目地址:

这是符合我个人喜好的rust网络框架,构建完成想要与大家分享,欢迎大家试用并提出意见或建议。使用方式可以参考examples文件夹,目前例子不多,但是涵盖了一些简单的使用场景。

注:英文水平有限,所以仅有的文档是用中文编写的,并且后续的文档也将使用中文。

评论区

写评论

还没有评论

1 共 0 条评论, 1 页