15 KiB
15 KiB
核心框架配置
**本文档引用的文件** - [main.py](file://backend/app/main.py) - [config.py](file://backend/app/config.py) - [database.py](file://backend/app/database.py) - [deps.py](file://backend/app/api/deps.py) - [scheduler.py](file://backend/app/workers/scheduler.py) - [auth.py](file://backend/app/api/auth.py) - [queries.py](file://backend/app/api/queries.py) - [query.py](file://backend/app/models/query.py) - [docker-compose.yml](file://docker-compose.yml) - [requirements.txt](file://backend/requirements.txt)目录
简介
本文件面向GEO后端核心框架的配置与运行机制,重点覆盖以下方面:
- FastAPI应用实例的初始化、应用名称与版本管理、生命周期管理(lifespan)
- CORS中间件配置策略
- 路由注册机制与健康检查端点
- 配置管理系统(环境变量读取、配置验证、默认值设置)
- 数据库连接池配置、异步会话管理与连接超时设置
- 应用启动与关闭流程及资源清理机制
- 配置最佳实践与常见问题解决方案
项目结构
后端采用分层组织方式,核心入口位于应用根目录,按功能划分为API、模型、服务、工具与工作器等模块。Docker Compose用于编排数据库、缓存与前后端服务。
graph TB
subgraph "后端应用"
MAIN["app/main.py<br/>应用入口与生命周期"]
CONF["app/config.py<br/>配置定义与默认值"]
DB["app/database.py<br/>异步引擎与会话工厂"]
API_AUTH["app/api/auth.py<br/>认证路由"]
API_QUERIES["app/api/queries.py<br/>查询路由"]
DEPS["app/api/deps.py<br/>依赖注入与鉴权"]
SCHED["app/workers/scheduler.py<br/>定时任务调度器"]
MODEL_QUERY["app/models/query.py<br/>查询模型"]
end
subgraph "外部服务"
DB_SRV["PostgreSQL"]
REDIS_SRV["Redis"]
end
MAIN --> API_AUTH
MAIN --> API_QUERIES
MAIN --> SCHED
API_AUTH --> DEPS
API_QUERIES --> DEPS
DEPS --> DB
SCHED --> DB
DB --> DB_SRV
CONF --> DB
CONF --> SCHED
图表来源
- main.py:1-48
- config.py:1-17
- database.py:1-29
- auth.py:1-43
- queries.py:1-86
- deps.py:1-43
- scheduler.py:1-95
- query.py:1-55
章节来源
核心组件
- 应用入口与生命周期:通过FastAPI实例与lifespan钩子实现启动与关闭阶段的资源管理。
- 配置系统:基于Pydantic Settings的环境变量读取与默认值设置,支持.env文件加载。
- 数据库层:SQLAlchemy 2.0异步引擎与会话工厂,提供异步依赖注入。
- 路由与中间件:统一注册各业务路由,配置CORS以支持前端跨域访问。
- 定时任务:APScheduler驱动的异步调度器,周期性检查并执行到期查询任务。
章节来源
架构总览
下图展示从应用启动到请求处理的关键路径,包括配置加载、数据库会话、依赖注入与定时任务启动/关闭。
sequenceDiagram
participant Uvicorn as "Uvicorn服务器"
participant App as "FastAPI应用(main.py)"
participant Lifespan as "生命周期(lifespan)"
participant Scheduler as "查询调度器(scheduler.py)"
participant Router as "路由(auth/queries)"
participant Deps as "依赖注入(deps.py)"
participant DB as "数据库(database.py)"
Uvicorn->>App : 启动应用
App->>Lifespan : 调用lifespan(启动)
Lifespan->>Scheduler : start()
Scheduler-->>Lifespan : 调度器就绪
Lifespan-->>App : 启动完成
Router->>Deps : 解析依赖(鉴权/数据库)
Deps->>DB : 获取异步会话
DB-->>Deps : 返回AsyncSession
Deps-->>Router : 当前用户/数据库会话
Uvicorn-->>App : 关闭信号
App->>Lifespan : 调用lifespan(关闭)
Lifespan->>Scheduler : shutdown()
Scheduler-->>Lifespan : 调度器关闭
Lifespan-->>App : 清理完成
图表来源
详细组件分析
FastAPI应用初始化与生命周期管理
- 应用名称与版本:在应用实例中设置标题与版本号,便于API文档与监控识别。
- 生命周期钩子:通过lifespan上下文管理器在启动时导入ORM模型并启动调度器,在关闭时优雅停止调度器与资源清理。
- 健康检查端点:提供简单健康检查接口,便于容器编排与负载均衡探测。
flowchart TD
Start(["应用启动"]) --> ImportModels["导入ORM模型"]
ImportModels --> StartScheduler["启动查询调度器"]
StartScheduler --> Ready(["应用就绪"])
Shutdown(["应用关闭"]) --> StopScheduler["停止查询调度器"]
StopScheduler --> Cleanup(["资源清理完成"])
图表来源
章节来源
CORS中间件配置
- 允许来源:配置允许的前端地址,支持凭证传递。
- 方法与头:开放所有HTTP方法与请求头,简化跨域交互。
- 生效范围:对整个应用生效,确保前端与后端API通信顺畅。
章节来源
路由注册机制
- 统一前缀与标签:各业务路由均带有统一的版本前缀与中文标签,便于API文档分类与维护。
- 依赖注入:路由函数通过Depends获取数据库会话与当前用户信息,实现鉴权与数据访问分离。
- 特殊路由:部分路由(如立即执行)复用同一前缀,保持命名一致性。
graph LR
APP["FastAPI应用(main.py)"] --> AUTH["认证路由(auth.py)"]
APP --> QUERIES["查询路由(queries.py)"]
AUTH --> DEPS["依赖注入(deps.py)"]
QUERIES --> DEPS
DEPS --> DB["数据库会话(database.py)"]
图表来源
章节来源
健康检查端点
- 路径:/health
- 响应:返回状态字典,用于容器编排与服务发现。
- 用途:Kubernetes/Compose健康检查、负载均衡探活。
章节来源
配置管理系统
- 配置类:使用Pydantic Settings定义配置项,支持.env文件加载与额外字段忽略。
- 默认值:数据库URL、Redis URL、JWT密钥与过期时间、浏览器自动化路径、第三方平台API Key等均有合理默认值。
- 加载顺序:优先读取环境变量,未设置时使用默认值;生产环境务必覆盖敏感配置。
classDiagram
class Settings {
+DATABASE_URL : str
+REDIS_URL : str
+JWT_SECRET : str
+JWT_EXPIRE_HOURS : int
+PLAYWRIGHT_BROWSERS_PATH : str
+ZHIPU_API_KEY : str
+TONGYI_API_KEY : str
}
class ConfigInstance {
+settings : Settings
}
Settings <.. ConfigInstance : "实例化"
图表来源
章节来源
数据库连接池与异步会话管理
- 引擎创建:基于配置中的数据库URL创建异步引擎,echo关闭,future启用。
- 会话工厂:配置会话类、过期策略、自动刷新与提交行为,确保事务一致性。
- 依赖注入:通过异步生成器提供会话,确保每次请求结束后正确关闭会话。
- 连接超时:当前实现未显式设置超时参数,建议在生产环境根据数据库性能调优。
sequenceDiagram
participant Router as "路由函数"
participant Deps as "依赖注入(deps.py)"
participant SessionMaker as "AsyncSessionLocal"
participant Engine as "异步引擎"
participant DB as "数据库"
Router->>Deps : 调用get_db()
Deps->>SessionMaker : 创建会话
SessionMaker->>Engine : 获取连接
Engine-->>SessionMaker : 返回连接
SessionMaker-->>Deps : 返回AsyncSession
Deps-->>Router : 提供会话
Router->>DB : 执行查询/更新
Router-->>Deps : 请求结束
Deps->>SessionMaker : 关闭会话
图表来源
章节来源
定时任务调度与资源清理
- 调度器:使用APScheduler的AsyncIOScheduler,每小时检查并执行到期查询。
- 启动流程:应用启动时调用start(),注册检查任务并启动调度器。
- 关闭流程:应用关闭时调用shutdown(),停止调度器并关闭相关资源。
- 任务执行:异步查询执行,异常捕获与日志记录,避免单个任务失败影响整体。
flowchart TD
Start(["应用启动"]) --> InitScheduler["初始化调度器"]
InitScheduler --> AddJob["添加定时任务(每小时)"]
AddJob --> Run["启动调度器"]
Run --> Tick["定时触发"]
Tick --> Check["查询到期任务"]
Check --> Exec["执行查询任务"]
Exec --> Tick
Shutdown(["应用关闭"]) --> Stop["停止调度器"]
Stop --> CloseRes["关闭资源"]
图表来源
章节来源
依赖注入与鉴权流程
- OAuth2方案:使用OAuth2PasswordBearer,令牌端点为认证登录接口。
- 用户解析:从令牌中提取用户ID,查询数据库获取用户对象。
- 异常处理:令牌无效或用户不存在时抛出401错误,确保鉴权安全。
sequenceDiagram
participant Client as "客户端"
participant Router as "路由(auth.py)"
participant Deps as "依赖注入(deps.py)"
participant DB as "数据库(database.py)"
Client->>Router : 发起受保护请求
Router->>Deps : 解析令牌与会话
Deps->>Deps : 验证JWT令牌
Deps->>DB : 查询用户信息
DB-->>Deps : 返回用户对象
Deps-->>Router : 返回当前用户
Router-->>Client : 返回响应
图表来源
章节来源
依赖分析
- 应用入口依赖:路由模块、调度器与CORS中间件。
- 路由依赖:依赖注入模块与数据库会话。
- 调度器依赖:数据库会话工厂与查询模型。
- 配置依赖:数据库与缓存URL、JWT配置等。
graph TB
MAIN["main.py"] --> ROUTERS["API路由模块"]
MAIN --> SCHED["scheduler.py"]
MAIN --> CORS["CORS中间件"]
ROUTERS --> DEPS["deps.py"]
DEPS --> DB["database.py"]
SCHED --> DB
SCHED --> MODEL["models/query.py"]
CONF["config.py"] --> DB
CONF --> SCHED
图表来源
章节来源
性能考虑
- 异步数据库:使用SQLAlchemy异步引擎与会话,减少阻塞,提升并发能力。
- 连接池参数:当前未显式设置连接池大小与超时,建议结合数据库性能与负载进行调优。
- 定时任务频率:每小时检查一次,可根据业务量调整间隔,避免频繁扫描。
- CORS开放策略:生产环境建议限制允许来源与方法,降低跨域风险。
故障排除指南
- 数据库连接失败
- 检查数据库URL与凭据是否正确,确认容器网络连通性。
- 参考:database.py:6-10
- Redis连接失败
- 确认Redis服务可用与URL正确,检查容器健康检查状态。
- 参考:config.py
- JWT鉴权失败
- 确认JWT密钥与过期时间配置,检查令牌格式与有效期。
- 参考:config.py:9-10
- 定时任务不执行
- 检查调度器启动日志与任务注册状态,确认数据库中查询状态与下次执行时间。
- 参考:scheduler.py:30-40
- CORS跨域问题
- 确认允许来源与凭证设置,生产环境建议收紧策略。
- 参考:main.py:30-36
章节来源
结论
GEO后端核心框架通过清晰的分层设计与异步化实现,提供了可扩展的配置体系、健壮的数据库会话管理与可靠的定时任务调度。建议在生产环境中完善连接池参数、收紧CORS策略并强化配置校验,以获得更稳定与安全的运行表现。
附录
- 环境变量与默认值
- 数据库URL:用于PostgreSQL连接,默认值见配置文件。
- Redis URL:用于缓存与任务队列,默认值见配置文件。
- JWT密钥与过期时间:用于令牌签发与验证。
- 浏览器自动化路径:Playwright浏览器二进制路径。
- 第三方平台API Key:用于集成外部服务。
- Docker编排
- 数据库与缓存服务通过Compose编排,后端服务依赖其健康状态。
- 前端服务依赖后端服务,命令行启动参数可按需调整。
章节来源