API 网关 Apisix:插件开发 + 限流 + 黑白名单
·
Apache APISIX:插件开发、限流与黑白名单实现
Apache APISIX 是一个高性能、开源的API网关,支持动态插件扩展。下面我将逐步解释插件开发、限流功能和黑白名单的实现,确保内容结构清晰、真实可靠。所有技术点基于APISIX官方文档和最佳实践。
1. 插件开发
在APISIX中,插件是核心扩展机制,通常用Lua编写。开发自定义插件允许您添加业务逻辑,如身份验证或日志记录。以下是开发步骤:
- 步骤1:创建插件文件
在/usr/local/apisix/plugins/目录下创建Lua文件,例如my-plugin.lua。 - 步骤2:实现插件逻辑
插件必须定义_M模块,包含priority、name和schema等属性。local core = require("apisix.core") local _M = { version = 0.1, priority = 1000, -- 插件优先级 name = "my-plugin", -- 插件名称 schema = { -- 配置参数校验规则 type = "object", properties = { message = {type = "string", default = "Hello from custom plugin!"} } } } function _M.access(conf, ctx) -- 处理请求阶段 core.response.set_header("X-Custom-Header", conf.message) return 200, conf.message end return _M - 步骤3:启用插件
在APISIX配置文件中(如config.yaml)添加插件名:plugins: - my-plugin - 关键点:
- 插件生命周期包括
init,access,header_filter等阶段。 - 测试时,使用
curl请求API,观察响应头是否包含自定义字段。
- 插件生命周期包括
2. 限流实现
限流功能保护API免受突发流量冲击,APISIX内置了多种限流插件,如limit-req(基于漏桶算法)和limit-count(基于计数器)。以下以limit-req为例:
- 原理:限流算法控制请求速率。例如,漏桶算法允许最大请求速率$r$(单位:请求/秒),桶容量$b$(单位:请求)。当请求速率超过$r$时,多余请求被拒绝。数学表示为:
$$
\text{允许请求} = \begin{cases} \text{通过} & \text{如果 } \text{当前请求数} \leq b \ \text{拒绝} & \text{否则} \end{cases} $$
其中,$r$ 和 $b$ 是可配置参数。 - 配置示例:
在路由规则中添加limit-req插件:routes: - uri: /api/resource* plugins: limit-req: rate: 10 # 最大速率:10请求/秒 burst: 5 # 桶容量:5请求 key: remote_addr # 基于客户端IP限流 upstream: nodes: "127.0.0.1:8080": 1 - 效果:
- 如果客户端每秒发送超过10个请求,超出部分返回
503状态码。 - 使用工具如
ab测试:ab -n 20 -c 5 http://localhost:9080/api/resource。
- 如果客户端每秒发送超过10个请求,超出部分返回
3. 黑白名单实现
黑白名单通过IP限制插件(ip-restriction)实现,允许或拒绝特定IP地址访问API。
- 配置方式:
- 白名单:只允许指定IP访问。
- 黑名单:拒绝指定IP访问。
示例配置:
routes: - uri: /admin* plugins: ip-restriction: whitelist: ["192.168.1.0/24", "10.0.0.1"] # 白名单:允许该网段和IP # blacklist: ["203.0.113.0/24"] # 黑名单:注释掉则使用白名单模式 upstream: nodes: "127.0.0.1:8080": 1 - 工作原理:
- 插件检查客户端IP(
remote_addr)。 - 如果IP在白名单中,请求通过;否则返回
403 Forbidden。
- 插件检查客户端IP(
- 最佳实践:
- 结合Nginx变量,如
X-Forwarded-For处理代理场景。 - 动态更新:通过APISIX Admin API实时修改名单。
- 结合Nginx变量,如
4. 整合应用示例
将插件开发、限流和黑白名单结合使用,构建安全高效的API网关:
- 创建自定义插件:例如,开发一个插件记录请求日志。
- 添加限流:在关键路由上启用
limit-req,防止DDoS攻击。 - 设置黑白名单:对管理接口启用白名单,限制访问来源。
完整配置片段:
routes:
- uri: /public-api*
plugins:
limit-req: # 限流
rate: 100
burst: 20
my-plugin: # 自定义插件
message: "Access granted"
- uri: /admin*
plugins:
ip-restriction:
whitelist: ["192.168.1.100"]
limit-req: # 额外限流保护
rate: 5
burst: 2
总结
- 插件开发:用Lua扩展功能,优先测试逻辑完整性。
- 限流:基于算法控制流量,参数$r$和$b$需根据业务调整。
- 黑白名单:简单高效地管理IP访问。
建议参考APISIX官方文档获取最新插件列表和配置细节。如有具体场景问题,可提供更多细节,我会进一步优化方案!
更多推荐


所有评论(0)