Apache APISIX 实战教程:使用限流插件保护你的API
前言
在现代微服务架构中,API网关作为系统的入口,承担着重要的安全防护职责。Apache APISIX作为高性能API网关,提供了丰富的插件体系来保护后端API服务。本文将深入讲解如何使用APISIX的限流插件来保护你的API免受异常流量冲击。
为什么需要API保护
API服务面临的主要威胁包括:
- 异常访问:如异常流量、频繁请求等
- 异常流量:突发流量可能导致服务过载
- 业务滥用:某些客户端可能过度调用API
这些问题轻则影响服务质量,重则导致服务不可用。因此,API保护是系统设计中不可或缺的一环。
APISIX的限流保护机制
Apache APISIX提供了多种限流插件,它们基于不同的算法实现:
- limit-count:基于计数器算法,限制固定时间窗口内的请求总数
- limit-req:基于漏桶算法,平滑限制请求速率
- limit-conn:限制并发连接数
这些插件可以单独使用,也可以组合使用,形成多层次的保护体系。
实战:使用limit-count插件保护API
环境准备
确保你已经完成了以下准备工作:
- 已安装并运行Apache APISIX
- 已配置好上游服务
- 获取了管理员API密钥
配置限流路由
我们将创建一个路由,并为其添加limit-count插件:
curl -i http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: $admin_key" -X PUT -d '
{
"uri": "/api/protected",
"plugins": {
"limit-count": {
"count": 100, # 60秒内最多100次请求
"time_window": 60,
"rejected_code": 429, # 使用429表示请求过多
"key_type": "var",
"key": "remote_addr" # 基于客户端IP限流
}
},
"upstream_id": "1"
}'
配置详解
- count:时间窗口内允许的最大请求数
- time_window:时间窗口长度(秒)
- rejected_code:超出限制时返回的HTTP状态码
- key_type/key:限流的维度,这里基于客户端IP
测试效果
连续快速访问API:
for i in {1..110}; do curl -i http://127.0.0.1:9080/api/protected; done
前100次请求会正常响应,第101次开始会收到429状态码:
HTTP/1.1 429 Too Many Requests
Content-Type: text/html; charset=utf-8
进阶配置技巧
多维度限流
除了基于IP限流,还可以:
- 基于用户ID:
"key": "consumer_name" - 基于请求头:
"key": "http_x_api_key" - 组合条件:使用自定义变量组合多个条件
分级限流
可以为不同API设置不同的限流策略:
{
"/api/public": {
"count": 1000,
"time_window": 60
},
"/api/vip": {
"count": 100,
"time_window": 60
}
}
与其它插件配合使用
limit-count可以与其他插件组合:
"plugins": {
"limit-count": {...},
"key-auth": {...}, // 认证
"cors": {...} // 跨域控制
}
常见问题解答
Q:限流策略会影响性能吗?
A:APISIX的限流插件经过高度优化,对性能影响极小。在生产环境中,单节点可以轻松处理数万QPS的限流判断。
Q:如何应对突发流量?
A:可以结合limit-req插件实现平滑限流,或者使用API熔断插件(api-breaker)在服务异常时自动切断流量。
Q:分布式环境下如何保证限流准确性?
A:APISIX支持使用Redis等外部存储来实现集群级别的限流,确保多节点间的限流计数同步。
监控与调优
建议配合监控系统观察限流效果:
- 记录被拒绝的请求(日志插件)
- 监控API响应时间(prometheus插件)
- 设置告警规则(与外部监控系统集成)
根据监控数据调整限流阈值,在保护服务和允许合理流量之间找到平衡点。
总结
通过本文,我们学习了如何使用Apache APISIX的limit-count插件来保护API。实际生产中,可以根据业务需求选择合适的限流策略,或组合多个插件构建更完善的防护体系。APISIX强大的插件系统为API保护提供了灵活而高效的解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



