
FastAPI 高性能 API 开发三个核心优化方向与生产级架构实践引言用 Python 做后端 APIFastAPI 基本是现在的首选——原生异步支持、自动生成接口文档、开发效率高。但不少项目跑起来之后并发一上来响应就变慢很多时候不是框架不行是架构和细节没处理好。本文从三个实战维度结合可直接复用的代码讲讲怎么把 FastAPI 服务的性能做扎实从能跑到生产级。一、路由模块化拆分依赖按需注入很多新手写 FastAPI 喜欢把所有路由都堆在启动文件里鉴权、日志、参数校验这些依赖全局全量挂载。项目小的时候看不出问题接口一多不仅代码臃肿难维护每个请求都要走一遍无关的中间件逻辑平白增加响应耗时。1.1 按业务域拆分路由优化思路很直接按业务域拆分路由模块依赖只在需要的路由层级注入不要搞全局一刀切。# app/routers/user.pyfromfastapiimportAPIRouter,Dependsfrom..dependencies.authimportverify_tokenfrom..services.userimportget_user_by_id# 定义用户模块路由统一前缀和标签routerAPIRouter(prefix/user,tags[用户接口])# 仅当前模块的所有接口注入鉴权依赖不影响其他路由router.dependencies[Depends(verify_token)]router.get(/{user_id})asyncdefget_user_info(user_id:int):userawaitget_user_by_id(user_id)return{code:0,data:user}router.get(/{user_id}/orders)asyncdefget_user_orders(user_id:int,page:int1,size:int20):ordersawaitget_user_orders_paginated(user_id,page,size)return{code:0,data:orders}# app/routers/order.pyfromfastapiimportAPIRouter,Dependsfrom..dependencies.authimportverify_token,verify_order_permissionfrom..services.orderimportcreate_order,get_order_detail routerAPIRouter(prefix/order,tags[订单接口])router.dependencies[Depends(verify_token)]router.post(/)asyncdefcreate_new_order(order_data:OrderCreateSchema):# 创建订单需要额外的权限校验orderawaitcreate_order(order_data)return{code:0,data:order}router.get(/{order_id})asyncdefget_order(order_id:str):orderawaitget_order_detail(order_id)return{code:0,data:order}1.2 主启动文件保持清爽# app/main.pyfromfastapiimportFastAPI,Requestfromfastapi.responsesimportJSONResponsefromfastapi.middleware.corsimportCORSMiddlewarefrom.routersimportuser,order,productimportlogging loggerlogging.getLogger(__name__)appFastAPI(title业务API服务,version2.0.0,docs_url/api/docs,redoc_url/api/redoc,)# CORS 中间件全局app.add_middleware(CORSMiddleware,allow_origins[https://example.com],allow_credentialsTrue,allow_methods[*],allow_headers[*],)# 按业务模块挂载路由统一 /api 前缀app.include_router(user.router,prefix/api)app.include_router(order.router,prefix/api)app.include_router(product.router,prefix/api)# 全局统一异常处理app.exception_handler(Exception)asyncdefglobal_error_handler(request:Request,exc:Exception):logger.error(f请求异常 [{request.method}{request.url.path}]:{str(exc)},exc_infoTrue)returnJSONResponse(status_code500,content{code:500,msg:服务内部错误,request_id:request.state.request_id})# 健康检查app.get(/health)asyncdefhealth_check():return{status:healthy,version:2.0.0}1.3 依赖注入的最佳实践# app/dependencies/auth.pyfromfastapiimportDepends,HTTPException,HeaderfromtypingimportOptionalasyncdefverify_token(authorization:Optional[str]Header(None))-dict:验证 JWT Token返回用户信息ifnotauthorizationornotauthorization.startswith(Bearer ):raiseHTTPException(status_code401,detail未提供有效的认证令牌)tokenauthorization.replace(Bearer ,)try:payloaddecode_jwt(token)return{user_id:payload[sub],role:payload.get(role,user)}exceptException:raiseHTTPException(status_code401,detail认证令牌无效或已过期)asyncdefverify_admin(user:dictDepends(verify_token)):验证管理员权限ifuser.get(role)!admin:raiseHTTPException(status_code403,detail需要管理员权限)returnuser# 使用示例只有管理员能访问router.delete(/users/{user_id})asyncdefdelete_user(user_id:int,admin:dictDepends(verify_admin)):awaitdelete_user_service(user_id)return{code:0,msg:用户已删除}二、异步数据库连接池 并行查询Python API 的性能瓶颈十有八九出在数据库 IO 上。FastAPI 的异步优势必须搭配异步数据库驱动才能完全发挥。2.1 使用 asyncpg 替代 psycopg2# app/database.pyimportasyncpgfromtypingimportOptionalclassDatabase:def__init__(self):self.pool:Optional[asyncpg.Pool]Noneasyncdefconnect(self,dsn:str):self.poolawaitasyncpg.create_pool(dsn,min_size5,# 最小连接数max_size20,# 最大连接数max_queries50000,# 每个连接最大查询数防止内存泄漏max_inactive_connection_lifetime300,# 空闲连接最大存活时间command_timeout60,# 单条命令超时时间)asyncdefdisconnect(self):ifself.pool:awaitself.pool.close()asyncdeffetch(self,query:str,*args):asyncwithself.pool.acquire()asconn:returnawaitconn.fetch(query,*args)asyncdeffetchrow(self,query:str,*args):asyncwithself.pool.acquire()asconn:returnawaitconn.fetchrow(query,*args)asyncdefexecute(self,query:str,*args):asyncwithself.pool.acquire()asconn:returnawaitconn.execute(query,*args)dbDatabase()2.2 并行查询优化当需要查询多个不相关的数据时使用asyncio.gather并行执行importasynciofromfastapiimportAPIRouter routerAPIRouter()router.get(/dashboard)asyncdefget_dashboard(user:dictDepends(verify_token)):user_iduser[user_id]# 并行查询多个不相关的数据user_info,orders,notifications,statsawaitasyncio.gather(db.fetchrow(SELECT * FROM users WHERE id $1,user_id),db.fetch(SELECT * FROM orders WHERE user_id $1 ORDER BY created_at DESC LIMIT 10,user_id),db.fetch(SELECT * FROM notifications WHERE user_id $1 AND read false LIMIT 5,user_id),db.fetchrow( SELECT COUNT(*) as total_orders, COALESCE(SUM(amount), 0) as total_spent FROM orders WHERE user_id $1 ,user_id),)return{code:0,data:{user:dict(user_info)ifuser_infoelseNone,recent_orders:[dict(o)foroinorders],unread_notifications:[dict(n)forninnotifications],stats:dict(stats)ifstatselse{total_orders:0,total_spent:0},}}2.3 数据库查询优化# 使用连接池的上下文管理器asyncdefget_user_with_orders(user_id:int):asyncwithdb.pool.acquire()asconn:# 使用 prepared statement自动缓存执行计划userawaitconn.fetchrow(SELECT id, name, email FROM users WHERE id $1,user_id)ifnotuser:returnNoneordersawaitconn.fetch(SELECT id, amount, status, created_at FROM orders WHERE user_id $1 ORDER BY created_at DESC LIMIT 20,user_id)return{user:dict(user),orders:[dict(o)foroinorders]}三、缓存策略与响应优化3.1 多级缓存架构importjsonimporthashlibfromfunctoolsimportwrapsfromredis.asyncioimportRedis redisRedis.from_url(redis://localhost:6379,decode_responsesTrue)defcache_response(ttl:int300):响应缓存装饰器defdecorator(func):wraps(func)asyncdefwrapper(*args,**kwargs):# 生成缓存键cache_key_parts[func.__name__,str(args),str(sorted(kwargs.items()))]cache_keyhashlib.md5(json.dumps(cache_key_parts).encode()).hexdigest()# 尝试从缓存获取cachedawaitredis.get(fapi_cache:{cache_key})ifcached:returnjson.loads(cached)# 执行函数并缓存结果resultawaitfunc(*args,**kwargs)awaitredis.setex(fapi_cache:{cache_key},ttl,json.dumps(result,defaultstr))returnresultreturnwrapperreturndecorator# 使用示例router.get(/products/{product_id})cache_response(ttl600)# 缓存10分钟asyncdefget_product(product_id:int):productawaitdb.fetchrow(SELECT * FROM products WHERE id $1,product_id)ifnotproduct:raiseHTTPException(status_code404,detail产品不存在)return{code:0,data:dict(product)}3.2 响应压缩fromfastapi.middleware.gzipimportGZipMiddleware# 添加 GZip 压缩中间件最小压缩阈值 1000 字节app.add_middleware(GZipMiddleware,minimum_size1000)3.3 分页查询优化fromtypingimportGeneric,TypeVar,ListfrompydanticimportBaseModel TTypeVar(T)classPaginatedResponse(BaseModel,Generic[T]):items:List[T]total:intpage:intsize:intpages:intasyncdefpaginated_query(table:str,page:int1,size:int20,where_clause:str,params:listNone,order_by:strid DESC)-dict:通用分页查询函数offset(page-1)*size# 并行执行计数和数据查询count_queryfSELECT COUNT(*) FROM{table}{where_clause}data_queryfSELECT * FROM{table}{where_clause}ORDER BY{order_by}LIMIT{size}OFFSET{offset}total_row,itemsawaitasyncio.gather(db.fetchrow(count_query,*(paramsor[])),db.fetch(data_query,*(paramsor[])))totaltotal_row[count]pages(totalsize-1)//sizereturn{items:[dict(item)foriteminitems],total:total,page:page,size:size,pages:pages}四、生产级部署架构4.1 使用 Uvicorn Gunicorn# 生产环境启动命令gunicorn app.main:app\--workers4\--worker-class uvicorn.workers.UvicornWorker\--bind0.0.0.0:8000\--timeout120\--keep-alive5\--max-requests10000\--max-requests-jitter1000\--access-logfile -\--error-logfile -4.2 Docker 化部署FROM python:3.12-slim WORKDIR /app # 安装依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 使用非 root 用户运行 RUN useradd -m -u 1000 appuser chown -R appuser:appuser /app USER appuser EXPOSE 8000 CMD [gunicorn, app.main:app, \ --workers, 4, \ --worker-class, uvicorn.workers.UvicornWorker, \ --bind, 0.0.0.0:8000]4.3 健康检查与优雅关闭fromcontextlibimportasynccontextmanagerasynccontextmanagerasyncdeflifespan(app:FastAPI):# 启动时连接数据库和 Redisawaitdb.connect(postgresql://user:passlocalhost:5432/mydb)awaitredis.ping()logger.info(服务启动完成)yield# 关闭时优雅关闭连接awaitdb.disconnect()awaitredis.close()logger.info(服务已关闭)appFastAPI(lifespanlifespan)五、总结FastAPI 的高性能优化不是玄学而是工程实践的系统化。三个核心方向——路由模块化、异步数据库优化、缓存策略——覆盖了90%以上的性能瓶颈场景。关键要点回顾依赖按需注入不要在全局挂载所有依赖按路由模块精准注入异步数据库驱动asyncpg 替代 psycopg2性能提升显著并行查询使用 asyncio.gather 并行执行不相关的数据库查询多级缓存Redis 缓存热点数据减少数据库压力连接池管理合理配置连接池大小避免连接泄漏生产部署Gunicorn Uvicorn Worker配合 Docker 和健康检查把这些优化落地到项目中你的 FastAPI 服务就能从能跑进化到生产级。