如何通过API网关Apache APISIX实现服务速率限制
Apache APISIX 客户端访问速率限制配置方案
Apache APISIX 内置了多款开箱即用的限流插件,不需要额外开发,直接通过配置即可实现不同维度的速率管控,满足防恶意攻击的防护需求。所有限流规则支持绑定在路由、服务、全局规则三个层级,生效优先级为路由 > 服务 > 全局规则,可根据防护范围灵活选择。
核心限流插件及配置示例
根据不同的防护场景,选择对应插件即可,常规防恶意攻击场景建议组合使用多个插件,做多层拦截。
1. 基于请求速率的精准限流(高频刷接口场景首选)
使用 limit-req 插件,基于漏桶算法实现精准的QPS控制,适合拦截短时间内高频发起请求的恶意扫描、刷接口行为。
举个最常用的配置:限制单个客户端源IP访问目标接口的速率为10QPS,允许最多5个突发请求缓冲,超出阈值直接返回拦截提示:
{ "plugins": { "limit-req": { "rate": 10, "burst": 5, "key_type": "var", "key": "remote_addr", "rejected_code": 429, "rejected_msg": "请求过于频繁,请稍后再试" } } }
核心参数说明:
rate:每秒允许的平均请求数,即设定的基准QPS阈值burst:突发请求缓冲队列长度,用来兼容正常业务的短时间流量峰值,避免误拦截key:限流统计维度,默认填remote_addr就是按客户端源IP限流;如果是登录后接口,可替换为http_x_user_id(对应请求头里的用户ID字段),按用户维度限流,避免同一公网出口下的正常用户被误杀rejected_code:触发限流时返回的HTTP状态码,常规用429(请求过多)或者503(服务不可用)都可以rejected_msg:触发限流时返回的提示文本,可按需自定义
2. 并发连接数限制(防连接耗尽攻击)
如果要防御恶意客户端发起大量长连接占满服务连接池的攻击,使用limit-conn插件即可,比如限制单个客户端IP最多同时持有20个并发连接:
{ "plugins": { "limit-conn": { "conn": 20, "burst": 10, "key_type": "var", "key": "remote_addr", "rejected_code": 503, "rejected_msg": "当前请求人数过多,请稍后重试", "default_conn_delay": 0.1 } } }
其中conn为允许的最大并发连接数,default_conn_delay为连接数超过基准阈值、但还在burst缓冲范围内时的请求延迟,用来平滑削峰,避免流量突刺直接打垮上游服务。
3. 固定时间窗口总量限流(防周期内刷量)
如果需要限制客户端在固定时间周期内的总请求数,比如单个IP每分钟最多请求600次,用limit-count插件实现即可:
{ "plugins": { "limit-count": { "count": 600, "time_window": 60, "key_type": "var", "key": "remote_addr", "rejected_code": 429, "rejected_msg": "单位时间内请求次数超出限制", "policy": "local" } } }
核心参数说明:
count:单个时间窗口内允许的总请求数time_window:时间窗口长度,单位为秒,填60即为1分钟policy:限流计数的存储策略,单节点部署填local即可,性能最高;如果是APISIX集群部署,建议替换为redis存储,保证多节点之间的限流计数统一,不会出现集群下限流失效的问题。
防恶意攻击的配置优化建议
- 不要只用单一限流规则,建议同时配置QPS限流、并发连接数限流两层规则,阈值设置比业务峰值高20%-30%,兼顾防护效果和正常用户体验
- 公网接口优先按IP做基础限流,登录态接口叠加按用户ID的限流规则,避免误拦截
- 建议配置一个阈值宽松的全局限流兜底规则,防止新上线路由漏配限流规则被恶意打穿
- 触发限流的请求可以同步记录日志,对持续发起恶意请求的IP,可叠加IP黑名单插件做永久拦截
内容的提问来源于stack exchange,提问作者feihan
相关产品推荐
相关产品推荐

