当前位置: 首页 > article >正文

FastAPI速率限制:Redis分布式实现的终极指南

FastAPI速率限制Redis分布式实现的终极指南【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapiFastAPI作为高性能的现代Web框架为API开发提供了强大的工具集。然而在生产环境中速率限制是保护API免受恶意请求和DDoS攻击的关键安全措施。本文将深入探讨如何在FastAPI中实现基于Redis的分布式速率限制确保您的API在高并发场景下保持稳定和安全。为什么需要速率限制速率限制是API安全的第一道防线它能够防止滥用限制单个用户或IP地址的请求频率保护资源避免服务器被大量请求压垮公平使用确保所有用户都能公平访问API资源成本控制减少不必要的服务器资源消耗对于分布式系统传统的单机限流方案已无法满足需求我们需要Redis分布式限流来确保多实例环境下的统一限流策略。FastAPI中间件机制解析FastAPI的中间件机制是实现速率限制的理想选择。中间件可以在请求到达具体路由之前和响应返回客户端之后执行自定义逻辑。查看中间件示例我们可以看到基本的中间件结构app.middleware(http) async def add_process_time_header(request: Request, call_next): start_time time.perf_counter() response await call_next(request) process_time time.perf_counter() - start_time response.headers[X-Process-Time] str(process_time) return responseRedis分布式限流的核心原理令牌桶算法实现令牌桶算法是最常用的限流算法之一它的工作原理是系统以固定速率向桶中添加令牌每个请求需要消耗一个令牌如果桶中没有令牌请求被拒绝Redis作为共享存储确保多实例间的令牌计数一致滑动窗口计数器另一种常用方法是滑动窗口计数器它在Redis中存储时间窗口内的请求计数使用Redis的有序集合ZSET存储请求时间戳每个请求添加当前时间戳到集合移除时间窗口外的旧时间戳检查当前窗口内的请求数量是否超过限制实现Redis分布式限流中间件安装依赖首先安装必要的Python包pip install fastapi redis aioredis创建限流中间件在FastAPI项目中创建rate_limit_middleware.pyimport time from typing import Optional from fastapi import FastAPI, Request, HTTPException from fastapi.responses import JSONResponse import redis.asyncio as redis from redis.exceptions import RedisError class RateLimiter: def __init__(self, redis_client: redis.Redis, rate_limit: int 100, window: int 60): self.redis redis_client self.rate_limit rate_limit # 每分钟最大请求数 self.window window # 时间窗口秒 async def is_allowed(self, key: str) - bool: 检查是否允许请求 try: current_time int(time.time()) window_start current_time - self.window # 使用Redis管道提高性能 pipe self.redis.pipeline() pipe.zremrangebyscore(key, 0, window_start) pipe.zadd(key, {str(current_time): current_time}) pipe.zcard(key) pipe.expire(key, self.window) results await pipe.execute() request_count results[2] return request_count self.rate_limit except RedisError: # Redis故障时降级允许请求通过 return True def create_rate_limit_middleware( redis_url: str redis://localhost:6379, rate_limit: int 100, window: int 60 ): 创建速率限制中间件工厂函数 async def rate_limit_middleware(request: Request, call_next): # 获取客户端标识可以使用IP、API密钥等 client_id request.client.host if request.client else unknown endpoint request.url.path # 创建Redis客户端 redis_client redis.from_url(redis_url) limiter RateLimiter(redis_client, rate_limit, window) # 生成限流键 rate_key frate_limit:{client_id}:{endpoint} # 检查是否允许请求 if not await limiter.is_allowed(rate_key): return JSONResponse( status_code429, content{ detail: 请求过于频繁请稍后再试, retry_after: window }, headers{Retry-After: str(window)} ) # 处理请求 try: response await call_next(request) # 添加限流信息到响应头 response.headers[X-RateLimit-Limit] str(rate_limit) response.headers[X-RateLimit-Remaining] str( max(0, rate_limit - await limiter.get_current_count(rate_key)) ) response.headers[X-RateLimit-Reset] str( int(time.time()) window ) return response finally: await redis_client.aclose() return rate_limit_middleware集成到FastAPI应用在main.py中集成速率限制中间件from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from rate_limit_middleware import create_rate_limit_middleware app FastAPI(title带速率限制的API服务) # 添加CORS中间件 app.add_middleware( CORSMiddleware, allow_origins[*], allow_credentialsTrue, allow_methods[*], allow_headers[*], ) # 添加速率限制中间件 app.middleware(http)( create_rate_limit_middleware( redis_urlredis://localhost:6379, rate_limit100, # 每分钟100次 window60 # 60秒窗口 ) ) app.get(/) async def root(): return {message: 欢迎使用带速率限制的FastAPI API} app.get(/api/data) async def get_data(): return {data: 这是受保护的API数据}高级配置与优化技巧1. 差异化限流策略不同的API端点可能需要不同的限流策略# 在中间件中添加差异化限流 async def rate_limit_middleware(request: Request, call_next): endpoint request.url.path # 根据端点设置不同的限流规则 if endpoint.startswith(/api/admin): rate_limit 50 # 管理接口限制更严格 elif endpoint.startswith(/api/public): rate_limit 500 # 公共接口限制较宽松 else: rate_limit 100 # 默认限制 # ... 其余限流逻辑2. 基于用户的限流使用API密钥或用户ID进行更精细的限流async def get_user_identifier(request: Request) - str: 获取用户标识 # 优先使用API密钥 api_key request.headers.get(X-API-Key) if api_key: return fuser:{api_key} # 回退到IP地址 client_ip request.client.host if request.client else unknown return fip:{client_ip}3. 突发流量处理允许短时间内的突发流量class BurstRateLimiter(RateLimiter): def __init__(self, redis_client, base_rate: int 100, burst_rate: int 200, window: int 60): super().__init__(redis_client, base_rate, window) self.burst_rate burst_rate self.burst_window 10 # 突发窗口秒 async def is_allowed(self, key: str) - bool: # 检查突发窗口 burst_key f{key}:burst burst_allowed await self._check_burst(burst_key) if burst_allowed: return True # 检查常规窗口 return await super().is_allowed(key)4. Redis集群支持对于高可用性需求使用Redis集群from redis.cluster import RedisCluster redis_client RedisCluster( startup_nodes[ {host: redis-node-1, port: 6379}, {host: redis-node-2, port: 6379}, {host: redis-node-3, port: 6379}, ], decode_responsesTrue )测试与监控单元测试创建测试确保限流功能正常工作import pytest from fastapi.testclient import TestClient from main import app client TestClient(app) def test_rate_limit(): 测试速率限制功能 responses [] # 发送超过限制的请求 for i in range(150): response client.get(/api/data) responses.append(response.status_code) # 统计429状态码的数量 too_many_requests sum(1 for code in responses if code 429) assert too_many_requests 0, 速率限制未生效 # 验证响应头包含限流信息 response client.get(/api/data) assert X-RateLimit-Limit in response.headers assert X-RateLimit-Remaining in response.headers监控指标添加监控指标到Prometheusfrom prometheus_client import Counter, Histogram # 定义监控指标 rate_limit_hits Counter( rate_limit_hits_total, Total number of rate limit hits, [client_id, endpoint] ) request_duration Histogram( request_duration_seconds, Request duration in seconds, [method, endpoint, status] ) # 在中间件中记录指标 async def rate_limit_middleware(request: Request, call_next): start_time time.time() # ... 限流逻辑 if not allowed: rate_limit_hits.labels(client_idclient_id, endpointendpoint).inc() return JSONResponse(...) response await call_next(request) # 记录请求持续时间 duration time.time() - start_time request_duration.labels( methodrequest.method, endpointendpoint, statusresponse.status_code ).observe(duration) return response最佳实践与注意事项1. 渐进式限流对于新用户或异常流量采用渐进式限流策略async def progressive_rate_limit(client_id: str) - bool: 渐进式限流新用户限制较松逐步收紧 user_age await get_user_age(client_id) # 获取用户注册时间 if user_age 3600: # 注册不到1小时 return await check_limit(client_id, rate50) elif user_age 86400: # 注册不到1天 return await check_limit(client_id, rate30) else: # 老用户 return await check_limit(client_id, rate10)2. 优雅降级当Redis不可用时实现优雅降级class FallbackRateLimiter: def __init__(self, redis_client, local_cache): self.redis redis_client self.local_cache local_cache self.use_redis True async def is_allowed(self, key: str) - bool: try: if self.use_redis: return await self._redis_check(key) else: return self._local_check(key) except RedisError: # Redis故障切换到本地缓存 self.use_redis False return self._local_check(key)3. 配置管理使用环境变量管理限流配置import os from pydantic_settings import BaseSettings class RateLimitSettings(BaseSettings): redis_url: str os.getenv(REDIS_URL, redis://localhost:6379) default_rate_limit: int int(os.getenv(DEFAULT_RATE_LIMIT, 100)) admin_rate_limit: int int(os.getenv(ADMIN_RATE_LIMIT, 50)) public_rate_limit: int int(os.getenv(PUBLIC_RATE_LIMIT, 500)) rate_limit_window: int int(os.getenv(RATE_LIMIT_WINDOW, 60)) class Config: env_file .env性能优化建议连接池管理使用Redis连接池减少连接开销批量操作使用Redis管道pipeline减少网络往返本地缓存在应用层添加本地缓存减少Redis访问异步操作确保所有Redis操作都是异步的监控告警设置Redis性能监控和告警总结通过本文的指南您已经掌握了在FastAPI中实现Redis分布式速率限制的完整方案。这种方案不仅能够保护您的API免受滥用还能在多实例部署中保持一致的限流策略。记住良好的限流策略应该✅灵活可配置支持不同端点的差异化限流✅容错性强Redis故障时优雅降级✅易于监控提供详细的限流指标和日志✅性能高效使用异步操作和连接池优化性能FastAPI的中间件机制与Redis的强大功能相结合为您构建安全、可靠、高性能的API服务提供了完美解决方案。现在就开始实施这些最佳实践让您的API在分布式环境中更加健壮和安全【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

FastAPI速率限制:Redis分布式实现的终极指南

FastAPI速率限制:Redis分布式实现的终极指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI作为高性能的现代Web框…...

SeqGPT-560M开源可部署安全实践:SELinux策略配置与容器最小权限原则

SeqGPT-560M开源可部署安全实践:SELinux策略配置与容器最小权限原则 1. 引言:为什么企业级AI部署必须关注安全? 当你把像SeqGPT-560M这样强大的智能信息抽取系统部署到生产环境时,兴奋之余,一个严肃的问题必须摆在首…...

前端面试高频考点总结(不仅有考点,还有对应解答)

2026年 AI面试 经验分享 前端面试核心要点 技术考察转向实际场景与新兴技术,重点包括: JavaScript/TypeScript核心机制与编码能力React/Vue3的高阶特性与原理工程化与性能优化体系网络/安全与综合性场景题 3-5年经验者需突出: 技术原理深度&a…...

Swin2SR进阶使用:通过HTTP链接实现远程增强

Swin2SR进阶使用:通过HTTP链接实现远程增强 1. 引言:从本地工具到远程服务 如果你用过Swin2SR这个AI图像超分工具,一定会被它“化腐朽为神奇”的能力震撼——一张模糊的小图,经过AI的“脑补”,瞬间变成细节丰富的高清…...

3个秘诀让AI成为你的象棋教练:Vin象棋智能助手完全指南

3个秘诀让AI成为你的象棋教练:Vin象棋智能助手完全指南 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 你是否曾遇到这样的象棋困境&#xff1…...

如何快速上手Archivy:5分钟搭建个人知识管理系统

如何快速上手Archivy:5分钟搭建个人知识管理系统 【免费下载链接】archivy Archivy is a self-hostable knowledge repository that allows you to learn and retain information in your own personal and extensible wiki. 项目地址: https://gitcode.com/gh_mi…...

80+款Android UI模板深度解析:从零到一构建专业级应用界面的实战指南

80款Android UI模板深度解析:从零到一构建专业级应用界面的实战指南 【免费下载链接】Android-ui-templates Download free android app templates free and paid. 项目地址: https://gitcode.com/gh_mirrors/an/Android-ui-templates 在当今移动应用开发领域…...

革命性智能求职助手:AI驱动的多平台简历投递解决方案

革命性智能求职助手:AI驱动的多平台简历投递解决方案 【免费下载链接】get_jobs 💼【找工作最强助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、拉勾、智联招聘) 项目地址: https://gitcode.com/gh_mirrors/ge/get_jobs 你是否还…...

存储性能指标全解析:从IOPS到响应时间的实战指南

1. 存储性能指标入门:从买菜到地铁的日常类比 刚接触存储性能指标时,那些英文缩写就像天书一样让人头疼。其实这些概念在我们生活中随处可见,只是换了个马甲而已。想象一下早高峰的地铁站:IOPS就像每分钟通过闸机的人数&#xff0…...

QT5集成libmodbus:多线程优化主从机通信的实践指南

1. 为什么需要多线程优化libmodbus通信 在工业监控软件开发中,我们经常遇到一个典型场景:上位机需要实时采集多个下位机的数据,同时还要保证用户界面的流畅响应。使用QT5集成libmodbus时,很多开发者会直接在主线程中实现数据采集逻…...

电机控制进阶:从增量式与位置式PID到现代复合控制策略

1. PID控制的前世今生:从工业革命到智能时代 第一次接触PID控制器时,我被这个诞生于上世纪30年代的"古董级"算法震惊了。当时正在调试一台伺服电机,系统总是出现超调和振荡。导师递给我一张写着三个参数的纸条:"试…...

2026最新!AI论文软件测评:这几款让你写作更高效

2026年真正好用的AI论文软件,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…...

BongoCat:重新定义桌面体验的互动工具

BongoCat:重新定义桌面体验的互动工具 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 你是否曾觉得日复一日的…...

OptiScaler终极配置指南:解锁游戏画质提升的7个关键技术

OptiScaler终极配置指南:解锁游戏画质提升的7个关键技术 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler OptiScaler是一…...

MATLAB实时绘图卡顿?优化串口通信与图形刷新的几个实用技巧

MATLAB实时绘图性能优化:突破串口通信与图形刷新的瓶颈 当你在实验室里盯着屏幕上跳动的数据曲线,却发现它像老式幻灯片一样一卡一顿时,那种挫败感简直让人抓狂。特别是在处理高速ADC采样或长时间运行的实验时,MATLAB默认的绘图方…...

避坑指南:glmnet做lasso回归时分类变量的3个常见错误及解决方法

避坑指南:glmnet做lasso回归时分类变量的3个常见错误及解决方法 在生物信息学和临床数据分析领域,lasso回归因其出色的变量选择能力而广受欢迎。R语言中的glmnet包是实现lasso回归的利器,但许多初学者在处理分类变量时频频踩坑。本文将揭示三…...

从MATLAB到Python:脑网络连通性分析之PLI/wPLI的跨平台实现与结果对比

从MATLAB到Python:脑网络连通性分析之PLI/wPLI的跨平台实现与结果对比 神经科学研究中,脑网络连通性分析正成为理解认知功能与疾病机制的重要工具。其中,相位滞后指数(PLI)及其加权版本(wPLI)因…...

Pipfile vs requirements.txt:10个关键差异对比分析

Pipfile vs requirements.txt:10个关键差异对比分析 【免费下载链接】pipfile 项目地址: https://gitcode.com/gh_mirrors/pi/pipfile 在Python开发中,依赖管理是项目成功的关键环节。Pipfile和requirements.txt作为两种主流的依赖管理方式&…...

从“触觉神经”到“智能反射”:六维力传感器如何重塑人形机器人的交互范式

1. 六维力传感器:人形机器人的"触觉神经" 想象一下你闭着眼睛伸手去拿桌上的水杯。在指尖接触杯壁的瞬间,你的皮肤会感知压力变化,神经信号以毫秒级速度传递到大脑,手指肌肉随即调整力度——既不会捏碎杯子,…...

AnythingLLM文档处理革命:如何用统一接口解析20+文件格式构建智能知识库

AnythingLLM文档处理革命:如何用统一接口解析20文件格式构建智能知识库 【免费下载链接】anything-llm 这是一个全栈应用程序,可以将任何文档、资源(如网址链接、音频、视频)或内容片段转换为上下文,以便任何大语言模型…...

PFC 2D二维直剪代码解析与源文件分享

PFC 2D 二维直剪,代码逐行解释,提供源文件。 。 嘿,各位岩土工程或者离散元爱好者们!今天咱来唠唠PFC 2D里二维直剪的事儿,顺便把代码给大家扒一扒,逐行解释清楚,最后源文件也双手奉上&#xff…...

如何用Pollinations.ai在5分钟内创建专业级AI艺术作品

如何用Pollinations.ai在5分钟内创建专业级AI艺术作品 【免费下载链接】pollinations Generate Art 项目地址: https://gitcode.com/gh_mirrors/po/pollinations Pollinations.ai是一款强大的开源AI艺术生成工具,能让你在短短5分钟内从零开始创建令人惊叹的专…...

手把手教你用哥斯拉Godzilla搭建渗透测试环境(附常见错误解决方案)

实战指南:Windows环境下渗透测试工具的高效配置与排错 在网络安全领域,渗透测试工具的正确配置往往是技术实践的第一步门槛。对于刚接触安全测试的新手来说,从零开始搭建环境不仅需要清晰的步骤指引,更需要理解每个环节可能出现的…...

Qwen-Image效果实测:对比传统模型,看看它的中文理解强在哪

Qwen-Image效果实测:对比传统模型,看看它的中文理解强在哪 你有没有试过用AI画图,结果被它“气”到哭笑不得?比如,你想画一个“穿着旗袍的女士在江南水乡的乌篷船上喝茶”,结果AI给你生成一个“穿着船在喝…...

Android日志记录终极指南:如何用Timber提升开发效率

Android日志记录终极指南:如何用Timber提升开发效率 【免费下载链接】timber JakeWharton/timber: 是一个 Android Log 框架,提供简单易用的 API,适合用于 Android 开发中的日志记录和调试。 项目地址: https://gitcode.com/gh_mirrors/ti/…...

从4.69万亿Token看中国AI大模型:调用量超越美国的背后逻辑

前言最近看到一组数据:截至2026年3月15日,中国AI大模型的周调用量达到4.69万亿Token,连续第二周超越美国,全球前三全部被中国模型包揽。作为一个长期关注AI行业的技术人,这个消息让我想深入挖一挖背后的逻辑&#xff1…...

终极宽屏补丁:让《暗黑破坏神2》在现代电脑上重获新生

终极宽屏补丁:让《暗黑破坏神2》在现代电脑上重获新生 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否曾在…...

Rust Desk自建服务器全攻略:从零搭建比向日葵更快的远程桌面(附密钥配置避坑指南)

Rust Desk私有化部署实战:构建高性能远程桌面的完整指南 远程协作工具已成为现代办公的标配,但主流商业方案往往存在延迟高、隐私风险等问题。Rust Desk作为开源解决方案,不仅提供媲美商业软件的功能体验,更通过私有化部署实现完全…...

Qt状态机实战指南:从基础到高级应用

1. Qt状态机基础入门 第一次接触Qt状态机时,我完全被它的设计哲学惊艳到了。想象一下你家的智能电饭煲:待机、煮饭、保温就是三个典型状态,按下按钮就是触发状态转换的信号——这就是状态机最接地气的理解方式。Qt中的QStateMachine框架&…...

工业能量:01 电源是谁?开关电源 vs UPS

01 电源是谁?开关电源 vs UPS 在工厂里,最昂贵的不是设备,而是“停机一秒的代价”。 咱今天不聊加班不聊绩效,就拉家常聊聊厂里那个最“低调”的英雄——电源系统。 你以为停电就是灯灭了,大家歇会儿喝口水?兄弟,醒醒!在真工业现场,尤其是半导体、汽车总装、医药车间…...