hello,我们好,我是张张,「架构精进之路」公号作者。

随着近些年体系安稳性要求越来越高,限流是保证服务高可用的办法之一,尤其是在微服务架构中,对接口或资源进行限流能够有效地保证服务的可用性和安稳性。

在众多限流平台中 Sentinel 凭着丰富功用特性和屡次阿里双十一的线上实践,成为最热门限流平台之一,Sentinel 是阿里巴巴供给的一种限流、熔断中间件,与RateLimiter比较,Sentinel供给了丰富的限流、熔断功用。它支持控制台装备限流、熔断规则,支持集群限流,并能够将相应服务调用状况可视化。

本文就Sentinel相关特性进行分析并测验并对底层原理进行分析,为后续相关体系建设积累经验。

一、整体流程

之前咱们学习过限流比较主流的三种算法:漏桶,令牌桶,滑动窗口。而Sentinel采用的是最终一种,滑动窗口来实现限流的。

先来了解一下整体流程:

Sentinel 是如何实现分布式限流的?

上面的图是官网的图,从规划形式上来看,典型的的职责链形式。外部恳求进来后,要经过职责链上各个节点的处理,而Sentinel的限流、熔断就是经过职责链上的这些节点实现的。

要想深入了解原理,仍是得从源码上下手,下面直接进入Sentinel的源码阅读。

二、源码阅读

2.1 源码阅读入口及流程总结

读源码先得找到源码入口。咱们常常运用@ SentinelResource来符号一个办法,能够将这个被@ SentinelResource符号的办法看成是一个Sentinel资源。因而,咱们以@ SentinelResource为入口,找到其切面,看看切面阻拦后所做的工作,就能够明晰Sentinel的工作原理了。直接看注解@SentinelResource的切面代码(SentinelResourceAspect)。

Sentinel 是如何实现分布式限流的?

能够明晰的看到Sentinel的行为办法。进入SentinelResource切面后,会履行SphU.entry办法,在这个办法中会对被阻拦办法做限流和熔断的逻辑处理。

假如触发熔断和限流,会抛出BlockException,咱们能够指定blockHandler办法来处理BlockException。而关于业务上的反常,咱们也能够装备fallback办法来处理被阻拦办法调用发生的反常。

所以,Sentinel熔断限流的处理主要是在SphU.entry办法中,其主要处理逻辑见下图源码。

Sentinel 是如何实现分布式限流的?

可见,在SphU.entry办法中,Sentinel实现限流、熔断等功用的流程能够总结如下:

  • 获取Sentinel上下文(Context);

  • 获取资源对应的职责链;

  • 生成资源调用凭证(Entry);

  • 履行职责链中各个节点。

2.2 职责链的履行

再来看下面这张图,是不是很明晰了?

Sentinel 是如何实现分布式限流的?

NodeSelectorSlot用于获取资源对应的Node,并构建Node调用树,将SentinelSource的调用链路以Node Tree的方式组起来。ClusterBuilderSlot为当时Node创建对应的ClusterNode,聚合相同资源对应的不同Context的Node,后续的限流依据就是这个ClusterNode。

ClusterNode承继自StatisticNode,记录着相应资源处理的一些计算数据。StatisticSlot用于更新资源调用的相关计数,用于后续的限流判别运用。FlowSlot依据资源对应Node的调用计数,判别是否进行限流。

至此,Sentinel的职责链履行逻辑就完整了。

三、原理总结

经过对Sentinel源码的整理,能够很明晰的理解Sentinel的限流进程,总结如下:

  • 三大组件Context、Entry、Node,是Sentinel的中心组件,各类信息及资源调用状况都由这三大类持有;

  • 采用职责链形式完成Sentinel的信息计算、熔断、限流等操作;

  • 职责链中NodeSelectSlot担任选择当时资源对应的Node,一起构建node调用树;

  • 职责链中ClusterBuilderSlot担任构建当时Node对应的ClusterNode,用于聚合同一资源对应不同Context的Node;

  • 职责链中的StatisticSlot用于计算当时资源的调用状况,更新Node与其对用的ClusterNode的各种计算数据;

  • 职责链中的FlowSlot依据当时Node对应的ClusterNode(默许)的计算信息进行限流;

  • 资源调用计算数据(例如PassQps)运用滑动时间窗口进行计算;

  • 一切工作履行完毕后,履行退出流程,弥补一些计算数据,清理Context。

参考文献:github.com/alibaba/Sen…

– END –

期望今天的讲解对我们有所协助,谢谢!

Thanks for reading!

作者:架构精进之路,十年研发风雨路,大厂架构师,CSDN 博客专家,专心架构技术沉淀学习及分享,职业与认知升级,坚持分享接地气儿的干货文章,期待与你一起生长。
重视并私信我回复“01”,送你一份程序员生长进阶大礼包,欢迎勾搭。