sentinel 原理全解析:https://github.com/all4you/sentinel-tutorial
文章-原理全解析:
① sentinel 与 Hystrix 对比
②sentinel模块讲解: core-核心模块 限流、降级、系统保护实现;
transport-传输模块,提供基本的监控服务端和客户端的API实现;
extension-扩展模块,对DataSource扩展实现
adapter-适配器模块,对常见框架的适配
③限流的案例实现
④深入原理:创建SlotChain 、 执行SlotChain#entry() 、 执行Slot#entry()
⑤控制台架构设计 Dashboard
⑥适配器的实现原理:在主流框架的扩展点中增加代码实现
⑦DataSource 的扩展
文章-重要概念:
①Resource - ResourceWrapper来表示资源,资源是对业务代码提供服务的抽象,包装了ReaourceName和EntryType;
通过注解SentinelResource
来定义,避免了对代码的侵入性;
②Slot,插槽所组成的插槽链,每个插槽都有自己的职责,通过编排顺序达到限流降级的目的。可以通过实现SlotsChainBuilder
接口加入自定义的Slot,同一个资源全局共享一个SlotChain; 调用链
③Context,维护当前调用链的元数据,
④Entry,表示通过限流的一个凭证,包含:创建时间、关联的node,调用来源,关联的资源resourceWrapper
⑤Node,保存资源的实时统计数据,实现类StatisticNode
⑥Metric,用来进行实时数据统计的度量接口,本身不具备统计能力,是通过Window来进行统计的,实现类ArrayMetric
滑动窗口
文章-调用链:
①调用链实现:Slot执行完业务逻辑处理后,会调用fireEntry()方法 该方法触发下一个节点的entry()方法 下一个节点调用fireEntry(),形成责任链模式;
NodeSelectorSlot
负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;ClusterBuilderSlot
则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;StatistcSlot
则用于记录,统计不同维度的 runtime 信息;SystemSlot
则通过系统的状态,例如 load1 等,来控制总的入口流量;AuthoritySlot
则根据黑白名单,来做黑白名单控制;FlowSlot
则用于根据预设的限流规则,以及前面 slot 统计的状态,来进行限流;DegradeSlot
则通过统计信息,以及预设的规则,来做熔断降级;
②Context上下文,相同的资源名可以创建多个上下文,一个Context包含三个核心的对象;
1)当前调用链的根节点:EntranceNode
2)当前的入口:Entry; 调用 SphU#entry()
都会生成一个Entry入口
3)当前入口所关联的节点:Node; 包含:StatisticNode 、 DefaultNode 、 ClusterNode 、 EntranceNode;
③调用链树:
构造树干: ContextUtil.enter() 加入 / ContextUtil.exit() 退出 (形成parent/child的双向链表)
构造叶子节点DefaultNode -- 保存目标资源在当前状态下的统计信息以便进行流量控制,添加到context的各个Entry的curNode属性中;
每次进入不同的资源名形成的链树;
链树特点:
①所有的树主干都是entranceNode,并且按照先进后出,后进先出的栈结构进行保存;
②目标资源的统计信息保存在curNode中,并且保存主干子节点的统计信息,便于查找下游节点的统计情况形成调用链;
④sentinel 限流降级功能,7个核心插槽职责:
一、进行资源调用路径构造的NodeSelectorSlot和ClusterBuilderSlot
二、进行资源的实时状态统计的StatisticSlot ,基于滑动时间窗口实现gps指标统计;
三、进行系统保护,限流,降级等规则校验的SystemSlot、AuthoritySlot、FlowSlot、DegradeSlot
要点:
1.每次的资源请求都需要在一个 context 中执行,如果没有通过 ContextUtil.entry() 方法显示的创建 context ,会系统会通过 MyContextUtil.entry() 来创建一个默认的 context。
2.context 保存了一次请求生命周期中的全部数据。
3.一个 context 都会唯一绑定到一个 resource 中去,但是一个 resource 可能会绑定这多个 context。
4.一个 resource 唯一确定一个全局共享的 ProcessSlotChain。
文章-滑动窗口:时间窗口是在某个固定时间长度内保存一些统计值的虚拟概念;500ms;
sentinel统计出qps是通过滑动时间窗口来统计的。DefaultNode和ClusterNode
DefaultNode:保存着某个resource在某个context中的实时指标,每个DefaultNode都指向一个ClusterNode;
ClusterNode:保存着某个resource在所有的context中实时指标的总和,同样的resource会共享同一个ClusterNode,不管他在哪个context中;
ArrayMetric
LeapArray和Window: LongAdder保存指标值,相比AtomicLong
有更好的吞吐量,空间换时间;
图解滑动窗口过程:
文章-扩展点:通过扩展性,预留扩展点,方便后期的代码修改;
扩展点- 规则持久化:
扩展点- 网络通讯:抽象了三大接口
CommandCenter:启动对外提供api接口的服务端,默认有http和netty的实现。
CommandHandler:处理接收到的请求的,不同请求在不同的handler中处理;可自定义并注册到SPI配置实现自定义命令
HeartbeatSender:发送心跳,默认有两个实现http netty;
扩展点- Slot链: SlotChainBuilder 作为SPI接口扩展;
扩展点- StatisticSlot回调:抽象了callback对StatisticSlot进行解耦;包含:
ProcessorSlotEntryCallback 、 ProcessorSlotExitCallback; 注册到 StatisticSlotCallbackRegistry 即可生效;