sentinel 程序设计原理学习总结

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属性中

       每次进入不同的资源名形成的链树;add-child-5

        链树特点:

             ①所有的树主干都是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 有更好的吞吐量,空间换时间;

     图解滑动窗口过程:

slide-window-5

文章-扩展点:通过扩展性,预留扩展点,方便后期的代码修改;

     sentinel-modules

 

    扩展点- 规则持久化:

    扩展点- 网络通讯:抽象了三大接口

        CommandCenter:启动对外提供api接口的服务端,默认有http和netty的实现。

        CommandHandler:处理接收到的请求的,不同请求在不同的handler中处理;可自定义并注册到SPI配置实现自定义命令

        HeartbeatSender:发送心跳,默认有两个实现http  netty;

    扩展点- Slot链:  SlotChainBuilder 作为SPI接口扩展;

    扩展点- StatisticSlot回调:抽象了callback对StatisticSlot进行解耦;包含:

        ProcessorSlotEntryCallback  、 ProcessorSlotExitCallback;  注册到 StatisticSlotCallbackRegistry  即可生效;

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值