PersonalWebApplication/Server/src/main.rs

38 lines
1.1 KiB
Rust
Raw Normal View History

//! InternetProject 后端入口。
//!
//! 启动一个后台采样任务持续刷新系统指标,并对外提供 HTTP 接口:
//! - `GET /api/web/stats` 给 React 前端(挂 CORS
//! - `GET /api/client/health` 给未来 .NET 客户端(不挂 CORS
mod auth;
mod monitor;
mod routes;
mod state;
mod weather;
use std::net::SocketAddr;
use state::AppState;
#[tokio::main]
async fn main() {
let state = AppState::new();
// 后台每秒采样系统指标,写入共享快照。
tokio::spawn(monitor::run_sampler(state.clone()));
let app = routes::build_router(state);
let port = std::env::var("PORT").unwrap_or_else(|_| "8080".to_string());
let addr = format!("0.0.0.0:{port}");
let listener = tokio::net::TcpListener::bind(&addr)
.await
.unwrap_or_else(|_| panic!("无法绑定 {addr}"));
println!("backend listening on http://{addr}");
// 用 connect-info 让 handler 能拿到对端 socket 地址(天气接口要按访问者 IP 定位/限流)。
axum::serve(listener, app.into_make_service_with_connect_info::<SocketAddr>())
.await
.expect("server error");
}