15个版本 (破坏性更新)
0.11.0 | 2024年6月9日 |
---|---|
0.9.0 | 2024年2月6日 |
0.8.0 | 2023年8月7日 |
0.7.0 |
|
0.4.0 | 2022年11月6日 |
#171 in HTTP服务器
76KB
2K SLoC
Axum Starter
为什么选择axum-starter
随着服务器功能的增长,主函数中为服务器准备多个基础设施的代码变得越来越复杂。
例如,我需要连接到Mysql
和Redis
,启动MessageQuery
,启动优雅关闭等。
为了简化我的服务器项目的启动代码,因此出现了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
将返回一个PreparedEffect
给ServerPrepare
来应用每个准备的效果。最后,所有Prepare
都完成,服务器可以启动
Prepare
trait
该trait定义了准备任务,准备完成后,它返回一个PreparedEffect
PreparedEffect
trait family
该trait family将在服务器上应用多种效果。包括以下内容
Concurrently
或Serially
Prepare
将默认逐个运行,换句话说,它们是串行运行的。如果您想运行一些Prepare
并发,可以调用 ServerPrepare::prepare_concurrent
,以给一组 Prepare
运行 并发
设置中间件
如果您想在服务器的根 Router
上添加中间件,使用 ServerPrepare::layer
然后提供 Layer
或者使用 PrepareMiddlewareEffect
在 Prepare
中应用中间件
依赖
~6.5-9MB
~158K SLoC