"""主应用入口 - 对应Go的cmd/server/main.go""" import os from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from app.api import router, admin_router from app.websocket import WebSocketServer from app.core.config import get_config, get_settings from app.core.logger import info, error, setup_logging from app.core.metrics import MetricsMiddleware, get_metrics_response, set_app_info from app.core.rate_limiter import RateLimitMiddleware, RateLimitConfig from app.repositories.database import init_db # 获取配置 config = get_config() settings = get_settings() # 设置日志 setup_logging() @asynccontextmanager async def lifespan(app: FastAPI): """应用生命周期管理""" # 启动时执行 info("Starting Market Data Service...") # 初始化数据库 try: init_db() info("Database initialized") except Exception as e: error(f"Database initialization failed: {e}") yield # 关闭时执行 info("Shutting down Market Data Service...") # 创建FastAPI应用 app = FastAPI( title="统一行情数据服务", description="提供股票和期货的标准化行情数据查询服务", version="1.0.0", lifespan=lifespan ) # 添加CORS中间件 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 添加Prometheus指标中间件 app.add_middleware(MetricsMiddleware) # 添加限流中间件(默认每分钟60请求,滑动窗口算法) app.add_middleware( RateLimitMiddleware, config=RateLimitConfig( requests_per_minute=120, # 每分钟120请求 burst_size=20, # 突发20请求 strategy="sliding_window" # 使用滑动窗口算法 ) ) # 注册API路由 app.include_router(router, prefix="/v1") app.include_router(admin_router, prefix="/v1") # WebSocket服务器 ws_server = WebSocketServer() @app.websocket("/v1/stream") async def websocket_endpoint(websocket): """WebSocket端点""" import uuid client_id = str(uuid.uuid4()) await ws_server.handle(websocket, client_id) @app.get("/metrics") async def metrics(): """Prometheus指标端点""" return get_metrics_response() # 管理后台页面HTML(完整版) ADMIN_HTML = '''