代码环境
- 仓库:https://github.com/springvortex/spring-cloud-alibaba.git
- 分支:
release/v1.0.0- JDK:
21- Spring Boot:
4.1.0
网关限流不能只写一条兜底规则。全站默认流量和邮件发送这种容易触发外部依赖的接口,承载能力完全不同。这次提交把原来的单接口规则改成两层:
interfaces:
- name: non-mail-interfaces
pattern: /api/(?![^/]+/mail/send$).*
total-qps: 100
per-ip-qps: 10
- name: mail-send
pattern: /api/[^/]+/mail/send
total-qps: 20
per-ip-qps: 2
默认规则使用负向前瞻,匹配除邮件发送外的全部网关入口:
/api/v1/consumer/user/1 -> non-mail-interfaces
/api/v1/provider/user/1 -> non-mail-interfaces
/api/v1/mail/send -> mail-send
这样邮件接口只进入专用规则,不会被默认规则重复统计。阈值也拆开了:普通入口是 100/10 QPS,邮件发送是 20/2 QPS,更贴近两类请求的风险。
还有一个容易误解的点:Sentinel 只统计进入 Gateway 的这一次请求。
Gateway -> Consumer -> Feign -> Provider
Consumer 内部通过 Feign 调 Provider 时没有再次经过 Gateway,所以不会被 Gateway 的接口限流重复计数。反过来,直连 Provider 或 Consumer 端口也不会触发这些入口规则。
配置测试直接调用 Pattern.matches 验证三个路径的归属,同时断言两条规则的名称和阈值。规则越接近业务入口,越需要这种可执行的说明。
经验总结
默认规则适合兜住普通入口,专用规则承载风险更高的接口。用负向前瞻保证规则互斥,再用测试固定匹配结果,限流语义才不会随着正则改动悄悄变化。
评论
评论由 GitHub Discussions 承载,需要 GitHub 账号登录。