仿别人的网站违法嘛,网站建设 淘宝详情,山东省建设机械协会网站,2345电脑版网址导航高效与高并发API开发#xff1a;使用FastAPI与Redis实现请求限制与速率控制
#x1f4da; 目录
API速率限制的基本概念Redis实现分布式速率限制防止DDoS攻击的常见策略基于IP或用户身份的访问频率控制 1. API速率限制的基本概念
API速率限制#xff08;Rate Limiting使用FastAPI与Redis实现请求限制与速率控制 目录
API速率限制的基本概念Redis实现分布式速率限制防止DDoS攻击的常见策略基于IP或用户身份的访问频率控制 1. API速率限制的基本概念
API速率限制Rate Limiting是控制用户访问API的请求速率的一种机制防止系统被过多请求淹没。通过对用户的请求进行计数与限制API能够在高并发情况下维持性能与稳定性。
速率限制的主要目的是
防止过多请求导致服务器负载过高。限制恶意或非正常行为如暴力破解、爬虫攻击等。提高API的可用性确保公平分配资源。
常见的速率限制算法 漏桶算法Leaky Bucket Algorithm 漏桶算法在一定时间窗口内以固定速率处理请求若请求速率超过预定限度则会被丢弃或延迟。 令牌桶算法Token Bucket Algorithm 令牌桶算法是一种灵活的速率控制机制适合处理突发流量。每个请求都需要获取一个令牌如果令牌桶为空则请求被丢弃。 固定窗口计数法Fixed Window Counter 在固定时间窗口内计数器记录请求的次数一旦请求超出限制后续请求将被拒绝。 滑动窗口计数法Sliding Window Counter 滑动窗口比固定窗口更加精细每个请求都在一个滑动的时间窗口内进行计数能平滑流量控制。
通过这些算法API能够控制不同用户或客户端在指定时间内发起的请求数量确保系统的平稳运行。 2. Redis实现分布式速率限制
Redis是一个高性能的键值数据库广泛用于缓存、消息队列和分布式速率限制等场景。在分布式系统中Redis提供了高效的数据存储和共享机制可以帮助不同服务器实例共享请求计数信息从而实现跨服务器的速率限制。
Redis的实现思路
我们使用Redis的SETEX命令设置一个键值对其中键为用户标识例如IP或用户ID值为请求计数。每次用户发起请求时我们先检查该键是否存在。如果存在检查其值是否超过限额如果不存在设置新的键并开始计数。通过设置键的过期时间可以实现速率限制。
示例代码
from fastapi import FastAPI, Request, HTTPException
import redis
import timeapp FastAPI()# 连接Redis服务器
r redis.Redis(hostlocalhost, port6379, db0)# 限制参数
LIMIT 100 # 每分钟100次请求
TIME_WINDOW 60 # 1分钟app.middleware(http)
async def rate_limit(request: Request, call_next):ip_address request.client.hostcurrent_time int(time.time())# 构造Redis的键redis_key frate_limit:{ip_address}:{current_time // TIME_WINDOW}# 使用Redis的INCR命令增加计数request_count r.incr(redis_key)if request_count 1:# 设置过期时间为60秒时间窗口大小r.expire(redis_key, TIME_WINDOW)if request_count LIMIT:raise HTTPException(status_code429, detailToo many requests)response await call_next(request)return response代码解析
r.incr(redis_key)Redis的INCR命令可以原子性地递增键的值。如果键不存在它会先创建键并设置初值为1。r.expire(redis_key, TIME_WINDOW)设置键的过期时间使得计数在每个时间窗口内自动重置。429 Too Many Requests当请求次数超过限制时返回429状态码表示超出请求频率限制。
这种方式可以有效防止单个IP地址在短时间内发送过多请求保障API的可用性与性能。 3. 防止DDoS攻击的常见策略
DDoSDistributed Denial of Service攻击通过大量恶意请求淹没目标服务器导致系统不可用。为了防止这种攻击除了传统的防火墙和负载均衡策略外我们还需要在API层面实现防护。
常见的防御策略 IP黑名单/白名单 基于IP的访问控制可以有效阻止已知攻击源的流量。通过将恶意IP加入黑名单可以防止这些IP的请求进入系统。 请求速率限制 利用速率限制算法如漏桶或令牌桶控制请求频率避免单个来源发送过多请求。 行为分析与智能防护 通过分析请求的行为模式识别并阻止异常流量。例如检测异常的请求头、请求频率、请求路径等。 验证码与身份验证 在用户请求的关键环节如登录、注册、支付等加入验证码或二次身份验证防止恶意机器人自动化攻击。
示例代码基于IP的速率限制和验证码
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
from pydantic import BaseModel
import redis
import time
import randomapp FastAPI()r redis.Redis(hostlocalhost, port6379, db0)
LIMIT 100
TIME_WINDOW 60
CAPTCHA_THRESHOLD 10app.post(/login)
async def login(request: Request, user: BaseModel):ip_address request.client.hostcurrent_time int(time.time())redis_key frate_limit:{ip_address}:{current_time // TIME_WINDOW}request_count r.incr(redis_key)if request_count 1:r.expire(redis_key, TIME_WINDOW)if request_count LIMIT:# 启动验证码机制captcha random.randint(1000, 9999)return JSONResponse(content{captcha_required: True, captcha: captcha}, status_code400)return {message: Login successful}代码解析
当请求频率超过限制时返回一个验证码用户需要通过验证码验证来继续操作。这种方式有效阻止了自动化攻击减少了恶意请求的成功率。 4. 基于IP或用户身份的访问频率控制
除了全局的速率限制外还可以根据IP地址或用户身份来单独限制访问频率。通过这种方法可以更精细化地控制API的访问权限避免某个特定用户或IP占用过多资源。
示例代码基于用户身份的访问频率控制
from fastapi import Depends, HTTPException, Request
from pydantic import BaseModelapp.get(/user_dashboard)
async def user_dashboard(user_id: str, request: Request):user_limit_key fuser:{user_id}:rate_limitip_limit_key fip:{request.client.host}:rate_limit# 用户访问频率限制user_request_count r.incr(user_limit_key)if user_request_count 1:r.expire(user_limit_key, TIME_WINDOW)if user_request_count LIMIT:raise HTTPException(status_code429, detailUser request limit exceeded)# IP访问频率限制ip_request_count r.incr(ip_limit_key)if ip_request_count 1:r.expire(ip_limit_key, TIME_WINDOW)if ip_request_count LIMIT:raise HTTPException(status_code429, detailIP request limit exceeded)return {message: Welcome to the user dashboard}代码解析
user_id每个用户有独立的请求计数防止某个用户滥用API。request.client.hostIP地址的请求计数防止同一个IP地址滥用API。根据用户和IP的访问频率分别设置限制提高了控制精度。