sentinel源码入门

news2025/7/25 10:40:20

sentinel是一个流量治理组件,主要用来做降级、熔断和限流,以及监控等,sentinel的使用相对来说比较简单,这篇博客主要介绍sentinel的源码

入口

在使用sentinel的时候,我们需要引入sentinel的相关jar包,然后整个sentinel源码的入口,我认为是在SentinelAutoConfiguration这个类中,我们在使用的时候,如果引入了sentinel的jar包,其中会引入"spring-cloud-alibaba-sentinel"的jar包,在这个包中,会通过springboot的自动注入方式,注入了一个bean:SentinelAutoConfiguration
在这里插入图片描述

在这个类中,又通过@Bean的形式,注入了另外的一个bean:SentinelResourceAspect
在这里插入图片描述

SentinelResourceAspect

这个类是sentinel进行流控、降级、黑白名单校验的入口
在这里插入图片描述
从这个截图中,我们可以看到

  1. 这个类是一个切面
  2. 切入点是:@SentinelResource注解
  3. 并且是一个环绕通知
  4. 在环绕通知方法中,会先调用SphU.entry()方法,在finally方法中,会调用SphU.exit()方法

真正核心的逻辑,就在entry和exit()方法中

entry

在entry方法中,最终会调用到

com.alibaba.csp.sentinel.CtSph#entryWithPriority(com.alibaba.csp.sentinel.slotchain.ResourceWrapper, int, boolean, java.lang.Object…)

这个方法,我们来看下这个方法中的逻辑
在这里插入图片描述
在entryWithPriority方法中,核心的方法就两个,分别已经圈出来了
因为在sentinel中,支持流控、热点参数限流、熔断、日志、实时监控等,这些子功能的实现,在源码层面上,实际上是抽象成了一个个的ProcessorSlot;
在这个方法中,lookProcessChain()方法实际上,就是根据当前请求资源(资源我们简单理解为一次请求),判断要执行哪些slot,将这些slot构建成一个执行链,然后调用chain.entry()方法依次执行,所以我们先看下构建processorSlot执行链的逻辑

初始化ProcessorSlotChain

可以看到,在这里进行了双重的检查判断,如骨头chainMap集合中,根据当前resource没有找到执行链,就通过newSlotChain()方法进行初始化
在这里插入图片描述

可以看到,在初始化的时候,会调用slotChainBuilder.build()方法,我们以DefaultSlotChainBuilder为例:
在这里插入图片描述

com.alibaba.csp.sentinel.slots.DefaultSlotChainBuilder#build
在这里插入图片描述

在这个方法中,会通过SPI的方式,去加载配置的所有的slot,将slot,加载到processorSlotChain中
在这里插入图片描述

chain.entry()

这里会依次调用每个slot的entry()方法

AuthoritySlot

我们以这个slot为例,看下在其entry()方法的逻辑
在这里插入图片描述

可以看到,在方法中,只有两行代码,第一行是这个slot的逻辑,第二行代码,是调用父类的方法,在父类中,会继续调用下一个slot
在这里插入图片描述

所以这里大致就是sentinel中各个slot被调用的逻辑,那sentinel的各个功能就是在不同的slot中去实现的

chain.exit()

exit的方法类似,如果当前slot的exit方法中,没有要处理的逻辑,那就直接调用父类的fireExit()方法
在这里插入图片描述

可以看到,在父类中,会调用下一个slot的exit()方法
在这里插入图片描述

总结

总结来看,sentinel的源码逻辑是比较清晰的

  1. 通过springboot的自动注入,注入了一个切面
  2. 在切面中,通过环绕通知,分别执行slot的entry()和exit()方法
  3. 在调用entry()方法之前,会通过spi机制,获取到所有的slot,并构建成一个执行链
  4. 在所有的slot被调用完毕之后,会开始调用业务的方法
  5. 在最后的finally方法中,会调用exit(),执行各个slot的exit()方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用码匠连接 ClickHouse

目录 在码匠中集成 ClickHouse 在码匠中使用 ClickHouse 关于码匠 ClickHouse 数据源是一种列式数据库管理系统,由俄罗斯 Yandex 公司开发和维护。它专注于高性能、高并发、高可扩展性和低延迟的数据处理,特别是在海量数据的 OLAP(联机分析…

性能分析利器:火焰图

什么是火焰图 火焰图(FlameGraph)是是由 Linux 性能优化大师 Brendan Gregg 发明的。通过 perf 等工具分析得到结果,看起来就像是火焰,这也是它的名字的由来。火焰图以一个全局的视野来看待时间分布,它从底部往顶部&am…

Dockerfile部署SpringBoot项目

Dockerfile部署SpringBoot项目 文章目录 利用Dockerfile部署SpringBoot项目 1、创建一个SpringBooot项目并且打成jar包2、在Linux中创建一个文件夹,来做docker测试3、将jar包上传到Linux中4、编写Dockerfile文件5、制作镜像6、启动容器7、查看容器启动日志8、访问接…

高效能自动化港口数字化码头智慧港航,中国人工智能企业CIMCAI世界港航人工智能领军者,成熟港口码头人工智能产品中国人工智能企业

打造高效能自动化港口数字化码头智慧港航,中国人工智能企业CIMCAI中集飞瞳世界港航人工智能领军者,成熟港口码头人工智能产品全球顶尖AI科技CIMCAI成熟AI产品全球前三船公司及港口落地,包括全球港口/堆场智能闸口验箱,全球港口岸边…

Vulnhub系列:Raven 1

该篇为Vulnhub系列靶机渗透,本次靶机存在4个flag。下面开始我们今天的渗透之旅。Raven靶机有很多种思路,我将对其进行一一整理。首先进行信息收集,利用arp-scan和nmap,进行靶机的ip及端口扫描发现了22、80、111端口。下面访问80端…

【LeetCode】剑指 Offer 23. 链表中环的入口节点 p139 -- Java Version

题目链接:https://leetcode.cn/problems/c32eOV/ 1. 题目介绍(23. 链表中环的入口节点) 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环&#x…

怎么清空回收站?3分钟解决!

真实案例:回收站清空不了怎么办?怎样清空回收站里的文件? “各位大神,怎么恢复回收站里清空的文件?我按照百度上的方法,还是不行。” 当你在电脑上删除文件时,它们通常会被移到回收站&#xf…

mpi4py 运行过程中出现Read -1, expected xxx, errno = 1 解决方案

目录 问题描述 代码1(串行) 代码2(并行) 代码2执行时所用指令 错误信息 解决方案 解决方案1 解决方案2 问题描述 今天正在学习使用mpi4py,在对比运行以下2个代码时疯狂报错: 代码1(串…

HTML 脚本

HTML 脚本 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 使 HTML 页面具有更强的动态和交互性。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏览器执行。 在线实例 插入一段脚本 如何将脚本插入 HTML 文档。 使用 <noscript> 标签 如何应对不…

非接触式流量监测设备——雷达流速仪

一、设备概述 雷达流速仪是一款非接触且可连续测量流速、水位、流量的一体式流量监测设备。它采用雷达平面微波技术&#xff0c;通过非接触方式测量水体的流速和水位。根据内置的软件算法&#xff0c;计算并输出实时断面流量及累计流量&#xff1b;可用于泵站、河道、灌渠、地…

扬帆优配|三大油气巨头都嗨了,龙头总市值盘中破万亿

近期组织盯上哪些股&#xff1f; 3月7日早盘&#xff0c;周期板块大幅上涨。石油板块涨超4%遥遥领先&#xff0c;海越能源涨停。油气巨头我国石油盘中涨近6%&#xff0c;总市值一度突破万亿元。我国石化盘中涨幅到达6.86%&#xff0c;股价创四年来新高。我国海油盘中涨停&#…

Rocketmq技术详解

Rocketmq技术详解 运维部署 docker-compose.yml version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_name: rmqnamesrvports:- 9876:9876volumes:- ./logs:/opt/logs- ./store:/opt/storenetworks:rmq:aliases:- rmqnamesrvrmqbroker:image: foxisw…

后疫情时代,EIoT助力实体零售ESG战略落地

多点智能物联总经理刘汉彻 2023一开年&#xff0c;烟火气回归&#xff0c;各行各业都在摩拳擦掌&#xff0c;准备在后疫情元年“大干一场”。对企业而言&#xff0c;“降本增效”已成为跨行业的共同认知&#xff0c;实体零售也给自身的发展标定了方向&#xff1a;“彻底回归商…

CSS清楚浮动

先看看关于浮动的一些性质 浮动使元素脱离文档流 浮动元素可以设置宽高&#xff0c;在CSS中&#xff0c;任何元素都可以浮动&#xff0c;浮动元素会生成一个块级框&#xff0c;而不论其本身是何种元素。 如果没有给浮动元素指定高度&#xff0c;&#xff0c;那么它会以内容的…

JAVA SE: IO流

一、Java流式输入输出原理Java对于输入输出是以流(Stream)的方式进行的&#xff0c;JDK提供各种各样的“流”类&#xff0c;以获取不同类型的数据。可以理解为将管道插入到文件中&#xff0c;然后从管道获取数据。这个管道外边还可以套管道&#xff0c;外边的管道对数据进行处理…

Transwarp KunDB 备份恢复工具安装和备份工作自动化

备份恢复工具安装安装包# KunDR压缩包 KUNTOOL-Image-Registry-3.0.0-X86_64-final.tar.gzservice_client └── kuntools-3.0.0-final├── kundr-3.0.tar.gz└── kuntools-3.0.tar.gzkundr-3.0.tar.gz ├── bin │ ├── kunkun.sh │ ├── kuntools │ └──…

软件测试(进阶篇)(1)

一)如何根据需求来设计测试用例&#xff1f; 1)验证功能的正确性&#xff0c;合理性&#xff0c;无二义性&#xff0c;逻辑要正确 2)分析需求&#xff0c;细化需求&#xff0c;从需求中提取出测试项&#xff0c;根据测试项找到测试点&#xff0c;根据测试点具体的来进行设计测试…

C++基础——C++面向对象之类、对象与继承基础总结(类和对象概念、构造函数与析构函数、this指针、继承)

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

14_MySQL视图

1. 常见的数据库对象2. 视图概述2.1 使用视图的好处视图一方面可以帮我们使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。比如&#xff0c;针对一个公司的销售人员&#xff0c;我们只想给他看部分数据&#xff0c;而某些特殊的数据…

前瞻洞察|DoH,隐蔽隧道又添利器,强盾在何方?

DoH这个词对于很多安全从业人员并不是个新词&#xff0c;但对其前世今生能洞若观火的却不多。本期前瞻洞察将从DNS的隐私与安全问题出发&#xff0c;讲述DoH为什么诞生&#xff0c;DoH的出现到底利弊几何&#xff0c;对其弊端如何应对。为了便于读者理解&#xff0c;对于“何为…