【微服务】Sentinel原理

1.核心解析

1.1.常见词汇

(1) 资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。
(2) Entry
每一次资源调用都会创建一个 Entry。Entry 包含了资源名、curNode(当前统计节点)、originNode(来源统计节点)等信息。
(3) Context
Context 代表调用链路上下文,贯穿一次调用链路中的所有 Entry。Context 维持着入口节点(entranceNode)、本次调用链路的 curNode、调用来源(origin)等信息。Context 名称即为调用链路入口名称。
(4) Node

  • StatisticNode:最为基础的统计节点。
  • DefaultNode:链路节点,用于统计调用链路上某个资源的数据,维持树状结构。
  • ClusterNode:簇点,用于统计每个资源全局的数据(不区分调用链路),以及存放该资源的按来源区分的调用数据。
  • EntranceNode:入口节点,特殊的链路节点,对应某个 Context 入口的所有调用数据。

1.2.核心框架

Sentinel 中,所有的资源都对应一个资源名称以及一个 Entry。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 API 显式创建;每一个 Entry 创建的时候,同时也会创建一系列功能插槽(slot chain)。Sentinel 将不同的 Slot 按照顺序串在一起(责任链模式),从而将不同的功能(限流、降级、系统保护)组合在一起。slot chain 其实可以分为两部分:统计数据构建部分(statistic)和判断部分(rule checking)。
在这里插入图片描述
Sentinel 将 ProcessorSlot 作为 SPI 接口进行扩展(1.7.2 版本以前 SlotChainBuilder 作为 SPI),使得 Slot Chain 具备了扩展的能力。可以自行加入自定义的 slot 并编排 slot 间的顺序,从而添加自定义的功能。

1.3.常见Slot

(1) NodeSelectorSlot
NodeSelectorSlot 主要负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级。
(2) ClusterBuilderSlot
ClusterBuilderSlot 用于构建资源的 ClusterNode 以及调用来源节点。ClusterNode 保持资源运行统计信息(响应时间、QPS、block 数目、线程数、异常数等)以及原始调用者统计信息列表。
(3) StatisticSlot
StatisticSlot 用于统计实时的调用数据。

  • clusterNode:资源唯一标识的 ClusterNode 的 runtime 统计;
  • origin:根据来自不同调用者的统计信息;
  • defaultnode:根据上下文条目名称和资源 ID 的 runtime 统计;
  • 入口的统计。

(4) ParamFlowSlot
ParamFlowSlot 对应控制台的热点流控。
(5) SystemSlot
SystemSlot 会根据对于当前系统的整体情况,对入口资源的调用进行动态调配。其原理是让入口的流量和当前系统的预计容量达到一个动态平衡。对应控制台的系统规则。
(6) AuthoritySlot
AuthoritySlot 根据配置的黑白名单和调用来源信息,来做黑白名单控制。对应控制台的授权规则。
(7) FlowSlot
FlowSlot 根据预设的资源的统计信息,按照固定的次序,依次生效。对应控制台的流控规则。
(8) DegradeSlot
DegradeSlot 主要针对资源的平均响应时间(RT)以及异常比率,来决定资源是否在接下来的时间被自动熔断掉。对应控制台的降级规则。

2.熔断

熔断是一种保护机制。当系统出现故障或压力过大时,会主动断开服务的请求,防止流量过载导致系统崩溃。
Sentinel 在调用链路中某个资源出现不稳定状态时,比如某个目标服务调用比较慢、异常比较多或者大量超时,触发熔断机制可以保证后续的请求不会继续发送到目标服务上,而是直接返回降级的逻辑并且快速释放资源。如果目标服务的情况恢复了,那么熔断机制又会动态进行关闭。
Sentinel 的断路器实现主要在 DegradeSlot 中,它获取了 DegradeRule 的熔断规则。在 Sentinel 中判断资源是否处于稳定状态的指标有三:
慢调用比例(SLOW_REQUEST_RATIO):需要设置允许的慢调用 RT,请求的响应时间大于该值则统计为慢调用;
异常比例(ERROR_RATIO):当资源的每秒请求量大于等于某个限定值,并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态;
异常数(ERROR_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。

3.限流

限流就是限制流量。
Sentinel 的限流实现主要在 FlowSlot 中,提供了两个限流维度:并发线程数和 QPS。
并发数控制用于保护业务线程池不被慢调用耗尽。当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,这代表吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。Sentinel 统计当前请求上下文中正在执行调用的数量,如果超出阈值,新的请求会被立即拒绝。
当 QPS 超过某个阈值的时候,则采取措施进行流量控制行为。Sentinel 提供了四种流量控制行为:

  • 直接拒绝:默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝;
  • 预热/冷启动方式:系统一般长期处于低水位的情况下,当流量突然增加时,通过冷启动让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给系统一个预热的时间,避免系统被压垮;
  • 匀速排队:漏桶算法。严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过。

4.参考

https://sentinelguard.io/zh-cn/docs/basic-implementation.html
https://blog.csdn.net/qq_35958391/article/details/124509242

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值