Skip to main content

base_server/
start.rs

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