sentinel源码入门
创始人
2024-05-30 05:05:35
0

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()方法

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...