TOP云提供高性价比云服务器租用,有中国内地/港澳台、海外等全球各地节点,TOP云国内云服务器只要有域名备案号就能直接用,无须重复备案;港澳台及海外云服务器不用备案,购买之后直接使用,省时省力省心。价格实惠,续费同价,2核2G5M仅需27元每月,8核8G50M仅需66元每月,更多配置套餐请进入下面网址了解:
TOP云总站云服务器:https://topyun.vip/server/buy.html
TOP云C站云服务器:https://c.topyun.vip/cart
在云服务器上限制 API 访问频率(即限流)是保障系统稳定、防止恶意请求和资源滥用的常见手段。以下是几种常见的实现方式,你可以根据实际需求选择合适的方法:
一、使用 Web 服务器或反向代理限流
1. Nginx 限流
Nginx 可以通过 limit_req 和 limit_conn 模块对请求进行限流。
示例:基于 IP 的请求速率限制
http { limit_req_zone $binary_remote_addr zone=apilimit:10m rate=10r/s; server { location /api/ { limit_req zone=apilimit burst=20 nodelay; proxy_pass http://backend_server; } } }
rate=10r/s:每秒最多 10 个请求。
burst=20:允许突发 20 个请求。
nodelay:不延迟处理突发请求,直接拒绝超限请求。
2. Apache 限流
Apache 可以通过 mod_ratelimit 或 mod_qos 模块实现限流。
二、应用层限流(代码实现)
在 API 的后端代码中实现限流逻辑,适用于更灵活的控制。
1. 使用令牌桶或漏桶算法
这是最常用的限流算法,可以平滑控制请求速率。
常见实现方式:
令牌桶算法:系统以固定速率向桶中添加令牌,请求需要获取令牌才能执行,如果桶空则拒绝。
漏桶算法:请求以任意速率进入桶,但桶以固定速率处理请求,超出桶容量的请求被丢弃或排队。
示例语言支持:
Python:可以使用 ratelimit 库或自己实现令牌桶。
Java:Guava 的 RateLimiter 类。
Go:golang.org/x/time/rate 包。
2. 使用中间件
如果你使用的是 Web 框架(如 Flask、Django、Express、Spring Boot 等),可以使用现成的限流中间件。
示例:
Flask:flask-limiter
Express:express-rate-limit
Spring Boot:可以结合 Redis + 自定义注解实现分布式限流。
三、使用 API 网关限流
如果你的系统使用了 API 网关(如阿里云 API 网关、腾讯云 API 网关、AWS API Gateway、Kong、Nginx Plus 等),可以直接在网关层配置限流策略。
1. 腾讯云 API 网关
支持基于 IP、用户、APP 等维度的限流,可以设置 QPS(每秒请求数)、并发数等。
2. AWS API Gateway
支持使用 Usage Plans 和 API Keys 来限制调用频率。
3. Kong
Kong 是一个开源的 API 网关,支持基于插件(如 rate-limiting)进行限流,支持本地限流或 Redis 分布式限流。
四、使用分布式限流(适用于多实例部署)
如果你的 API 服务是多实例部署(如使用 Kubernetes 或多个服务器),需要在多个实例之间共享限流状态,这时可以使用:
Redis + Lua 脚本:通过 Redis 存储计数器,使用 Lua 脚本保证原子性操作。
分布式限流中间件:如 Sentinel(阿里巴巴开源)、Resilience4j 等。
示例:Redis + Lua 实现令牌桶
-- Lua 脚本实现令牌桶限流
local tokens_key = KEYS[1]
local timestamp_key = KEYS[2]
local rate = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])
local last_tokens = tonumber(redis.call("get", tokens_key))
if last_tokens == nil then
last_tokens = capacity
end
local last_refreshed = tonumber(redis.call("get", timestamp_key))
if last_refreshed == nil then
last_refreshed = 0
end
local delta = math.max(0, now - last_refreshed)
local filled_tokens = math.min(capacity, last_tokens + (delta * rate))
local allowed = filled_tokens >= requested
local remaining = filled_tokens
if allowed then
redis.call("setex", tokens_key, math.floor(capacity / rate) * 2, filled_tokens - requested)
redis.call("setex", timestamp_key, math.floor(capacity / rate) * 2, now)
else
remaining = filled_tokens
end
return { allowed, remaining }
五、结合防火墙或安全组限流(粗粒度)
如果只是简单防止恶意 IP 攻击,可以结合云服务商提供的安全组、防火墙或 WAF(Web 应用防火墙)功能:
阿里云 WAF:支持 IP 访问频率限制。
腾讯云 WAF:支持自定义防护策略,包括访问频率控制。
Cloudflare:提供 Rate Limiting 功能,可基于 URL、IP 等进行限流。
总结
方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
Nginx 限流 | 简单限流、边缘防护 | 配置简单、性能高 | 不够灵活,无法基于用户等维度 |
应用层限流 | 灵活控制、多维度限流 | 可定制性强 | 需开发,多实例需共享状态 |
API 网关限流 | 微服务、统一入口 | 配置方便、支持多维度 | 依赖网关,可能增加延迟 |
分布式限流 | 多实例部署 | 精准控制、支持高并发 | 实现复杂,依赖 Redis 等组件 |
防火墙/WAF | 粗粒度防护 | 快速拦截恶意流量 | 不够精细,适合安全防护 |