#axum-server #axum #http #web

axum-starter-macro

简化axum服务器启动代码的帮助库

13个版本 (重大变更)

0.10.0 2024年4月21日
0.9.0 2024年2月6日
0.8.0 2023年8月7日
0.7.0 2023年7月29日
0.4.0 2022年11月6日

#1331过程宏


2 个库中使用(通过 axum-starter

MIT 许可证

55KB
1.5K SLoC

Axum Starter

Github Crates.io License

为什么使用axum-starter

随着服务器功能的增长,主函数中为服务器准备多个基础设施的代码变得越来越复杂。
例如,我需要连接到 MysqlRedis,启动 MessageQuery,启动GracefulShutdown等。
为了简化我的服务器项目的启动代码,因此出现了 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 都会为 ServerPrepare 返回一个 PreparedEffect,以便对服务器应用每个准备的效应。最后,所有 Prepare 都已完成,服务器可以启动

Prepare trait

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

PreparedEffect trait family

该trait family将对服务器应用多个效应。包括以下内容

ConcurrentlySerially

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

设置中间件

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

或者使用 PrepareMiddlewareEffectPrepare 中应用中间件。

依赖项

~0.6–1.1MB
~25K SLoC