#axum-server #axum #web-server #web #http

axum-starter

axum服务器启动的辅助crate,用于简化代码。

15个版本 (破坏性更新)

0.11.0 2024年6月9日
0.9.0 2024年2月6日
0.8.0 2023年8月7日
0.7.0 2023年7月29日
0.4.0 2022年11月6日

#171 in HTTP服务器


用于 axum-starter-macro

MIT 许可证

76KB
2K SLoC

Axum Starter

Github Crates.io License

为什么选择axum-starter

随着服务器功能的增长,主函数中为服务器准备多个基础设施的代码变得越来越复杂。
例如,我需要连接到MysqlRedis,启动MessageQuery,启动优雅关闭等。
为了简化我的服务器项目的启动代码,因此出现了axum-starter

安全性

外部属性#![forbid(unsafe_code)]启用

简单示例

以下示例使用axum-starter启动一个运行在http://127.0.0.1:5050的Web服务器

它可以做到

  1. 在启动前显示信息(具有logger功能)
  2. 使用simple_logger并添加TraceLayer作为日志中间件
  3. 请求http://127.0.0.1:5050/greet/{name}将响应问候你的名字
use axum::{extract::Path, routing::get};
use axum_starter::{prepare, router::Route, ServerPrepare};
use config::Conf;
use tower_http::trace::TraceLayer;

#[tokio::main]
async fn main() {
    start().await;
}

async fn start() {
    ServerPrepare::with_config(Conf::default())
        .init_logger()
        .expect("Init Logger Error")
        .prepare_route(GreetRoute)
        .layer(TraceLayer::new_for_http())
        .no_state()
        .prepare_start()
        .await
        .expect("Prepare for Start Error")
        .launch()
        .await
        .expect("Server Error");
}

mod config {
    use std::net::Ipv4Addr;

    use axum_starter::{Configure, Provider};
    use log::LevelFilter;
    use log::SetLoggerError;
    use simple_logger::SimpleLogger;

    // prepare the init configure
    #[derive(Debug, Default, Provider, Configure)]
    #[conf(
        address(func(
            path = "||(Ipv4Addr::LOCALHOST, 5050)",
            ty = "(Ipv4Addr, u16)",
            associate,
        )),
        logger(
            func = "||SimpleLogger::new().with_level(LevelFilter::Debug).init()",
            error = "SetLoggerError",
            associate,
        ),
        server
    )]
    pub(super) struct Conf {}
}

async fn greet(Path(name): Path<String>) -> String {
    format!("Welcome {name} !")
}

#[prepare(GreetRoute)]
fn greet_route<S, B>() -> Route<S, B>
where
    B: http_body::Body + Send + 'static,
    S: Clone + Send + Sync + 'static,
{
    Route::new("/greet/:name", get(greet))
}

核心概念

在启动服务器之前,每个任务都调用Prepare。每个Prepare将返回一个PreparedEffectServerPrepare来应用每个准备的效果。最后,所有Prepare都完成,服务器可以启动

Prepare trait

该trait定义了准备任务,准备完成后,它返回一个PreparedEffect

PreparedEffect trait family

该trait family将在服务器上应用多种效果。包括以下内容

ConcurrentlySerially

Prepare 将默认逐个运行,换句话说,它们是串行运行的。如果您想运行一些Prepare并发,可以调用 ServerPrepare::prepare_concurrent,以给一组 Prepare 运行 并发

设置中间件

如果您想在服务器的根 Router 上添加中间件,使用 ServerPrepare::layer 然后提供 Layer

或者使用 PrepareMiddlewareEffectPrepare 中应用中间件

依赖

~6.5-9MB
~158K SLoC