from fastapi import APIRouter, HTTPException, Body, status from fastapi.responses import JSONResponse import httpx from ..core.logger import get_logger from ..core.config import settings from contextlib import asynccontextmanager logger = get_logger(__name__) router = APIRouter() # 1. 创建一个全局的 client (配置好超时和连接池) # limits: max_keepalive_connections 控制连接池大小 http_client = httpx.AsyncClient(timeout=10.0, limits=httpx.Limits(max_keepalive_connections=20, max_connections=100)) @router.get("/scoring_config", summary="[代理] 获取评分配置") async def proxy_get_scoring_config(): target_url = settings.SCORE_SERVER_CONFIG_URL try: # 2. 直接使用全局 client,不需要 async with resp = await http_client.get(target_url) if resp.status_code != 200: logger.error(f"项目1返回错误: {resp.status_code} - {resp.text}") raise HTTPException( status_code=resp.status_code, detail=resp.json().get("detail", "上游服务错误") ) return resp.json() except httpx.RequestError as exc: # ... 错误处理保持不变 ... logger.error(f"连接项目1失败: {exc}") raise HTTPException(status_code=503, detail=str(exc)) @router.put("/scoring_config", summary="[代理] 更新评分配置") async def proxy_update_scoring_config(config_data: dict = Body(...)): target_url = settings.SCORE_SERVER_CONFIG_URL try: # 2. 复用连接 resp = await http_client.put(target_url, json=config_data) if resp.status_code != 200: # ... 错误处理保持不变 ... raise HTTPException(status_code=resp.status_code, detail="Error") return JSONResponse(status_code=resp.status_code, content=resp.json()) except httpx.RequestError as exc: logger.error(f"连接项目1失败: {exc}") raise HTTPException(status_code=503, detail=str(exc))