首页 > 其他分享 >Sentinel(三)工作原理

Sentinel(三)工作原理

时间:2023-09-15 10:24:29浏览次数:40  
标签:Slot nodeA 工作 exit Context Sentinel 原理 资源

Sentinel工作原理和源码解析


1 架构图解析

sentinel-slot-chain

​ Sentinel的核心骨架是ProcessorSlotChain,其将不同的Slot按照顺序串在一起(责任链模式),从而将不同的功能组合在一起,系统会为每个受保护的资源都创建一套SlotChain

​ 整个架构分为两部分,一部分的Slot用于数据统计,另一部分Slot则使用统计的数据做具体的流控

2 SPI机制

​ Sentinel槽链中的各Slot的执行顺序是固定好的,但并不是绝对不能够改变的,Sentinel将ProcessorSlot作为SPI接口进行扩展,使得SlotChain具备了扩展能力,用户可以自定义Slot并编排Slot之间的顺序。

image-20230826163608445

3 Slot简介

​ 在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU API 显式创建。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如:

用于数据统计的Slot

  • NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级
  • ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据
  • StatisticSlot 则用于记录、统计不同纬度的 runtime实时指标监控信息

使用统计的数据进行具体流控的Slot

  • ParamFlowSlot:对应的是热点参数限流部分,
  • FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;对应流控规则部分
  • AuthoritySlot根据配置的黑白名单调用来源信息,来做黑白名单控制,对应的是授权规则部分;
  • DegradeSlot通过统计信息以及预设的规则,来做熔断降级,对应降级规则部分
  • SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量,对应系统规则部分;
3.1 Sentinel Context
  • Context是对资源操作的上下文,每个资源操作必须属于一个Context,如果代码中没有指定Context,则系统会创建一个name为sentinel_default_context的默认Context
  • 一个context的生命周期可以包含多个资源操作,Context的生命周期的最后一个资源在exit的时候会清理Context,也意味着该Context的生命周期结束了
  ContextUtil.enter("entrance1", "appA");
  Entry nodeA = SphU.entry("nodeA");
  if (nodeA != null) {
    nodeA.exit();
  }
  ContextUtil.exit();

  ContextUtil.enter("entrance2", "appA");
  nodeA = SphU.entry("nodeA");
  if (nodeA != null) {
    nodeA.exit();
  }
  ContextUtil.exit();

以上代码将在内存中生成以下结构:

                machine-root
                /         \
               /           \
       EntranceNode1   EntranceNode2
             /               \
            /                 \
    DefaultNode(nodeA)   DefaultNode(nodeA)

​ Context 代表调用链路上下文,贯穿一次调用链路中的所有 Entry。Context 维持着入口节点(entranceNode)、本次调用链路的 curNode、调用来源(origin)等信息。Context 名称即为调用链路入口名称。

​ Context 维持的方式:通过 ThreadLocal 传递,只有在入口 enter 的时候生效。由于 Context 是通过 ThreadLocal 传递的,因此对于异步调用链路,线程切换的时候会丢掉 Context,因此需要手动通过 ContextUtil.runOnContext(context, f) 来变换 context。

下面有一段代码举例说明Context对资源操作

image-20230826172827446
    public void m() {
        // 创建一个来自appA的访问、名为"enterOne"的Context
        ContextUtil.enter("enterOne", "appA");

        // Entry的本质是一个资源操作对象
        Entry nodeA = null;
        Entry nodeB = null;
        try {
            // 一个Context对多个资源的操作

            // 使用context(本质是ThreadLocal)获取对"resource1"的资源操作
            nodeA = SphU.entry("resource1");
            // 走到这里说明获取成功,对资源的请求通过了流控
            // 执行对resource1的相关业务

            // 使用context(本质是ThreadLocal)获取对"resource2"的资源操作
            nodeB = SphU.entry("resource2");
            // 走到这里说明获取成功,对资源的请求通过了流控
            // 执行对resource2的相关业务
        } catch (BlockException e) {
            e.printStackTrace();
            // 到这里说明获取操作资源失败,被流量控制了
            // 会去执行降级处理
        } finally {
            if(nodeA != null) {
                nodeA.exit();
            }
            if(nodeB != null) {
                nodeB.exit();
            }
        }

        // 释放Context
        ContextUtil.exit();
    }
3.2 Node类别及之间的关系
image-20230826172630641
  • Node:用于完成数据统计的接口
  • StatisticNode:统计节点,是Node接口的实现类,用于完成数据统计
  • EntranceNode:入口节点,每一个Context都会有一个入口节点,用于统计当前Context的总体流量数据
  • DefaultNode:默认节点,用于统计一个资源在当前Context的流量数据
  • ClusterNode:集群节点,用于统计一个资源在所有Context中的总体资源流量
image-20230826172827446
3.3 源码分析入口

​ 分析思路如下,

image-20230903111004921
3.4 entryWithPriority方法解析
3.5 Context的创建解析
3.6 FlowSlot流控槽解析
image-20230829081902416
3.7 Degrade Slot熔断降级Slot解析
image-20230829094114124

4 滑动时间窗口算法

5 Sentinel的数据统计解析

标签:Slot,nodeA,工作,exit,Context,Sentinel,原理,资源
From: https://www.cnblogs.com/tod4/p/17704232.html

相关文章

  • 【RocketMQ】【源码】延迟消息实现原理
    RocketMQ设定了延迟级别可以让消息延迟消费,延迟消息会使用SCHEDULE_TOPIC_XXXX这个主题,每个延迟等级对应一个消息队列,并且与普通消息一样,会保存每个消息队列的消费进度(delayOffset.json中的offsetTable):publicclassMessageStoreConfig{privateStringmessageDelayLevel=......
  • 《Python编程快速上手——让繁琐工作自动化》 原版电子书PDF+源码
    第11章从Web抓取信息第12章处理Excel电子表格第13章处理PDF和Word文档第14章处理CSV文件和JSON数据第15章保持时间、计划任务和启动程序第16章发送电子邮件和短信第17章操作图像第18章用GUI自动化控制键盘和鼠标附录A安装第三方模块附录B运行程序附录C习题答案下载:https......
  • 什么是 JavaScript?它是如何工作的?可以用它做什么
    什么是JavaScript?JavaScript是一种编程语言,最初由BrendanEich于1995年在NetscapeCommunicationsCorporation工作时开发。最初名为“Livescript”,后来更名为“JavaScript”。用JavaScript编写的命令可以直接执行,无需任何编译或准备。因此,JavaScript与其他编程语言有很......
  • EasyCVR视频云融合平台在党政工作可以推动数字化能提高工作效率
    一、方案概述该平台具有海量的视频接入、汇聚与管理、处理及分发等视频能力。这意味着它可以轻松地处理大量的视频数据,从各种终端设备(如摄像头、移动设备等)采集、传输、存储和分析视频信息,并支持灵活的视频处理和分发功能。EasyCVR平台部署轻量简单,功能灵活多样。这表明该平台可以......
  • java架构师是做什么的 java架构师的工作内容
    Java架构师每天的工作是什么?Java架构师估计是每个java程序员都向往的职位吧,不过成为java架构师是需要经历漫长修炼的,不过我们可以先了解一下Java架构师每天的工作内容,感兴趣的小伙伴不妨看看吧。 java架构师是做什么的java架构师的工作内容1.负责设计和建设软件系统架构(平台......
  • Mysql主从复制原理
     本文总结自网上关于Mysql复制原理的一些文章。----------------------------------------------------------1、Mysql复制是一个异步的复制,从masterinstance到slaveinstance,实现整个复制操作主要使用3个进程完成。其中2个进程是Slave的Sql进程和IO进......
  • Laf 云开发平台及其实现原理
    Laf产品介绍自我介绍大家好,我是来自Laf团队的王子俊,很高兴今天能在这里给大家分享我们Laf云开发平台及其实现原理。本来想说一点什么天气之类的话作为开头,但主持人都说完啦,我就不多说了,还是直接开始今天的分享吧。产品介绍在准备PPT的时候,我想过很多种的方式来介绍......
  • 4.1 应用层Hook挂钩原理分析
    InlineHook是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、等领域。本章将......
  • C# Async、Await原理
    1、使用异步编程需要async和await:Task任务可以使用aweit匿名方法(包括Lambda表达式),通过async也可以变成异步方法2、加asyncawait表示这个方法可以异步顺序执行。(不加await会出现并行执行)3、async+await函数调用不会造成阻塞,它内部所有的await阻塞都被封装在一......
  • #yyds干货盘点#SQL注入之布尔注入原理
    布尔注入定义及原理:所谓盲注就是在服务器没有错误回显的时候完成注入公鸡。盲注分为布尔盲注和时间盲注布尔盲注:boolean根据注入信息返回trueorfales没有任何报错信息时间盲注:界面返回值ture无论输入任何值,返回的情况都是正常的来处。加入特定的时间函数,通过查看web页面返回......