SpringVortexNotes

Sentinel 默认规则要排除专用接口

zjc 于 2026-08-24 发布

代码环境

网关限流不能只写一条兜底规则。全站默认流量和邮件发送这种容易触发外部依赖的接口,承载能力完全不同。这次提交把原来的单接口规则改成两层:

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

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-gateway/src/main/resources/config/application-sentinel.yaml

默认规则使用负向前瞻,匹配除邮件发送外的全部网关入口:

/api/v1/consumer/user/1  -> non-mail-interfaces
/api/v1/provider/user/1  -> non-mail-interfaces
/api/v1/mail/send        -> mail-send

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-gateway/src/test/java/com/zjc/gateway/config/ProfileConfigurationTest.java

这样邮件接口只进入专用规则,不会被默认规则重复统计。阈值也拆开了:普通入口是 100/10 QPS,邮件发送是 20/2 QPS,更贴近两类请求的风险。

还有一个容易误解的点:Sentinel 只统计进入 Gateway 的这一次请求。

Gateway -> Consumer -> Feign -> Provider

Consumer 内部通过 Feign 调 Provider 时没有再次经过 Gateway,所以不会被 Gateway 的接口限流重复计数。反过来,直连 Provider 或 Consumer 端口也不会触发这些入口规则。

配置测试直接调用 Pattern.matches 验证三个路径的归属,同时断言两条规则的名称和阈值。规则越接近业务入口,越需要这种可执行的说明。

经验总结

默认规则适合兜住普通入口,专用规则承载风险更高的接口。用负向前瞻保证规则互斥,再用测试固定匹配结果,限流语义才不会随着正则改动悄悄变化。

评论

评论由 GitHub Discussions 承载,需要 GitHub 账号登录。