之前分享过 一篇 《Spring Cloud Gateway 原生的接口限流该怎么玩》, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现
原生RequestRateLimiter 的不足
- 配置方式
spring:
- RequestRateLimiterGatewayFilterFactory
Config
- 在实际生产过程中,必定不能满足我们的需求
生产中路由信息是保存数据库持久化或者配置中心,RequestRateLimiterGatewayFilterFactory
并不能随着持久化数据的改变而动态改变限流参数,不能做到实时根据流量来改变流量阈值
Sentinel 流控
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性,分布式系统的流量防卫兵。
从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
pom 依赖
配置本地路由规则及其sentinel数据源
spring:
配置nacos数据源中的限流策略
- 常用限流策略 常量
以客户端IP
- 核心源码解析 SentinelGatewayFilter
sentinel通过扩展Gateway的过滤器,通过选择的不同GatewayParamParser
过处理请求限流因子和数据源中的配置进行比较 源码如下:
public Mono<
效果演示
- 以上nacos 配置为 每秒只能通过5个请求,我们使用
jmeter 4.0
来并发10个线程测试一下 - 通过上图可以结果证明sentinel限流确实有效
动态修改限流参数
sentinel-datasource-nacos
作为sentinel的数据源,可以从如上 nacos 管理台实时刷新限流参数及其阈值- 目前sentinel dashboard 1.6.2 暂未实现gateway 流控图形化控制
1.7.0
会增加此功能
总结
- 以上源码参考个人项目 基于Spring Cloud、OAuth2.0开发基于Vue前后分离的开发平台