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

news/2025/2/28 15:50:26/文章来源:https://www.cnblogs.com/LiuFqiang/p/18633831

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)更新本地的流控规则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861988.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写 k近邻 与 全连接神经网络 算法

KNN(K-近邻算法) K-近邻算法的介绍 参考: https://blog.csdn.net/weixin_39910711/article/details/114440816 手写knn算法,实现mnist的图片数字识别 # 手动 实现knn import io from struct import pack,unpack import random from PIL import Image import time import nump…

jmeter参数化取数机制

场景:参数化文件中只有3个账户 并发数设置的是4 执行一次,如何取值当参数化文件中所有值全部取完后,又会从头开始取值(如图所示,只有三个账户,并发数为4,第1个线程取值和第4个线程取值相同) 如果是一个线程,循环(迭代)4次,取值同上面一致

甲子光年智库发布《中国 AI 算力行业发展报告》

12月30日,甲子光年智库正式发布《中国AI算力行业发展报告》。中昊芯英受邀参与了该报告的编写工作,并为报告的编写贡献了专业的见解和实践经验。12 月 30 日,备受业界关注的《中国 AI 算力行业发展报告》(以下简称「报告」)由甲子光年智库正式发布。该报告为行业内外提供了…

盘点!2024年航空航天大事件

​2024年,航空航天领域再次迎来了丰硕成果。这一年,不仅见证了中国航空航天技术的飞速发展,也目睹了其他国家在航空航天探索中的持续突破。从嫦娥六号完成世界首次月球背面自动采样返回,到SpaceX星舰实现“筷子夹火箭”奇景,航空航天领域呈现出前所未有的活力和创造力。低…

谷歌浏览器json插件

1.下载插件 https://www.baidufe.com/fehelper/index/index.html 2.添加插件 浏览里里打开路径:chrome://extensions/3.将下载好的插件托拽到浏览器里即可 4.效果

lovelymem梭哈solar内存取证---Alex4nd3r

内存取证1 请找到rdp连接的跳板地址flag{192.168.60.220}内存取证2 请找到攻击者下载黑客工具的IP地址控制台信息flag{155.94.204.67}内存取证3 攻击者获取的“FusionManager节点操作系统帐户(业务帐户)”的密码是什么flag{GalaxManager_2012}内存取证4 请找到攻击者创建的用…

hot100-一刷-13堆(共3道题)

215. 数组中的第K个最大元素 题目链接 题目描述代码实现 分析:后面可以看下官方题解的,手动写排序或者大顶堆。代码: class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> pq = new PriorityQueue<>((n1, n2) -> n1 - n2…

hot100-一刷-14贪心(共4道题)

121. 买卖股票的最佳时机 题目链接 题目描述代码实现 分析: 我们需要知道第 i 天之前,股票价格的最小值是什么,再讨论从股票最小值买入,第i天卖出获得的利润,取最大值。 代码: class Solution {public int maxProfit(int[] prices) {int minPrice = prices[0];int ans = …

中考英语优秀范文-004 Who is your favourite movie star? 你最喜欢的电影明星是谁?

中考英语优秀范文-004 Who is your favourite movie star? 你最喜欢的电影明星是谁? 1 写作要求 请根据以下提示信息以My favourite movie star为题,用英语写一篇80词左右的短文,可适当发挥。 提示信息: Who is your favourite movie star? What does he or she look lik…

静力学FEM12.31

1.静力学方程 考虑图所示变截面弹性杆的静态响应。这是线性应力分析或线弹性问题的一个例子,我们需要求杆内的应力分布σ(x)。 应力由物体的变形产生,而变形由物体内各点的位移u(x)表征。位移导致用ε(x)表示的应变;应变是一个无量纲变量。杆受到分布力b(x)或集中力作用。这…

苍穹外卖day06、07

Reids缓存、Spring Cache框架bug记录知识点记录HttpClient HttpClient是Apache Jakarta Common下的子项目,可以用来提供高效的、最新的、高智能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。微信小程序开发缓存菜品 问题: 用户端小程序展示的…