main.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. # 主应用入口,整合多个 FastAPI 应用
  2. import uvicorn
  3. from fastapi import FastAPI
  4. from contextlib import asynccontextmanager
  5. # 导入所有子应用
  6. from src.api.sdk.search_infinity import app as search_app
  7. from src.api.sdk.tag_manage import app as tag_app
  8. from src.api.sdk.dataset_manage import app as dataset_app
  9. from src.api.sdk.api_manage import app as api_manage_app
  10. from src.api.sdk.dify_dataset_manage import app as dify_dataset_manage_app
  11. # 导入认证中间件
  12. from src.utils.auth import verify_api_key
  13. # 定义主应用的生命周期管理
  14. @asynccontextmanager
  15. async def main_lifespan(app: FastAPI):
  16. """主应用生命周期管理"""
  17. from src.utils.infinity import get_client, close_client
  18. # 1. 初始化Infinity全局客户端(在服务启动时)
  19. get_client(database="book_image_db", min_connections=5, max_connections=10)
  20. print("✅ Infinity客户端已初始化")
  21. # 2. 初始化MySQL全局客户端
  22. from src.utils.mysql import init_global_mysql_client, close_global_mysql_client
  23. init_global_mysql_client()
  24. print("✅ MySQL客户端已初始化")
  25. # 3. 初始化MinIO全局客户端并校验存储桶
  26. from src.utils.file.minio.minio_util import init_minio_client, close_minio_client
  27. init_minio_client(check_bucket=True)
  28. print("✅ MinIO客户端已初始化并校验存储桶")
  29. # 4. 启动Chunk更新定时任务
  30. from src.job.chunk_update_job import start_scheduler, shutdown_scheduler
  31. start_scheduler()
  32. print("✅ Chunk update scheduler started")
  33. yield
  34. # 1. 关闭Chunk更新定时任务
  35. shutdown_scheduler()
  36. print("✅ Chunk update scheduler shutdown")
  37. # 2. 关闭MinIO全局客户端
  38. close_minio_client()
  39. print("✅ MinIO客户端已关闭")
  40. # 3. 关闭MySQL全局客户端
  41. close_global_mysql_client()
  42. print("✅ MySQL客户端已关闭")
  43. # 4. 关闭Infinity全局客户端(在服务关闭时)
  44. close_client()
  45. print("✅ Infinity客户端已关闭")
  46. # 创建主应用
  47. main_app = FastAPI(
  48. title="Infinity API Gateway",
  49. description="整合多个 FastAPI 应用的 API 网关",
  50. version="1.0.0",
  51. lifespan=main_lifespan
  52. )
  53. # 添加认证中间件
  54. main_app.middleware("http")(verify_api_key)
  55. # 挂载子应用
  56. # 1. 搜索 API - 访问路径: /search/*
  57. main_app.mount("/search", search_app, name="search_api")
  58. # 2. 标签管理 API - 访问路径: /tag/*
  59. main_app.mount("/tag", tag_app, name="tag_api")
  60. # 3. 数据集管理 API - 访问路径: /dataset/*
  61. main_app.mount("/dataset", dataset_app, name="dataset_api")
  62. # 4. API 管理 - 访问路径: /api/*
  63. main_app.mount("/api", api_manage_app, name="api_manage")
  64. # 5. Dify 数据集管理 API - 访问路径: /dify_dataset/*
  65. main_app.mount("/dify_dataset", dify_dataset_manage_app, name="dify_dataset_manage")
  66. from src.common.result import Result
  67. # 主应用根路径
  68. @main_app.get("/")
  69. async def root():
  70. """API 网关根路径"""
  71. data = {
  72. "message": "Welcome to GRAPH_RAG API Gateway",
  73. "available_apps": {
  74. "search_api": "访问路径: /search, 文档: /search/docs",
  75. "hybrid_http_api": "访问路径: /hybrid, 文档: /hybrid/docs",
  76. "tag_api": "访问路径: /tag, 文档: /tag/docs",
  77. "dataset_api": "访问路径: /dataset, 文档: /dataset/docs",
  78. "api_manage": "访问路径: /api, 文档: /api/docs"
  79. }
  80. }
  81. return Result.success(data=data, message="欢迎访问 GRAPH_RAG API Gateway")
  82. # 健康检查端点
  83. @main_app.get("/health")
  84. async def health_check():
  85. """主应用健康检查"""
  86. data = {"status": "healthy", "service": "Infinity API Gateway"}
  87. return Result.success(data=data, message="服务健康")
  88. if __name__ == "__main__":
  89. print("=== 启动 GRAPH_RAG API Gateway ===")
  90. """启动主应用"""
  91. uvicorn.run(
  92. "main:main_app", # 应用路径: 模块名:应用实例名
  93. host="0.0.0.0", # 允许所有IP访问
  94. port=18001, # 服务端口
  95. reload=False, # 开发模式下自动重载
  96. workers=1, # 生产环境可根据需要增加
  97. log_level="info", # 日志级别
  98. limit_concurrency=100, # 并发连接限制
  99. timeout_keep_alive=30, # 保持连接超时
  100. timeout_graceful_shutdown=10 # 优雅关闭超时
  101. )