作积极的人,越努力越幸运!算法
本文行文思路:先抛出源码阅读方法,而后结合Sentinel创做过程谈谈具体是如何运用这些技巧,最后解答几个源码阅读的误区。架构
Sentinel 系列共包含15篇文章,主要以源码分析为手段,图文并茂的方式对 Sentinel 的架构设计理念、核心实现要点进行了一一剖析,并加以实战分析与思考。框架
不少朋友都在咨询我是如何阅读源码的。对此可概括为以下几个要点,而后结合 Sentienl 源码分析专栏对各个要点进行拆解,对源码阅读方法进行一次“实战”。运维
在准备深刻学习 Sentinel 以前,首先认真看了一遍 Sentinel 的官方文档,从而造成了对 Sentinel 的基本认识,咱们能够从官方文档了解到 Sentinel 主要涉及的核心内容,正以下图所示:ide
这些内容能够简单的当成一个学习的提纲,能够从里面挑选本身感兴趣的进行重点学习。微服务
在看完官方文档后,我就踏上创做 Sentinel 系列的征途。
本文不会再详细介绍每个知识点的细节,有关各个知识点的具体讲解,你们能够点击感兴趣的连接中进行深刻研究,本文主要是点到为止,重在介绍笔者是如何学习源码的。源码分析
一、Alibaba Sentinel 限流与熔断初探
该文章主要从以下几个点进行展开:学习
其实第三点并非特别必须,不过要得出这些结论也并不难,由于对 Sentinel 有了全局的认识后并根据各个模块的命名很容易能得出该模块的做用。这里第四点很是关键,一般一个优秀的开源框架都会提供完备的演示 Demo,你们能够看到 Sentinel 的演示 demo 很是丰富,在本文中我特地选择了 Dubbo 来作示例,主要是咱们公司大量使用 dubbo 来实现公司的微服务,这样会更加贴近实战,更有利于寻找突破口。ui
经过跑通 Demo 的主要目的有三个:架构设计
经过该篇文章的学习咱们了解到能够经过 Dubbo 的扩展机制实现对 Dubbo 的适配,在 Dubbo Filter 中咱们能看到了与 Sentinel 相关的核心 API SphU.entry,从而找到深刻学习 Sentinel 的核心入口,也就是后续文章会经过对该方法的研究,从而打开进入 Sentinel 内核世界的大门。
备注:在阅读这篇文章的时候,我以为 Dubbo 的适配感受很是简单,但随着我对这个系列的深刻学习,发现了该方法没有那么简单,当时不少点都没有理解到位,这个在后续会有重点阐述,这也是不断学习、不断思考带来的好处。
三、寻找一把进入 Alibaba Sentinel 的钥匙
本文主要是详细跟踪 SphU.entry 方法的执行流程,从而揭晓其实现的关键点,果不其然,经过跟踪该方法的流程,找到了 Sentinel 的核心运做机制:Slot 处理链。
就问你们激不激动,开不开心,从这些 Slot 的名字基本就能得出其含义,后续的研究重点就是逐一解开这些 Slot 的实现原理便可。
四、Sentinel 调用上下文环境实现原理
按照上述 Slot 的链,开始了 NodeSelectorSlot 的研究,经过学习了解到该 NodeSelectorSlot 主要是构建 Sentinel 的调用链,即调用上下文环境管理,准确的说是构建调用链的入口节点。在 Sentinel 中每进入一个资源都会有对应的节点实时存储该资源的调用信息。
五、Sentinel 实时数据采集原理
这个议题共两篇文章,其相关连接以下:
要实现限流、熔断等功能,首先要解决的问题是如何实时采集服务(资源)调用信息。例如将某一个接口设置的限流阔值 1W/tps,那首先如何判断当前的 TPS 是多少?Alibaba Sentinel 采用滑动窗口来实现实时数据的统计,实现类:StatisticSlot。
六、Sentinel 限流实现原理
在弄懂了 Sentinel 的实时数据采集原理后,限流实现就很是简单了,就是基于采集的调用信息,而后与限流规则进行比较,判断是否须要限流,Sentinel 在触发限流后还提供了多种处理策略,例如快速失败、匀速排队、预热等机制。
但我在学习限流的时候,我将限流核心逻辑与触发限流后的处理策略进行了分解,在学习限流的时候挑选了最简单处理策略(匀速排队),将比较难的预热机制分解,再单起一篇文章进行学习,这样的拆解有利于保证学习单篇文章的用时,并提升本身的“产量”,提升本身的成就感。
这块主要包含以下4篇文章:
这里还要重点阐述一下限流领域最核心的算法:漏桶算法、漏斗算法等,而且 Sentinel 的预热机制主要是参考 Guava 的实现,故这里花了点精力认真学习了 Guava 的 RateLimite 的实现原理。
七、Sentinel DegradeSlot 熔断实现原理
限流部分学习完后,我就火烧眉毛的去探究熔断的实现,其实熔断自己并不复杂,和限流同样,无非就是根据当前的实时调用信息与熔断规则进行对比便可,若是知足熔断规则就抛出异常。若是只是熔断自身的实现本质确实简单,但要结合实际,其实有更多的问题须要思考,这个在后面的实战篇又是反复思考,从而发现 Sentinel 在熔断的实现上其实比较粗糙。
八、Sentienl 动态数据源架构设计理念与改造实践
通过前面的文章,Sentinel 的单机限流与熔断已经基本学习了,这个时候就要开始思考如何使用 Sentinel 了,但 Sentinel 官方提供的后台运维管理系统的熔断、限流规则只能存储在内存,显然不能直接用于生产环境,故须要提出解决方案,本篇文章详细介绍了笔者是如何根据官方资料进行动态数据源配置的方法调研的,完成是按照工做中架构设计方案的标准来思考的,强烈推荐。
九、Sentinel Dubbo 适配器看限流与熔断(实战思考篇)
支持了动态数据源,就继续进行思考,在微服务领域是如何思考引入熔断机制的,进行一番思考后发现官方提供的 Dubbo 适配器的粒度是服务级别的,没法控制机器级别,例以下图所示:
例如当前的 Sentinel Dubbo 适配器目前不支持一个服务其中一台服务提供者变慢,发往这台机器上的请求被熔断,当前的实现版本会调用该服务的全部请求都会被熔断,故官方的 Dubbo 适配器还须要更加完善,有了本身的思考才会对知识理解更多,故经过学习源码,必定不能“尽信书”,要有本身的思考与怀疑能力,这样才能对开源社区作出必定的贡献,共同进步与成长。
以上就是我学习源码的方法,但愿对你们真正有所帮助与感触。
咱们要始终明白看源码只是手段,目的是要思考框架的设计原理、并经过源码了解实现细节并指导实践。重在思考。固然实现细节看事后容易忘记,但只要理解了思想,在须要使用时能够看本身写过的文章,一会儿就能拾起来。
我是强烈不建议这样作,这样会迷失在细节中无可自拔。正确的姿式是寻找入口,带上本身的思考去梳理,当遇到看不懂源码或是没法理解其思想时,这个时候能够借助 Debug,能够经过运行时可视化的数据,帮助咱们更快的了解。
原创不易,若是对你有所帮助请你为本文点个【在看】吧,这将是我写做更多优质文章的最强动力。
欢迎加入个人知识星球,一块儿交流源码,探讨架构,揭秘亿级订单的架构设计与实践经验,打造高质量的技术交流圈,为广大星友提供高质量问答服务,长按以下二维码加入。