简单的说明下其它几个插件的作用和关键点,部分内容来源于其它文章
目录
一、rateLimiter插件
- Soul 网关提供了限流插件,方便用户控制指定时间段内经过网关的请求数量
- Soul 使用 redis 做令牌桶算法
- Soul-plugin-ratelimiter 的文件目录结构:
└── src
├── main
│ ├── java
│ │ └── org
│ │ └── dromara
│ │ └── soul
│ │ └── plugin
│ │ └── ratelimiter
│ │ ├── RateLimiterPlugin.java AbstractSoulPlugin 实现类,核心函数是 doExecute,
│ │ ├── config
│ │ │ └── RateLimiterConfig.java ratelimiter 相关配置项
│ │ ├── executor
│ │ │ └── RedisRateLimiter.java 基于 redis 的令牌桶算法实现,核心函数是 isAllowed
│ │ ├── handler
│ │ │ └── RateLimiterPluginDataHandler.java 从插件配置读取数据的handler
│ │ └── response
│ │ └── RateLimiterResponse.java ratelimiter response 类
│ └── resources
│ └── META-INF
│ └── scripts
│ ├── concurrent_request_rate_limiter.lua 并发 ratelimiter lua脚本
│ └── request_rate_limiter.lua ratelimiter lua脚本
└── test
- 启动 redis-server
- 然后在 admin 中配置 ratelimiter 插件,首先在插件管理中开启 ratelimiter,再配置 ratelimiter 的 selecter 和 rule
- postman验证
配置完成后使用postman模拟不间断的 200 次请求:
在执行完 10 次后的 第11次,ratelimiter 阻断了我们的请求,因为令牌桶中的令牌已经被消耗光了(capacity 为 10),而填充速率(rate)为 5,意味着用户每秒最多请求 5次 后就被限流。
- 令牌桶算法的分配流程
二、hystrix插件
2.1 简介
- hystrix插件是网关用来对流量进行熔断的核心实现。
- 使用信号量的方式来处理请求
- Hystrix 是高可用性保障的一个框架。Netflix的 API 团队从 2011 年开始做一些提升系统可用性和稳定性的工作,Hystrix 就是从那时候开始发展出来的。
2.2 设计原则
- 对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护。
- 在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统中蔓延。比如某一个服务故障了,导致其它服务也跟着故障。
- 提供 fail-fast(快速失败)和快速恢复的支持。
- 提供 fallback 优雅降级的支持。
- 支持近实时的监控、报警以及运维操作。
2.3 参数说明
- 跳闸最小请求数量 :最小的请求量,至少要达到这个量才会触发熔断
- 错误百分比阀值 : 这段时间内,发生异常的百分比。
- 最大并发量 : 最大的并发量
- 跳闸休眠时间(ms) :熔断以后恢复的时间。
- 分组Key: 一般设置为:contextPath
- 命令Key: 一般设置为具体的 路径接口。
三、sentinel插件
3.1 简介
- sentinel插件是网关用来对流量进行限流与熔断的可选选择之一。
- sentinel为网关熔断限流提供能力。
- sentinel Sentinel 是阿里巴巴开源的为微服务提供高可用的组件;Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
.
├── pom.xml
├── soul-plugin-sentinel.iml
└── src
└── main
└── java
└── org
└── dromara
└── soul
└── plugin
└── sentinel
├── SentinelPlugin.java //Sentinel 插件实现,从配置中读取设置并做对应处理,再把请求传递到插件链中
├── fallback
│ └── SentinelFallbackHandler.java //根据 Sentinel 抛出的异常分别做相应的处理
└── handler
└── SentinelRuleHandle.java //配置 sentinel 规则
3.2 特征
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
3.3 参数详解
- 是否开启流控(1或0) :是否开启sentinel的流控。
- 流控效果 : 流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流。
- 限流阈值类型 : 限流阈值类型,QPS 或线程数模式。
- 是否开启熔断(1或0) :是否开启sentinel熔断。
- 熔断类型: 熔断策略,支持秒级 RT/秒级异常比例/分钟级异常数。
- 熔断阈值: 阈值。
- 熔断窗口大小: 降级的时间,单位为 s。
- 熔断URI: 熔断后的降级uri。
四、resilience4j插件
4.1 resilience4j概述
Resilience4j是一个轻量级容错框架,设计灵感来源于Netflix 的Hystrix框架,为函数式编程所设计。
Resilience4j 提供了一组高阶函数(装饰器),包括断路器,限流器,重试,隔离,可以对任何的函数式接口,lambda表达式,或方法的引用进行增强,并且这些装饰器可以进行叠加。这样做的好处是,你可以根据需要选择特定的装饰器进行组合
4.2 参数详解
- timeoutDurationRate:等待获取令牌的超时时间,单位ms,默认值:5000。
- limitRefreshPeriod:刷新令牌的时间间隔,单位ms,默认值:500。
- limitForPeriod:每次刷新令牌的数量,默认值:50。
- circuitEnable:是否开启熔断,0:关闭,1:开启,默认值:0。
- timeoutDuration:熔断超时时间,单位ms,默认值:30000。
- fallbackUri:降级处理的uri。
- slidingWindowSize:滑动窗口大小,默认值:100。
- slidingWindowType:滑动窗口类型,0:基于计数,1:基于时间,默认值:0。
- minimumNumberOfCalls:开启熔断的最小请求数,超过这个请求数才开启熔断统计,默认值:100。
- waitIntervalFunctionInOpenState:熔断器开启持续时间,单位ms,默认值:10。
- permittedNumberOfCallsInHalfOpenState:半开状态下的环形缓冲区大小,必须达到此数量才会计算失败率,默认值:10。
- failureRateThreshold:错误率百分比,达到这个阈值,熔断器才会开启,默认值50。
- automaticTransitionFromOpenToHalfOpenEnabled:是否自动从open状态转换为half-open状态,,true:是,false:否,默认值:false。
4.2 hystrix、sentinel、resilience4j 功能差异
五、monitor插件
monitor插件是网关用来监控自身运行状态(JVM相关),请求的响应迟延,QPS、TPS等相关metrics。
六、rewrite插件
soul网关在对目标服务进行代理调用的时候,还容许用户使用 rewrite 插件来重写请求路径