一文带你弄懂怎样使用Sentinel的Slot插槽实现限流熔断

Sentinel的插槽介绍

Sentinel是一个开源的分布式系统高可用保护组件,在流量控制、熔断降级等方面有着非常优秀的表现。其中,Sentinel中的"插槽"(slot)机制是实现各种限流、熔断等功能的重要基础。

Sentinel中的"插槽"即为代码执行过程中收集调用链路上的一些关键事件,并根据这些事件判断当前调用是否需要进行限流、熔断等操作。通过集成各类框架的关键节点和自定义规则的方式来实现,并随着每个API的访问请求而执行,对于任意紧邻且处于整个 API 调用处上运行的 Intercept、Filter 等多个业务逻辑模块,提供了统一的使用方法,也减轻了对接入业务的侵入性。

在Sentinel中,一个插槽可以被理解为对某个流量入口的处理逻辑抽象,它是实现流量控制的基本单位。每个插槽都有自己的统计信息和状态,如当前的请求数、成功数、失败数、超时数等。通过这些统计信息,Sentinel可以实时地感知应用的流量状况,并根据预设的规则自适应地调整流量控制策略。

Sentinel中提供了默认的插槽实现,但也支持用户自定义插槽,从而实现更复杂的流量控制。用户可以通过实现Slot接口来定义自己的插槽实现,并将其注册到Sentinel的全局插槽管理器中。全局插槽管理器负责将所有插槽按照优先级排序,并在每次请求进入Sentinel时依次执行各个插槽中的控制逻辑,直到某个插槽返回不通过的结果,或者所有插槽均通过了验证。

Slot接口中的方法介绍

Slot接口是Sentinel插槽的核心,它定义了以下几个方法:

  • entry(Context context, T resourceWrapper, Object[] args): 插槽核心方法,用于根据上下文判断是否允许请求通过当前插槽。其中,context表示当前上下文,resourceWrapper表示当前资源的封装对象,args表示当前请求的参数列表。返回值为一个枚举类型的EntryResult,表示当前请求是允许通过、被阻塞还是需要等待。

  • getSlotName(): 获取当前插槽所属的分类,可以理解为插槽的类型或作用范围。

  • getMetrics(T resourceWrapper, Context context): 获取当前插槽和资源的实时统计信息。其中,resourceWrapper表示要统计的资源封装对象,context表示当前上下文(请求)。返回值为一个统计信息列表,每个统计信息包含了当前插槽和资源的一些关键指标,如请求数、成功数、失败数、超时数等。

  • resetResourceMetric(T resourceWrapper): 重置给定资源的相关统计信息。通常情况下,这个方法会被Sentinel内部的定时任务自动触发。

  • resetGlobalMetric(): 重置当前插槽的所有统计信息。

除了默认的Slot实现外,Sentinel还提供了一些内置的扩展插槽,如流量整形插槽(Traffic Shaping Slot)、系统保护插槽(System Protection Slot)等,可用于更细粒度的流量控制和系统保护。通过使用这些插槽,开发人员可以更加方便地实现高效、稳定的分布式应用系统。

Slot接口源码及注释

下面是Sentinel中Slot接口的源码,包括了此接口的部分方法和注释:

java 复制代码
public interface Slot<T> {

    /**
     * Check whether current {@link Context} is allowed to pass this slot.
     *
     * @param context current context
     * @return allowed result (allowed: {@code true}, blocked: {@code false}, waiting: {@code null}).
     * @throws BlockException if the request is blocked, blocked reason will be carried by the thrown exception.
     */
    // 插槽核心方法,用于根据上下文判断是否允许请求通过当前插槽
    // allowed 表示通过,blocked 表示被阻塞,waiting 表示需要进入等待状态(对应排队等待的场景)
    // 如果被阻塞,则会抛出 BlockException 异常并带有相应的阻塞原因
    EntryResult entry(Context context, T resourceWrapper, Object[] args) throws Throwable;

    /**
     * Get the category of the slot.
     *
     * @return the category of the slot
     */
    // 插槽所属的分类,可以理解为插槽的类型或作用范围
    String getSlotName();

    /**
     * Get the real-time metrics of the current slot and resource.
     *
     * @param resourceWrapper specific resource
     * @param context         current context
     * @return the real-time metrics of the current slot and resource
     */
    // 获取当前插槽和资源的实时统计信息
    // resourceWrapper 表示要统计的资源封装对象,context 表示当前上下文(请求)
    List<Metric> getMetrics(T resourceWrapper, Context context);

    /**
     * Reset the corresponding statistics metrics for the resource. Typically it will be triggered automatically by Sentinel
     * internal schedule task.
     *
     * @param resourceWrapper specific resource
     */
    // 重置给定资源的相关统计信息
    // 通常情况下,这个方法会被 Sentinel 内部的定时任务自动触发
    void resetResourceMetric(T resourceWrapper);

    /**
     * Reset all the statistics metrics for this slot.
     */
    // 重置当前插槽的所有统计信息
    void resetGlobalMetric();
}

Sentinel插槽小结

Sentinel的插槽(Slot)是实现流量控制和系统保护的基本单位,它可以根据请求上下文判断是否允许请求通过当前插槽,并且支持自定义插槽以实现更复杂的流量控制逻辑。

插槽由Slot接口定义,其中包含了核心方法entry、获取信息方法getMetrics等,还有一些其他辅助方法。在执行入口控制时,全局插槽管理器会按照优先级依次调用各个插槽,直到所有插槽均通过验证或有插槽返回不通过结果。同时,每个插槽都有自己的统计信息和状态,Sentinel可以利用这些信息实时感知应用的流量状况,并根据预设的规则自适应地调整流量控制策略

除了默认的插槽实现外,Sentinel还提供了许多内置的插槽扩展,如流量整形插槽(Traffic Shaping Slot)、系统保护插槽(System Protection Slot)等,可用于更细粒度的流量控制和系统保护。这些插槽可以帮助开发人员更加方便地实现高效、稳定的分布式应用系统。

好了,本篇文章就先分享到这里了,后续将会继续介绍sentinel详细的其他方面的知识,感谢大佬认真读完支持咯~

相关推荐
why1517 小时前
腾讯(QQ浏览器)后端开发
开发语言·后端·golang
浪裡遊7 小时前
跨域问题(Cross-Origin Problem)
linux·前端·vue.js·后端·https·sprint
声声codeGrandMaster7 小时前
django之优化分页功能(利用参数共存及封装来实现)
数据库·后端·python·django
呼Lu噜7 小时前
WPF-遵循MVVM框架创建图表的显示【保姆级】
前端·后端·wpf
bing_1587 小时前
为什么选择 Spring Boot? 它是如何简化单个微服务的创建、配置和部署的?
spring boot·后端·微服务
学c真好玩8 小时前
Django创建的应用目录详细解释以及如何操作数据库自动创建表
后端·python·django
Asthenia04128 小时前
GenericObjectPool——重用你的对象
后端
Piper蛋窝8 小时前
Go 1.18 相比 Go 1.17 有哪些值得注意的改动?
后端
excel8 小时前
招幕技术人员
前端·javascript·后端
盖世英雄酱581368 小时前
什么是MCP
后端·程序员