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粗粒度防护快速拦截恶意流量不够精细,适合安全防护


不容错过
Powered By TOPYUN 云产品资讯