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