Spring Cloud Alibaba Sentinel 源码分析-滑动时间窗口算法原理
“滑动时间窗口算法” 是Sentinel源码中的一个非常重要的算法。
时间窗算法
那么在了解滑动时间窗算法之前,我们先要来了解时间窗算法,也可以称之为:固定时间窗算法
概念:固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入。超过数量就拒绝或者排队,等下一个时间段进入。
Spring Cloud Alibaba Sentinel 源码分析-滑动时间窗口算法原理
“滑动时间窗口算法” 是Sentinel源码中的一个非常重要的算法。
那么在了解滑动时间窗算法之前,我们先要来了解时间窗算法,也可以称之为:固定时间窗算法
概念:固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入。超过数量就拒绝或者排队,等下一个时间段进入。
Spring Cloud Alibaba Sentinel DegradeSlot 源码解析
DegradeSlot是熔断降级的Slot,那我们直接来看核心方法
1 | //DegradeSlot.entry |
Spring Cloud Alibaba Sentinel StatisticSlot 源码解析
StatisticSlot 是 Sentinel 最为重要的类之一,用于根据规则判断结果进行相应的统计操作。
entry 的时候:依次执行后面的判断 slot。每个 slot 触发流控的话会抛出异常(BlockException的子类)。若有 BlockException抛出,则记录 block 数据;若无异常抛出则算作可通过(pass),记录 pass 数据。
exit 的时候:若无 error(无论是业务异常还是流控异常),记录 complete(success)以及 RT,线程数-1。
Spring Cloud Alibaba Sentinel FlowSlot 源码解析
1 | // 获取到指定资源的所有流控规则 |
Spring Cloud Alibaba Sentinel 源码解析 SlotChain 入口解析
我们从这里继续分析,这个位置的chain.entry方法,但是此时这个chain是谁?
1 | //CtSph中 |
Spring Cloud Alibaba Sentinel 源码解析 ClusterBuilderSlot 解析
ClusterBuilderSlot:则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
1 | //NodeSelectorSlot.entry() |
Spring Cloud Alibaba Sentinel 源码解析 源码入口
在微服务的使用Sentinel实际工作场景中,我们只需要引入对应依赖:spring-cloud-starter-alibaba-sentinel,就会进行自动装配,所以我们之间看META-INF/spring.factories,然后我们这里从SentinelAutoConfiguration开始看起
Spring Cloud Alibaba Sentinel 源码解析 构建 Context
我们继续分析当前这个类型中的InternalContextUtil.internalEnter(Constants.CONTEXT_DEFAULT_NAME);方法
1 | /** |
Spring Cloud Alibaba Sentinel 源码解析 Node 之间的关系
一个Context之中,Resource和Entry的关系,一个Context中可以有多个Resource,每个资源都必须都应一个Entry。
这张图的上班部分其实体现了Node之间的关系,官方提供的图不够明显,我们需要进行细化
Spring Cloud Alibaba Sentinel 核心概念
Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。相比于Hystrix,Sentinel的设计更加简单,在 Sentinel中资源定义和规则配置是分离的,也就是说用户可以先通过Sentinel API给对应的业务逻辑定义资源(埋点),然后在需要的时候再配置规则,通过这种组合方式,极大的增加了Sentinel流控的灵活性。
引入Sentinel带来的性能损耗非常小。只有在业务单机量级超过25W QPS的时候才会有一些显著的影响(5% - 10% 左右),单机QPS不太大的时候损耗几乎可以忽略不计。
Sentinel提供两种埋点方式: