Soul网关中限流熔断的另外一个手段是使用 sentinel 插件,首先我们来粗略了解一下 Sentinel。
Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等维度上对微服务的稳定性提供保障。
Hystrix 通过线程池的方式,来对访问的资源进行了隔离,虽然将资源之间彻底隔离开来,但是却增加了线程切换的成本,线程池大小的分配也是需要针对对应资源做预估计算和设置的。
而 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 规则
下面是各个配置的功能和含义:
whether to open the degrade (1 or 0) 是否开启降级
degrade count 降级阈值
degrade type
- slow call ratio 慢请求比率
- exception ratio 异常比率
- exception number strategy 异常数
degrade window size 降级的时间,单位为秒
whether control behavior is enabled (1 or 0) 是否开启流控
control behavior
- direct rejection by default 直接拒绝
- warm up 慢热启动
- constant speed queuing 排队等待
- preheating uniformly queued
grade count 流控阈值
grade type
- QPS 按QPS流控
- number of concurrent threads 按并发线程数