1、基本原理
sentinel 在内部创建了一个责任链,责任链是由一系列 ProcessorSlot 对象组成的,每个 ProcessorSlot 对象负责不同的功能,外部请求是否允许访问资源,需要通过责任链的校验,只有校验通过的,才可以访问资源,如果被校验失败,会抛出 BlockException 异常。
sentinel 提供了 8 个 ProcessorSlot 的实现类,下面实现类功能介绍:
DegradeSlot:用于服务降级,如果发现服务超时次数或者报错次数超过限制,DegradeSlot 将禁止再次访问服务,等待一段时间后,DegradeSlot 试探性的放过一个请求,然后根据该请求的处理情况,决定是否再次降级。
AuthoritySlot:黑白名单校验,按照字符串匹配,如果在黑名单,则禁止访问。
ClusterBuilderSlot:构建 ClusterNode 对象,该对象用于统计访问资源的 QPS、线程数、异常、响应时间等,每个资源对应一个 ClusterNode 对象。
SystemSlot:校验 QPS、并发线程数、系统负载、CPU 使用率、平均响应时间是否超过限制,使用滑动窗口算法统计上述这些数据。
StatisticSlot:用于从多个维度(入口流量、调用者、当前被访问资源)统计响应时间、并发线程数、处理失败个数、处理成功个数等。
FlowSlot:用于流控,可以根据 QPS 或者每秒并发线程数控制,当 QPS 或者并发线程数超过设定值,便会抛出 FlowException 异常。FlowSlot 依赖于 StatisticSlot 的统计数据。
NodeSelectorSlot:负责收集资源路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级、数据统计。
LogSlot:打印日志。
比如本文开头的例子,当请求要访问 HelloWorld 资源时,该请求需要顺次经过上述这些 slot 的检查,同时当访问结束时 StatisticSlot 里面也记录下 HelloWorld 资源被访问的统计数据,当后面的请求再次访问该资源时,FlowSlot、DegradeSlot 可以使用这些统计数据做检查。
sentinel 使用 SPI 加载这些 slot,并根据注解 @SpiOrder 的属性 value 对它们排序,value 越小优先级越高。在 sentinel 中,这些 slot 的顺序是:
我们也可以添加自定义的 slot,只需要实现 ProcessorSlot 接口,在 com.alibaba.csp.sentinel.slotchain.ProcessorSlot 文件中添加自定义类的全限定名,然后使用注解 @SpiOrder 指定顺序即可。
对于每个 slot 的实现原理在后面的文章做介绍。下面通过代码介绍一下 SphU.entry () 和 entry.exit () 内部都做了什么。
————————————————
版权声明:本文为CSDN博主「龚厂长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38308374/article/details/114951452