【IT老齐065】分布式流控神器Alibaba Sentinel
【IT老齐065】分布式流控神器Alibaba Sentinel
在Spring Cloud Alibaba生态中有一个重要的流控组件Sentinel,Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
部署
可能会遇到和jdk版本不兼容的问题
java -jar --add-exports=java.base/sun.net.util=ALL-UNNAMED -Dserver.port=9999 sentinel-dashboard-1.8.4.jar
接入
使用配置的端口即可访问
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
原理
Sentinel Core为服务限流、熔断提供了核心拦截器SentinelWeblnterceptor,这个拦截器默认对所有请求/**进行拦截,然后开始请求的链式处理流程,在对于每一个处理请求的节点被称为Slot (槽)通过多个槽的连接形成处理链,在请求的流转过程中,如果有任何一个Slot验证未通过,都会产生BlockException,请求处理链便会中断,并返回“Blocked by sentinel"异常信息。
默认Slot有7个,前3个Slot为前置处理,用于收集、统计、分析必要的数据;后4个为规则校验SIot,从Dashboard推送的新规则保存在“规则池”中,然后
对应Slot进行读取并校验当前请求是否允许放行,允许放行则送入下一个Slot直到最终被RestController进行业务处理,不允许放行则直接抛出BlockException返回响应。
- NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来用于根据调用路径来限流降级。
- ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT(运行时间),QPS,thread count (线程总数) 等等,这些信息将用作为多维度限流,降级的依据。
- StatistcSlot 则用于记录,统计不同维度的 runtime 信息。
- SystemSlot 则通过系统的状态,例如CPU、内存的情况,来控制总的入口流量。
- AuthoritySlot[则根据黑白名单,来做黑白名单控制。
- FlowSlot 则用于根据预设的限流规则,以及前面 slot 统计的状态,来进行限流。
- DegradeSlot 则通过统计信息,以及预设的规则,来做熔断降级
服务雪崩
分布式架构下需要一种机制来保证当下游系统处理超过一段时间后,无论处理成功、失败,当前的调用必须立即中断,来保证线程不会产生长时间积压,减少雪崩出现的可
能。分布式架构设计中借鉴了股市的“熔断”机制,为分布式应用提供了系统调用的“保险丝”
服务熔断
微服务的熔断是指在某个服务接口在执行过程中频繁出现故障的情况,我们便认为这种状态是“不可接受”的,立即对当前接口实施熔断。在规定的时间内,所有送达该接口的请求都将直接抛出BlockException,在熔断期过后新的请求进入看接口是否恢复正常,恢复正常则继续运行,仍出现故障则再次熔断一段时间,以此往复直到服务接口恢复。
慢调用比例
开启条件:1秒钟内,有1个 (最小请求数) list接口请求,便开启熔断检查
触发熔断:当前秒有超过50% (比例值)的请求超过1ms (最大RT),如:3次里面有2次(75%)超过1ms,触发熔断,之后5秒钟 (熔断时长)所有请求被BLOCKED,5秒后半开状态检查
异常比例
开启条件:1秒钟内,有1个(最小请求数) list请求,便开启熔断检查
触发熔断:当前秒有超过50%(比例值)的请求产生异常触发熔断,之后5秒钟(断时长)所有请求被BLOCKED,5秒后半开状态检查
异常数
开启条件: 当前秒有1个list接口请求,便开启熔断检查
触发熔断: 1分钟内list接口调用异常数大于100次触发熔断,之后80秒所有请求被BLOCKED,80秒后半开状态检查。