main.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # 主应用入口,整合多个 FastAPI 应用
  2. import uvicorn
  3. from fastapi import FastAPI
  4. from contextlib import asynccontextmanager
  5. from src.common.logging_config import get_logger
  6. # 获取日志器
  7. logger = get_logger(__name__)
  8. from src.api.sdk.search_infinity import app as search_app
  9. from src.api.sdk.tag_manage import app as tag_app
  10. from src.api.sdk.dataset_manage import app as dataset_app
  11. from src.api.sdk.api_manage import app as api_manage_app
  12. from src.api.sdk.dify_dataset_manage import app as dify_dataset_manage_app
  13. from src.api.sdk.prompt_manage import app as prompt_manage_app
  14. # 导入认证中间件
  15. from src.utils.auth import verify_api_key
  16. # 定义主应用的生命周期管理
  17. @asynccontextmanager
  18. async def main_lifespan(app: FastAPI):
  19. """主应用生命周期管理"""
  20. from src.conf.settings import vector_db_settings
  21. from src.utils.vector_db import get_vector_db_client, close_vector_db_client
  22. # 1. 初始化向量数据库客户端(根据配置选择 Infinity 或 Elasticsearch)
  23. db_type = vector_db_settings.vector_db_type
  24. if db_type == "infinity":
  25. get_vector_db_client(database="book_image_db")
  26. logger.info("✅ Infinity向量数据库客户端已初始化")
  27. elif db_type == "es":
  28. get_vector_db_client()
  29. logger.info("✅ Elasticsearch向量数据库客户端已初始化")
  30. else:
  31. logger.warning(f"⚠️ 未知的向量数据库类型: {db_type}")
  32. # 2. 初始化MySQL全局客户端
  33. from src.utils.mysql import init_global_mysql_client, close_global_mysql_client
  34. init_global_mysql_client()
  35. logger.info("✅ MySQL客户端已初始化")
  36. # 3. 初始化MinIO全局客户端并校验存储桶
  37. from src.utils.file.minio.minio_util import init_minio_client, close_minio_client
  38. init_minio_client(check_bucket=True)
  39. logger.info("✅ MinIO客户端已初始化并校验存储桶")
  40. # 4. 初始化提示词维度对应的向量数据库表/索引
  41. from src.api.db.services.prompt_service import get_prompt_service
  42. prompt_service = get_prompt_service()
  43. prompt_service.init_vector_db_tables()
  44. logger.info("✅ 提示词维度向量数据库表/索引已初始化")
  45. # 5. 启动Chunk更新定时任务
  46. from src.job.chunk_update_job import start_scheduler, shutdown_scheduler
  47. start_scheduler()
  48. logger.info("✅ Chunk update scheduler started")
  49. yield
  50. # 1. 关闭Chunk更新定时任务
  51. shutdown_scheduler()
  52. logger.info("✅ Chunk update scheduler shutdown")
  53. # 2. 关闭全局线程池
  54. from src.utils.async_utils import ThreadPoolManager
  55. ThreadPoolManager.shutdown_all()
  56. logger.info("✅ 全局线程池已关闭")
  57. # 3. 关闭MinIO全局客户端
  58. close_minio_client()
  59. logger.info("✅ MinIO客户端已关闭")
  60. # 4. 关闭MySQL全局客户端
  61. close_global_mysql_client()
  62. logger.info("✅ MySQL客户端已关闭")
  63. # 5. 关闭向量数据库客户端
  64. close_vector_db_client()
  65. logger.info(f"✅ 向量数据库客户端已关闭 (类型: {db_type})")
  66. # 创建主应用
  67. main_app = FastAPI(
  68. title="Infinity API Gateway",
  69. description="整合多个 FastAPI 应用的 API 网关",
  70. version="1.0.0",
  71. lifespan=main_lifespan
  72. )
  73. # 添加认证中间件
  74. main_app.middleware("http")(verify_api_key)
  75. # 挂载子应用
  76. # 1. 搜索 API - 访问路径: /search/*
  77. main_app.mount("/search", search_app, name="search_api")
  78. # 2. 标签管理 API - 访问路径: /tag/*
  79. main_app.mount("/tag", tag_app, name="tag_api")
  80. # 3. 数据集管理 API - 访问路径: /dataset/*
  81. main_app.mount("/dataset", dataset_app, name="dataset_api")
  82. # 4. API 管理 - 访问路径: /api/*
  83. main_app.mount("/api", api_manage_app, name="api_manage")
  84. # 5. Dify 数据集管理 API - 访问路径: /dify_dataset/*
  85. main_app.mount("/dify_dataset", dify_dataset_manage_app, name="dify_dataset_manage")
  86. # 6. 提示词管理 API - 访问路径: /prompt/*
  87. main_app.mount("/prompt", prompt_manage_app, name="prompt_manage")
  88. from src.common.result import Result
  89. # 主应用根路径
  90. @main_app.get("/")
  91. async def root():
  92. """API 网关根路径"""
  93. data = {
  94. "message": "Welcome to GRAPH_RAG API Gateway",
  95. "available_apps": {
  96. "search_api": "访问路径: /search, 文档: /search/docs",
  97. "hybrid_http_api": "访问路径: /hybrid, 文档: /hybrid/docs",
  98. "tag_api": "访问路径: /tag, 文档: /tag/docs",
  99. "dataset_api": "访问路径: /dataset, 文档: /dataset/docs",
  100. "api_manage": "访问路径: /api, 文档: /api/docs"
  101. }
  102. }
  103. return Result.success(data=data, message="欢迎访问 GRAPH_RAG API Gateway")
  104. # 健康检查端点
  105. @main_app.get("/health")
  106. async def health_check():
  107. """主应用健康检查"""
  108. from src.utils.task_queue import get_task_queue
  109. queue_info = get_task_queue().get_queue_info()
  110. data = {
  111. "status": "healthy",
  112. "service": "Infinity API Gateway",
  113. "version": "2.0.0",
  114. "queue": queue_info
  115. }
  116. return Result.success(data=data, message="服务健康")
  117. if __name__ == "__main__":
  118. logger.info("=== 启动 GRAPH_RAG API Gateway ===")
  119. """启动主应用"""
  120. uvicorn.run(
  121. "main:main_app", # 应用路径: 模块名:应用实例名
  122. host="0.0.0.0", # 允许所有IP访问
  123. port=18001, # 服务端口
  124. reload=False, # 开发模式下自动重载
  125. workers=1, # 生产环境可根据需要增加
  126. log_level="info", # 日志级别
  127. limit_concurrency=100, # 并发连接限制
  128. timeout_keep_alive=30, # 保持连接超时
  129. timeout_graceful_shutdown=10 # 优雅关闭超时
  130. )