Skip to main content

base_server/
start.rs

1use std::sync::Arc;
2
3use axum::{Extension, Router};
4
5#[cfg(feature = "auth")]
6use crate::layer::auth::apply_auth_layer;
7#[cfg(feature = "postgres")]
8use crate::layer::database::apply_database_layer;
9#[cfg(feature = "log")]
10use crate::layer::log::apply_log_layer;
11use server_config::app::AppConfig;
12use tokio::net::TcpListener;
13use tracing::info;
14
15/// ## 启动服务
16/// @param `app` 自定义router
17pub async fn start(app: Router) {
18    // 加载配置文件
19    let config = AppConfig::from_env().unwrap();
20    // 服务器名称
21    let server_name = &config.server_name;
22    // 服务器主机
23    let server_host = &config.server_host;
24    // 服务器端口
25    let server_port = &config.server_port;
26
27    // 先添加中间件,后添加Extension,中间件才能读取Extension中的内容,执行顺序正好是反向的
28
29    #[cfg(feature = "log")]
30    // 请求日志中间件
31    let (app, _wg) = apply_log_layer(app, &config);
32
33    #[cfg(feature = "auth")]
34    let app = apply_auth_layer(app, &config);
35
36    #[cfg(feature = "postgres")]
37    let app = apply_database_layer(app, &config).await;
38
39    // 添加配置文件
40    let app = app.layer(Extension(Arc::new(config.clone())));
41
42    // 打印服务器信息
43    info!(
44        "Starting {}: http://{}:{}",
45        server_name, server_host, server_port
46    );
47
48    // 监听服务
49    let listener = TcpListener::bind(format!("{}:{}", server_host, server_port))
50        .await
51        .unwrap();
52    // 启动服务
53    axum::serve(listener, app).await.unwrap();
54}