核心应用服务
核心应用服务
相关源文件
本章引用的主要源码文件:
admin/server/admin_server.pyapi/apps/__init__.pyapi/db/init_data.pyapi/db/services/common_service.pyapi/ragflow_server.pyapi/settings.pyapi/utils/api_utils.pyconf/service_conf.yamldocker/service_conf.yaml.templaterag/utils/redis_conn.pytest/testcases/test_web_api/test_system_app/test_apps_init_unit.py
目的与范围
本文档描述了实现 RAGFlow 业务逻辑层的核心应用服务。这些服务负责文档管理、知识库操作、对话/聊天处理以及 API 请求路由。本页面重点介绍服务层架构、基于 Quart 框架的 API 服务器初始化以及应用程序中的请求流程。
有关存储层(MySQL、MinIO、Redis)的信息,请参阅数据存储架构。有关任务队列系统和工作节点协调的详细信息,请参阅任务执行与队列系统。有关大语言模型(LLM)集成的内容,请参阅大语言模型集成系统。
API 服务器初始化
RAGFlow 应用服务器通过 api/ragflow_server.py 启动,该文件负责初始化 Quart 应用并注册所有 API 路由蓝图。
服务器启动序列
启动过程包括初始化根日志记录器、加载配置、设置数据库表以及启动 Quart 事件循环。同时还会生成一个后台线程来管理文档解析进度更新。
API 服务器启动与路由注册
来源: api/ragflow_server.py:78-159, api/ragflow_server.py:53-69, api/apps/__init__.py:60-85, api/db/db_models.py:27-27, api/db/init_data.py:27-27
配置与环境
服务器通过模板系统从 service_conf.yaml 或环境变量加载配置。RuntimeConfig 类维护运行中实例的全局状态。
- 端口映射:默认 Python 后端运行在端口
9380conf/service_conf.yaml:3。 - 超时管理:Quart 超时时间延长至
600s,以适应大语言模型(LLM)的慢速响应(例如,本地 CPU 上运行的 Ollama)api/apps/__init__.py:72-73。 - 调试模式:可通过
--debug标志或RAGFLOW_DEBUGPY_LISTEN环境变量切换api/ragflow_server.py:51-51,api/ragflow_server.py:127-129。 - 动态加载:服务器初始化一个
GlobalPluginManager,用于在运行时加载组件插件api/ragflow_server.py:134-134。 - 数据库初始化:启动时,
init_web_db()确保所有 Peewee 表存在,init_superuser()创建初始管理员账户api/ragflow_server.py:105-126,api/db/init_data.py:27-27。
来源: api/ragflow_server.py:131-134, api/apps/__init__.py:72-73, conf/service_conf.yaml:1-6, api/db/init_data.py:27-27
服务层架构
服务层由实现业务逻辑的无状态服务类组成。这些服务使用 Peewee ORM 与 MySQL/PostgreSQL/OceanBase 交互,并与 Redis 协调实现锁定,与 MinIO 协调实现对象存储。所有服务都继承自 CommonService 基类,该基类提供标准的 CRUD 操作 api/db/services/common_service.py:74-86。
服务层实体关联与数据流
来源: api/db/services/common_service.py:74-106, api/ragflow_server.py:37-37, api/apps/__init__.py:26-27
核心服务组件
| 服务类 | 文件路径 | 主要职责 |
|---|---|---|
CommonService | api/db/services/common_service.py | Peewee CRUD 操作的基类,包括 query、get 和 save。包含针对数据库死锁的重试逻辑 api/db/services/common_service.py:34-190。 |
UserService | api/db/services/user_service.py | 认证以及用户到租户的映射 api/apps/__init__.py:27-27。 |
DocumentService | api/db/services/document_service.py | 文档元数据管理和解析进度跟踪 api/ragflow_server.py:37-37, api/ragflow_server.py:60-60。 |
LLMFactoriesService | api/db/services/tenant_llm_service.py | 管理大语言模型(LLM)工厂配置 api/utils/api_utils.py:48-48。 |
请求处理与安全
RAGFlow 使用 Quart 装饰器实现请求处理管线,用于认证,并使用工具函数进行数据校验和序列化。
认证流程
系统支持标准的电子邮件/密码认证、基于 JWT 的认证以及 API 令牌认证。
_load_user():内部逻辑,使用Serializer解码 JWT,或根据数据库校验APIToken记录。它会拒绝为空或过短的令牌api/apps/__init__.py:129-188。current_user:一个LocalProxy,根据请求中提供的 JWT、API 令牌或会话延迟加载用户对象api/apps/__init__.py:191-191。- 会话回退:如果请求中没有
Authorization请求头,系统会尝试使用会话中存储的_user_id,通过_load_user_from_session()解析用户api/apps/__init__.py:96-127。
来源: api/apps/__init__.py:96-191
请求校验与响应
api_utils.py 模块提供了用于处理传入数据和传出响应的标准化工具。
get_request_json():通过_coerce_request_data()安全获取 JSON 请求体,该函数同时处理 JSON 和表单数据api/utils/api_utils.py:62-93。validate_request():一个装饰器,用于对 API 端点强制执行必需参数和值约束api/utils/api_utils.py:153-176。- 序列化:
CustomJSONEncoder和serialize_for_json在生成 JSON 响应时处理复杂类型api/apps/__init__.py:67-67,api/utils/api_utils.py:95-118。 - 错误处理:使用
server_error_response生成标准化响应,该函数处理 401 未授权和特定的数据库异常api/utils/api_utils.py:135-151。
来源: api/utils/api_utils.py:62-176, api/apps/__init__.py:67-68
共享工具与模型
数据库操作
CommonService 为 Peewee 操作提供了健壮的封装。
- 重试逻辑:包含
retry_db_operation和retry_deadlock_operation,用于处理临时数据库错误和死锁,特别是针对 MySQL/OceanBaseapi/db/services/common_service.py:34-71。
Redis 集成
RedisDB 单例管理到 Valkey/Redis 的连接,提供用于速率限制和分布式锁定的共享脚本 rag/utils/redis_conn.py:60-112。
- 分布式锁:在
update_progress循环中使用,确保一次只有一个服务器实例更新文档状态api/ragflow_server.py:55-62。 - 消息队列:通过
RedisMsg支持 Redis Streams 用于任务分发rag/utils/redis_conn.py:37-58。
来源: api/db/services/common_service.py:34-71, rag/utils/redis_conn.py:60-112, api/ragflow_server.py:55-62