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