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