如何使用Sentinel的Slot插槽实现限流熔断,看完这篇文章会有新的收获

news/2024/12/29 15:29:37/

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍如何使用Sentinel的Slot插槽实现限流熔断,后续文章将详细介绍Sentinel的其他知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞

在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

在这里插入图片描述

以下正文开始

文章目录

  • Sentinel的插槽介绍
  • Slot接口中的方法介绍
  • Slot接口源码及注释
  • Sentinel插槽小结

在这里插入图片描述

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接口的源码,包括了该接口的部分方法和注释:

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详细的其他方面的知识,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述


http://www.ppmy.cn/news/140030.html

相关文章

VP记录:Codeforces Round 599 (Div. 2) A~D

传送门:CF 前提提要:无 A题:A. Maximum Square 刚开始的第一个想法是排序然后二分答案.但是一看范围才1000,果断直接使用暴力枚举. 考虑枚举最终的答案,然后记录有多少个 a i ai ai大于此值,然后判断能否构成一个正方形即可. #include <bits/stdc.h> using namespace…

MacBookPro M1安装 Ubuntu

1&#xff0c;下载软件 首先&#xff0c;到Parallels Desktop for Mac官网下载Parallels Desktop&#xff0c;然后安装即可。 接着&#xff0c;去ubuntu官网下载ubuntu的iso镜像。 2&#xff0c;加载镜像 首先&#xff0c;我们启动Parallels Desktop&#xff0c;然后点击…

[mac] 解决 mac 外接屏幕分辨率过高的问题

解决 mac 外接屏幕分辨率过高的问题 之前 mac 用的外接屏幕的最高分辨率是 1920 x 1080&#xff0c;使用起来很舒服。 最近换了块 2k 屏&#xff0c;默认分辨率为 2560 x 1440&#xff0c;分辨率过高导致字体很小看起来很不舒服 手动调用外接屏幕分辨率 System Preference…

全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发环境)

原文出处 &#xff1a; 全新安装Mac OSX 开发者环境 非常好的文章 赞 用了一年的Mac OS X了&#xff0c;之前不熟悉这个系统&#xff0c;用的是系统自带的PHP 以及DMG包安装的MySQL&#xff0c;时间长了&#xff0c;慢慢觉得MacBook的速度跟不上了&#xff0c;虽然关机次数不…

mac 安装php开发环境

用了一年的Mac OS X了&#xff0c;之前不熟悉这个系统&#xff0c;用的是系统自带的PHP 以及DMG包安装的MySQL&#xff0c;时间长了&#xff0c;慢慢觉得MacBook的速度跟不上了&#xff0c;虽然关机次数不多&#xff0c;但是每次开机&#xff0c;或者唤醒电脑的时候&#xff0c…

C语言中的getopt()和getopt_long()函数

getopt被用来解析命令行选项参数。 getopt_long支持长选项的命令行解析. 例如我们通常在终端上输入如下命令&#xff1a; ./main -l yongyuan --name aini或者 /main -l yongyuan --nameaini 前面的./main表示执行main程序而后面的l就是参数&#xff0c;后面空格之后的yongyua…

记录一次闲鱼维权事件

-----2017.11.16 最后一次更新----- 小夕也真的没有想到&#xff0c;在万般绝望之时竟然得到了这么多人的帮助。在本文发出后&#xff0c;多位阿里人员积极联系我了解了情况&#xff0c;很感激一位阿里的专家帮我将此事递交给相关部门&#xff0c;让专业的客服直接受理和重审此…

关于malloc与字符指针的一些易错点

有如下一段代码&#xff0c;意图把“zhongxiaoming"字符串赋值进以p为首地址的空间为15字节的内存空间&#xff0c;然后释放p所指向的内存&#xff0c;以免出现内存泄露。 该代码出现几个问题&#xff0c;涉及到内存的赋值、malloc函数以及free函数的用法&#xff0c;以及…