Skip to main content

base_server/
start.rs

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