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)
55KB
1.5K SLoC
Axum Starter
为什么使用axum-starter
随着服务器功能的增长,主函数中为服务器准备多个基础设施的代码变得越来越复杂。
例如,我需要连接到 Mysql
和 Redis
,启动 MessageQuery
,启动GracefulShutdown等。
为了简化我的服务器项目的启动代码,因此出现了 axum-starter
安全性
外部属性 #![forbid(unsafe_code)]
启用
简单示例
以下示例使用 axum-starter
启动一个运行在 http://127.0.0.1:5050
的web服务器
它可以
- 启动前显示信息(具有
logger
功能) - 使用
simple_logger
并添加TraceLayer作为日志中间件 - 请求
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将对服务器应用多个效应。包括以下内容
Concurrently
或 Serially
Prepare
将默认逐个运行,换句话说,它们是 串行 运行的。如果您想同时运行一些 Prepare
,可以调用 ServerPrepare::prepare_concurrent
,以使一组 Prepare
同时 并发 运行。
设置中间件
如果您想在服务器的 Router
根上添加中间件,使用 ServerPrepare::layer
,然后提供 Layer
或者使用 PrepareMiddlewareEffect
在 Prepare
中应用中间件。
依赖项
~0.6–1.1MB
~25K SLoC