首页 > 其他分享 >对Sentinel的链路分析与客户端服务端交互理解

对Sentinel的链路分析与客户端服务端交互理解

时间:2024-12-31 17:43:44浏览次数:1  
标签:缓存 请求 调用 链路 Sentinel 服务端 客户端

Sentinel介绍


https://sentinelguard.io/zh-cn/
https://github.com/alibaba/Sentinel
https://sentinelguard.io/zh-cn/docs/quick-start.html
https://github.com/alibaba/Sentinel/wiki/Sentinel-核心类解析

Sentinel定义的术语

Entry: 表示对某个资源的访问请求,通过 SphU.entry 方法进入资源,确保该资源受到 Sentinel 规则的保护
SphU:是Statistical Process Handling Utility,即统计过程处理工具
DefaultNode: 记录当前资源的指标信息、节点信息
entranceNode: 当前资源调用的入口节点

链路分析

这里以demo中的webnvc-adapter入口为例,为所有http接口添加AsyncHandlerInterceptor,如果在内部的链路中抛出了BlockException,则不会继续处理新的请求

链路的入口方法为SphU.entry,其中origin为标记的请求来源,可以自己配置,
其中ContextUtil.enter会初始化这次请求的上下文,存储在ThreadLocal中,同理在处理完请求拦截器的afterCompletion方法中会执行ContextUtil.exit()清除ThreadLocal和其他信息,
并且会在这个时候缓存DefaultNode,并且将将当前EntranceNode添加为Constants.ROOT的子节点
SphU.entry方法最终会进入entryWithPriority方法中,当出现异常会执行exit方法

通过SPI加载完ProcessorSlot会进行缓存下来,下一次资源使用的时候直接查询缓存,加载到链路中ProcessorSlot是指定的顺序,Sentinel中内置了几种Slot,默认按照加载顺序:
NodeSelectorSlot -> ClusterBuilderSlot -> LogSlot -> StatisticSlot -> AuthoritySlot -> SystemSlot -> FlowSlot -> DefaultCircuitBreakerSlot -> DegradeSlot
由于都继承了AbstractLinkedProcessorSlot,当调用fireEntry方法的时候都会调用next,所以是一个经典的责任链模式

NodeSelectorSlot

Node收集器卡槽,负责维护当前机器节点的资源调用路径,上下文共用NodeSelectorSlot内部缓存的map,并且维护当前context的Node树结构

以注释中的例子为例

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

当执行以上代码时,表示来源为appA,上下文名称为entracne1,然后在ContextUtil中会创建名称为entrance1的EntranceNode,并且会添加为ROOT的子节点,所以在内存中结构是下面这样:


               machine-root
                   /
                  /
            EntranceNode1
                /
               /
         DefaultNode(nodeA)- - - - - -> ClusterNode(nodeA);

ClusterBuilderSlot

由于继承了StatisticNode,可以存储当前资源的统计信息,并赋值给上下文中的ClusterNode
在NodeSelectorSlot中缓存的key为content的name,但是在ClusterBuilderSlot中缓存的key为ResourceWrapper,这样就保证了资源与ClusterBuilderSlot的一对一关系
为了获取同一资源的总统计数据,所有具备相同资源名称的DefaultNode共享一个ClusterNode

LogSlot

用与单独记录异常信息日志,并记录在sentinel-block.log文件

StatisticSlot

用于记录不同维度指标监控信息,比如线程数、请求成功数

StatisticSlot与其他slot不同的是,可以看到首先执行fireEntry进行后续的调用,如果成功了或者抛出异常了才会记录一些指标
在increaseThreadNum方法中可以看到不仅当前node+1,同时也维护了clusternode,clusternode与defaultnode是一对多的关系,clustrenode与resource是一对一的关系,resouce与context也是一对多的关系

如果后续链路成功,threadnum+1,passCount+1
同时也会记录全局入站的信息,用于记录后续从系统层面进行控制所需要的指标,同时ProcessorSlotEntryCallback提供了扩展接口来额外记录信息

如果抛出BlockException,则会记录block qps
具体记录指标信息在StatisticNode中的LeapArray

AuthoritySlot

黑名单白名单控制,控制请求来源,dmeo中标记为请求头中含有“S-user”,可以自己定义,

SystemSlot

通过系统层面来控制资源的访问,比如配置的系统保护规则load1、qps、线程数,在Constants中维护的ENTRY_NODE计数

FlowSlot

根据预设的规则以及前面几个slot统计的信息,来进行流量控制,对应的流控规则

DefaultCircuitBreakerSlot

当某个资源在一段时间内频繁出现异常或响应时间过长,DefaultCircuitBreakerSlot会触发熔断机制,熔断状态分为开、关、半开

DegradeSlot

也是熔断卡槽,主要基于统计数据(如异常比例、响应时间、慢调用比例)触发熔断

客户端与服务端交互

Sentinel的数据交互主要依赖于sentinel-transport,根据不同的adapter来使用,webmvc demo引入的是sentinel-transport-simple-http
不同于其他的中间件借助spring.factories,也为了sentinel的通用,在core模块下创建CtSph时会执行客户端的初始化

首先会根据Sentinel的SPI加载InitFunc的接口,并根据Order指定加载的顺序,首次会默认加载MetricCallbackInit、CommandCenterInitFunc、HeartbeatSenderInitFunc,比较重要的是CommandCenterInitFunc,还是根据spi加载 CommandHandler,并且进行缓存,缓存的key为CommandMapping的name,后续会根据这个key来调用handle来调用客户端的一些方法
接着在start方法中初始化线程池,以及接着在ServerThread中启动单独的Socket,监听请求处理在HttpEventTask中处理,

当请求来到之后,这里逻辑相当于实现了简易版的Socket服务端处理,以此来实现databoard与客户端的信息交互,比如在控制台更改流控规则、授权规则等都需要将规则同步到当前机器,同步方法就是根据上述服务端同步给当前机器

比如查询簇点链路,首先会调用控制台的/machineResource.json接口,然后会请求当前机器的jsonTree接口

Socket监听到了之后根据初始化的缓存查找对应的CommandHandler,所以可以获取Root节点下的所有信息

上面是相当于推的模式,如果控制台新增了流控规则,需要同步到对应机器怎么办呢,保存完之后调用setRules接口,推送至客户端之后调用FlowRuleManager.loadRules(flowRules)更新本地的流控规则

标签:缓存,请求,调用,链路,Sentinel,服务端,客户端
From: https://www.cnblogs.com/LiuFqiang/p/18633831

相关文章

  • 全链路解析如何构建数据资产管理框架及落地实践
    “数智基建+数智应用”赋能分享02期实录,该分享课件已上传至官网➡️课件下载https://www.dtstack.com/resources/1085?src=dsyfwh以下为本次分享的回顾:在企业数字化转型的浪潮中,数据已然成为企业最宝贵的资产之一。面对数据量的激增,企业既迎来了前所未有的机遇,也面临着重大挑战。......
  • Sentinel之动态规则扩展
    Sentinel中的动态规则1,Sentinel提供两种方式修改规则:通过API直接修改(loadRules)FlowRuleManager.loadRules(List<FlowRule>rules);//修改流控规则DegradeRuleManager.loadRules(List<DegradeRule>rules);//修政降级规则通过Datasource适配不同数据源修改2,DataS......
  • node.js基于协同过滤算法的企业入职评测系统服务端程序+论文 可用于毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于企业入职评测系统的研究,现有研究主要以传统的评测模式为主,如单纯依靠简历筛选、简单面试等方式进行人员筛选1。专门针对利用协同过滤算法构建企业入......
  • 面试官:Sentinel是如何实现限流的?
    限流是一种通过控制系统对外提供的资源、服务或接口的访问数量或速率,以保护系统免受过载的一种策略。它的目的是确保系统能够在承受范围内提供稳定和可靠的服务,避免因过多的请求而导致系统崩溃、资源耗尽或响应延迟过高的情况发生。在Sentinel中,实现限流的方法有以下两......
  • 计算机网络——数据链路层
    计算机网络体系结构:数据链路层是实现设备之间通信的非常重要的一层数据链路层的作用:注意:不同的链路层可能采用不同的数据链路层协议数据链路层使用的信道:3.1使用点对点信道的数据链路层3.1.1 数据链路和帧链路(link)是一条无源的点到点的物理线路段,中间没有任......
  • 基于Sentinel的服务保护方案的三种方式(请求限流、线程隔离、服务熔断)超详细讲解
    目录1、三种方式介绍1.1请求限流1.2线程隔离方案1.3服务熔断2、基于sentinel实现2.1启动sentinel2.2基于springboot整合sentinel2.2.1请求限流2.2.2请求隔离2.2.2.1 OpenFeign整合Sentinel2.2.3服务熔断2.2.3.1编写降级代码2.2.3.2服务熔断1、三种方......
  • Fleck:一个轻量级的C#开源WebSocket服务端库
    推荐一个简单易用、轻量级的C#开源WebSocket服务端库,方便我们快速实现WebSocket的开发。01项目简介Fleck是一个用C#编写的轻量级WebSocket服务器库。它提供了一个简单而直观的API,使得开发者可以轻松地在他们的应用程序中集成WebSocket功能,比如一些常见的实时通信应用,......
  • Sigrity System SI SerialLink模式对串行链路进行串扰仿真分析操作指导-S参数模型
    SigritySystemSISerialLink模式对串行链路进行串扰仿真分析操作指导-S参数模型SigritySystemSISerialLink模式可以对串行链路进行串扰仿真分析,通过通道串扰仿真得到串扰频域波形,2D时域波形,2D眼图,3D眼图,误码率结果以及仿真报告下面以一个S参数模型的串扰通道模板进行说......
  • Sigrity System SI SerialLink模式对串行链路进行串扰仿真分析操作指导-传输线模型
    SigritySystemSISerialLink模式对串行链路进行串扰仿真分析操作指导-传输线模型SigritySystemSISerialLink模式可以对串行链路进行串扰仿真分析,通过通道串扰仿真得到串扰频域波形,2D时域波形,2D眼图,3D眼图,误码率结果以及仿真报告下面以一个传输线模型的串扰通道模板进行......
  • 服务端请求伪造(SSRF)
    一、概述SSRF(Server-SideRequestForgery,服务端请求伪造),是攻击者让服务端发起构造的指定请求链接造成的漏洞。由于存在防火墙的防护,导致攻击者无法直接入侵内网;这时攻击者可以以服务器为跳板发起一些网络请求,从而攻击内网的应用及获取内网数据。二、成因由于服务端提供......