入口限速
自 v1.5.0 起,Aidy Gateway 支持以租户为维度的入口限速能力。当前版本中,该能力基于 PostgreSQL tenants 表中的租户字段定义,并通过 routes.tenant_id 进行关联。启动前需要在静态配置中设置 rate-limit.redis,用于存储限速窗口。
响应头策略通过 plugin.inbound_rate_limit.InboundRateLimitPluginConfig 配置。
启用条件
入口限速插件只有在同时满足以下条件时,才会被挂进请求链路:
- 静态配置中提供了
rate-limit.redis - Gateway 启动时成功初始化了入口限速 limiter
- 当前 route 绑定了 tenant
tenant.inbound_rate_limit_qps > 0tenant.id非空
如果以上任一条件不满足,入口限速插件不会进入当前 route 的请求链路。
配置步骤
- 在 PostgreSQL
tenants表中写入目标租户,并设置inbound_rate_limit_qps/detect_rate_limit_cpm。例如:
{
"id": "tenant-a",
"inboundRateLimitQps": 120,
"detectRateLimitCpm": 2400
}
在 PostgreSQL
routes表中将目标 route 绑定到tenant_id = tenant-a,Aidy Gateway 会在运行时将该路由归属于tenant-a并应用其限速。(可选)在路由的
plugin_config.inbound_rate_limit中设置headers_mode,控制限速相关响应头的返回策略。
当限额字段未填写或为 0 时,表示未启用对应的限速项。
需要注意的是,plugin_config.inbound_rate_limit.headers_mode 只控制响应头返回策略,不决定插件是否进入请求链路。
插件配置
入口限速由独立的 ratelimit-inbound 插件完成,运行在 Inbound 阶段。插件会自动根据路由绑定的租户 ID 调用 Redis 计数,并在达到上限时返回 429 Too Many Requests。
plugin_config.inbound_rate_limit.headers_mode 支持以下取值:
| 值 | 说明 |
|---|---|
ALWAYS | 每次请求都返回限速相关响应头 |
ON_LIMIT | 默认值,仅在触发限速(返回 429)时返回响应头 |
NEVER | 不返回任何限速信息 |
插件使用的响应头包括:
X-RateLimit-Limit: 当前窗口允许的最大请求数(QPS)X-RateLimit-Remaining: 剩余可用请求数X-RateLimit-Reset: 当前窗口结束的剩余秒数Retry-After: 触发限速时,建议客户端重试前等待的秒数(仅在ALWAYS/ON_LIMIT且被限速时返回)Server: 当触发限速返回 429 时固定为aidy
默认策略可通过静态配置的 rate-limit.headers_mode 指定,未设置时默认 on-limit。
后续的限速执行逻辑会依赖租户级配置及插件行为执行业务侧的速率控制策略。
当前版本中,tenant 数据来源已经从 Redis 动态配置切换到 PG-only runtime。初始化方式建议参考: