Skip to main content

base_server/
start.rs

1use std::sync::Arc;
2
3use axum::{Extension, Router};
4
5#[cfg(any(feature = "log", feature = "auth"))]
6use axum::middleware::from_fn;
7#[cfg(feature = "auth")]
8use server_common::jwt::JwtService;
9use server_config::app::AppConfig;
10#[cfg(feature = "postgres")]
11use server_database::connect_db;
12#[cfg(feature = "auth")]
13use server_middleware::middleware::auth::auth_middleware;
14#[cfg(feature = "log")]
15use server_middleware::middleware::log::logging_middleware;
16use tokio::net::TcpListener;
17#[cfg(feature = "log")]
18use trace_log::{LogLevel, init_logger};
19use tracing::info;
20
21/// ## 启动服务
22/// @param `app` 自定义router
23pub async fn start(app: Router) {
24    // 加载配置文件
25    let config = AppConfig::from_env().unwrap();
26    // 服务器名称
27    let server_name = &config.server_name;
28    // 服务器主机
29    let server_host = &config.server_host;
30    // 服务器端口
31    let server_port = &config.server_port;
32
33    #[cfg(feature = "log")]
34    let _wg = match &config.log {
35        Some(data) => {
36            let level = match &data.level.parse::<LogLevel>() {
37                Ok(level) => level.clone(),
38                Err(_) => LogLevel::Debug,
39            };
40            let wg = init_logger(level);
41            Some(wg)
42        }
43        None => None,
44    };
45
46    // 先添加中间件,后添加Extension,中间件才能读取Extension中的内容,执行顺序正好是反向的
47
48    #[cfg(feature = "auth")]
49    // 添加认证中间件
50    let app = match &config.jwt {
51        Some(_) => app.layer(from_fn(auth_middleware)),
52        None => app,
53    };
54
55    #[cfg(feature = "log")]
56    // 请求日志中间件
57    let app = match &config.log {
58        Some(data) if data.http => app.layer(from_fn(logging_middleware)),
59        _ => app,
60    };
61
62    #[cfg(feature = "auth")]
63    // 添加jwt service
64    let app = match &config.jwt {
65        Some(data) => {
66            let jwt_service = JwtService::new(data.clone());
67            app.layer(Extension(Arc::new(jwt_service)))
68        }
69        None => app,
70    };
71
72    #[cfg(feature = "postgres")]
73    let app = match &config.database {
74        Some(database_config) => {
75            let pg_pool = connect_db(database_config).await.unwrap();
76            // 添加数据连接池
77            let app = app.layer(Extension(Arc::new(pg_pool)));
78            app
79        }
80        None => app,
81    };
82
83    // 添加配置文件
84    let app = app.layer(Extension(Arc::new(config.clone())));
85
86    // 打印服务器信息
87    info!(
88        "Starting {}: http://{}:{}",
89        server_name, server_host, server_port
90    );
91
92    // 监听服务
93    let listener = TcpListener::bind(format!("{}:{}", server_host, server_port))
94        .await
95        .unwrap();
96    // 启动服务
97    axum::serve(listener, app).await.unwrap();
98}