sentinel源码入门

本文深入探讨Sentinel流量治理组件的源码,主要关注SentinelResourceAspect的entry和exit方法,以及ProcessorSlotChain的构建和执行。Sentinel通过SpringBoot自动配置启动,SentinelResourceAspect作为AOP切面处理@SentinelResource注解的方法,通过SphU.entry()和SphU.exit()调用slot链。entry方法中,初始化ProcessorSlotChain并调用chain.entry()执行slot逻辑;exit方法则按顺序调用slot的exit()方法。Sentinel的各种功能如流控、降级等在不同的ProcessorSlot中实现。

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()方法
### 阅读 Sentinel 源码的收益与建议 阅读 Redis Sentinel 源码能够为开发者提供对高可用架构设计和实现的深刻理解。以下是阅读 Sentinel 源码的主要收益和建议: #### 收益 1. **深入了解高可用架构** 通过阅读 Sentinel 源码,可以掌握如何设计和实现一个分布式系统的高可用解决方案。Sentinel 的核心功能包括主从切换、故障检测和通知机制等[^1]。这些功能的设计思想可以直接应用于其他类似的系统。 2. **学习复制与集群的关系** Sentinel 的实现依赖于 Redis 的复制功能,并且其逻辑与 Redis 集群有紧密联系。因此,在阅读 Sentinel 源码之前,先熟悉 Redis 的复制模块是必要的[^1]。这有助于理解 Sentinel 如何利用复制机制来保证数据一致性。 3. **掌握故障检测与恢复机制** Sentinel 提供了完善的故障检测机制,能够自动发现并处理 Redis 实例的故障。通过阅读源码,可以了解心跳检测、主从切换的具体实现细节,这对于设计类似的高可用系统非常有帮助。 4. **提升代码阅读能力** 阅读开源项目的源码是一个提升编程能力和架构思维的有效途径。Sentinel源码结构清晰,注释详尽,适合初学者入门。同时,它也展示了如何在复杂的分布式环境中实现健壮的功能[^2]。 #### 建议 1. **按照正确的顺序阅读** 由于 Sentinel 的实现依赖于 Redis 的复制功能,而 Redis 集群又依赖于 Sentinel 和复制模块,因此建议按照以下顺序进行阅读:复制模块 -> Sentinel 模块 -> 集群模块[^1]。这样可以更系统地理解各个模块之间的关系。 2. **结合实际使用场景** 在阅读源码的同时,结合实际的使用场景进行测试和验证。例如,可以通过模拟网络分区、节点宕机等场景,观察 Sentinel 的行为,加深对源码的理解[^2]。 3. **关注接口设计与扩展性** Sentinel 的某些功能通过接口实现,例如 `RequestOriginParser` 接口用于自定义请求来源解析逻辑[^3]。阅读这部分代码时,可以重点关注接口的设计思想以及如何通过扩展接口实现定制化功能。 4. **优化与改进** 在理解 Sentinel 源码的基础上,可以尝试对其进行优化或改进。例如,针对特定场景下的性能瓶颈提出解决方案,或者增加新的功能模块。这种实践不仅能巩固知识,还能提升开发能力[^2]。 ```python # 示例代码:模拟 Sentinel 的主从切换逻辑 class Sentinel: def __init__(self, master, slaves): self.master = master self.slaves = slaves def detect_failure(self): # 模拟故障检测 if not self.master.is_alive(): return True return False def promote_slave(self): # 选择一个新的主节点 new_master = self.slaves.pop(0) self.master = new_master print(f"Promoted {new_master} to master.") # 使用示例 master = Node("Master") slaves = [Node("Slave1"), Node("Slave2")] sentinel = Sentinel(master, slaves) if sentinel.detect_failure(): sentinel.promote_slave() ``` #### 注意事项 - **时间成本** 阅读源码需要投入大量时间和精力,尤其是像 Sentinel 这样的复杂项目。确保有足够的耐心和计划,逐步深入[^2]。 - **工具支持** 使用合适的工具(如 IDE、调试器)可以帮助更快地理解源码逻辑。例如,通过设置断点跟踪程序执行路径,可以更直观地观察关键逻辑的运行过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值