sentinel限流,熔断等具体流程分析

news2025/7/13 19:10:06

基于sentinel 1.8.6
在这里插入图片描述
从sentinel-dashboard来看,sentinel主要提供了流控,熔断,热点,系统规则,授权规则等。

针对http请求的数据监控以及规则限制的适配,可以参考sentinel-spring-webmvc-adapter以及sentinel-web-servlet-adapter
具体的实现类

com.alibaba.csp.sentinel.adapter.servlet.CommonFilter
com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor

一个是基于spring的HandlerInterceptor,一个是基于servlet的Filter。

com.alibaba.csp.sentinel.adapter.servlet.CommonFilter为例
在这里插入图片描述
init,doFilter,destory这三个方法分别对应初始化,逻辑处理,执行完处理的逻辑,重点放在doFilter()方法。

@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest sRequest = (HttpServletRequest) request;
        Entry urlEntry = null;

        try {
            String target = FilterUtil.filterTarget(sRequest);
            // Clean and unify the URL.
            // For REST APIs, you have to clean the URL (e.g. `/foo/1` and `/foo/2` -> `/foo/:id`), or
            // the amount of context and resources will exceed the threshold.
            UrlCleaner urlCleaner = WebCallbackManager.getUrlCleaner();
            if (urlCleaner != null) {
                target = urlCleaner.clean(target);
            }

            // If you intend to exclude some URLs, you can convert the URLs to the empty string ""
            // in the UrlCleaner implementation.
            if (!StringUtil.isEmpty(target)) {
            	//解析来源
                String origin = parseOrigin(sRequest);
                String contextName = webContextUnify ? WebServletConfig.WEB_SERVLET_CONTEXT_NAME : target;
                //设置上下文
                ContextUtil.enter(contextName, origin);
				//执行sentinel一系列规则,各种校验。
                if (httpMethodSpecify) {
                    // Add HTTP method prefix if necessary.
                    String pathWithHttpMethod = sRequest.getMethod().toUpperCase() + COLON + target;
                    urlEntry = SphU.entry(pathWithHttpMethod, ResourceTypeConstants.COMMON_WEB, EntryType.IN);
                } else {
                    urlEntry = SphU.entry(target, ResourceTypeConstants.COMMON_WEB, EntryType.IN);
                }
            }
            //真正的执行请求
            chain.doFilter(request, response);
        } catch (BlockException e) {
            HttpServletResponse sResponse = (HttpServletResponse) response;
            // Return the block page, or redirect to another URL.
            WebCallbackManager.getUrlBlockHandler().blocked(sRequest, sResponse, e);
        } catch (IOException | ServletException | RuntimeException e2) {
            Tracer.traceEntry(e2, urlEntry);
            throw e2;
        } finally {
            if (urlEntry != null) {
                urlEntry.exit();
            }
            ContextUtil.exit();
        }
    }

主要看下在执行真正的chain.doFilter()执行前,sentinel都做了些什么?

com.alibaba.csp.sentinel.SphU#entry(java.lang.String, int, com.alibaba.csp.sentinel.EntryType)
com.alibaba.csp.sentinel.CtSph#entryWithPriority(com.alibaba.csp.sentinel.slotchain.ResourceWrapper, int, boolean, java.lang.Object...)
private Entry entryWithPriority(ResourceWrapper resourceWrapper, int count, boolean prioritized, Object... args)
        throws BlockException {
        Context context = ContextUtil.getContext();
        if (context instanceof NullContext) {
            // The {@link NullContext} indicates that the amount of context has exceeded the threshold,
            // so here init the entry only. No rule checking will be done.
            return new CtEntry(resourceWrapper, null, context);
        }

        if (context == null) {
            // Using default context.
            context = InternalContextUtil.internalEnter(Constants.CONTEXT_DEFAULT_NAME);
        }

        // Global switch is close, no rule checking will do.
        if (!Constants.ON) {
            return new CtEntry(resourceWrapper, null, context);
        }
		//初始化流控规则的chain链
        ProcessorSlot<Object> chain = lookProcessChain(resourceWrapper);

        /*
         * Means amount of resources (slot chain) exceeds {@link Constants.MAX_SLOT_CHAIN_SIZE},
         * so no rule checking will be done.
         */
        if (chain == null) {
            return new CtEntry(resourceWrapper, null, context);
        }

        Entry e = new CtEntry(resourceWrapper, chain, context);
        try {
        	//执行链
            chain.entry(context, resourceWrapper, null, count, prioritized, args);
        } catch (BlockException e1) {
            e.exit(count, args);
            throw e1;
        } catch (Throwable e1) {
            // This should not happen, unless there are errors existing in Sentinel internal.
            RecordLog.info("Sentinel unexpected exception", e1);
        }
        return e;
    }
 ProcessorSlot<Object> chain = lookProcessChain(resourceWrapper); 这个方法会初始化默认的规则校验链,说白了就是流控,熔断...这些规则,我该怎么一个一个的进行校验。
com.alibaba.csp.sentinel.slotchain.SlotChainProvider#newSlotChain
com.alibaba.csp.sentinel.spi.SpiLoader#loadFirstInstanceOrDefault

在这里插入图片描述

sentinel基于SPI的方式实现了一个默认的处理链,接口为com.alibaba.csp.sentinel.slotchain.SlotChainBuilder的实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
处理链的每一个slot都是实现ProcessorSolt。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以熔断为例,她是一个扩展的spi接口,并且设置了优先级,所以初始化后的规则校验链如下图所示
在这里插入图片描述
到目前为止,大致清楚了,我们在sentinel设置了一些类型的规则,规则校验的顺序是什么?怎么实现,如何加载的应该已经很清晰了。

再回到com.alibaba.csp.sentinel.CtSph#entryWithPriority(com.alibaba.csp.sentinel.slotchain.ResourceWrapper, int, boolean, java.lang.Object...)这个方法中,执行的具体方法为com.alibaba.csp.sentinel.slotchain.ProcessorSlot#entry

以流控校验为例
在这里插入图片描述
执行flowSlot的entry方法时,会从上下文中获取该资源的统计信息。并与当前类型的规则进行比较,并更新进统计信息。
统计信息存储在StatisticNode里。包括当前资源名,执行了通过多少次,拒绝多少次等信息。

com.alibaba.csp.sentinel.node.StatisticNode

以上大致就是http请求,sentinel处理的流程,对于dubbo请求,参考类

com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter
com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboConsumerFilter

dubbo支持应用本身作为消费者以及生产者的调用信息的统计。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CBAM(Convolutional Block Attention Module)卷积注意力模块用法及代码实现

CBAM卷积注意力模块用法及代码实现CBAMChannel Attention模块&#xff08;CAM&#xff09;Spatial Attention模块&#xff08;SAM&#xff09;代码实现CBAM CBAM&#xff08; Convolutional Block Attention Module &#xff09;是一种轻量级注意力模块的提出于2018年。CBAM包…

185-200-spark-核心编程-Streaming

185-spark-核心编程-Streaming&#xff1a; 数据处理延迟的长短分为&#xff1a;实时数据处理&#xff08;毫秒级别&#xff09;&#xff0c;离线数据处理&#xff08;小时&#xff0c;天&#xff09; 数据处理的方式分为&#xff1a;流式数据处理&#xff08;streaming&…

ORACLE19c数据库随LINUX操作系统自动启动实现方式

1.建立目录 # su - oracle $ mkdir /home/oracle/scripts 2.建立启动脚本&#xff1a; $ cd /home/oracle/scripts $ vim startdb.sh #!/bin/bash export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ ORACLE_BASE/product/19.16.0/db_1 export ORACLE_SIDemrep export PAT…

【电脑使用】利用diskpart删除电脑的EFI分区

文章目录前言问题描述问题解决扩展&#xff1a;测量磁盘读写速度1 win10自带工具2 第三方工具前言 在Windows的磁盘管理中&#xff0c;往往会发现自己电脑的磁盘中莫名多了一些分区&#xff0c;有一些是系统分区&#xff08;一般不删&#xff09;&#xff0c;还有一些是还原分区…

m索引OFDM调制解调系统的性能仿真分析

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着无线通信技术的不断发展,人们对下一代移动通信系统提出了越来越高的要求。在这样的时代背景下,具有低峰均比,强频偏对抗能力和高能量效率的索引调制OFDM系统(Orthogonal Frequency Division …

【跟学C++】C++STL三大主要组件——容器/迭代器/算法(Study19)

文章目录1、前言2、简介2.1、STL是什么&#xff1f;2.2、STL能干什么&#xff1f;2.3、STL组成3、容器3.1、顺序容器3.2、排序容器(关联式容器)3.3、哈希容器3.4、容器适配器3、迭代器3.1、迭代器介绍3.2、迭代器定义方式3.3、迭代器类别3.4、辅助函数4、算法5、总结 【说明】…

【MATLAB教程案例60】使用matlab实现基于GRU网络的数据分类预测功能与仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.GRU网络理论概述

【云原生进阶之容器】第一章Docker核心技术1.5.4节——cgroups使用

4 CGroups使用 4.1 挂载cgroup树 开始使用cgroup前需要先挂载cgroup树,下面先看看如何挂载一颗cgroup树,然后再查看其根目录下生成的文件。 #准备需要的目录 #准备需要的目录 dev@ubuntu:~$ mkdir cgroup && cd cgroup dev@ubuntu:~/cgroup$ mkdir demo#由于name=…

[论文解析] Diffusion Guided Domain Adaptation of Image Generators

project link: https://styleganfusion.github.io/ 文章目录OverviewWhat problem is addressed in the paper?What is the key to the solution?What is the main contribution?IntroductionBackgroundLatent diffusion modelClassifier-free guidanceMethodModel Structur…

pytorch深度学习实战lesson36

第三十六课 锚框 因为我们在目标检测里面需要预测边缘框&#xff0c;所以给我们的预测带来了很大的问题。我们在卷积神经网络里面做图片分类的时候&#xff0c;整个代码写起来看上去非常简单&#xff0c;就是一个 soft Max 出去就完事了。但是因为有边框的加入&#xff0c;使得…

第十二期 | 万元的正版课程仅花9.9就可买到?

顶象防御云业务安全情报中心监测发现&#xff0c;某线上教育培训类平台课件遭遇大规模盗取。被盗取的课件&#xff0c;经加工处理后&#xff0c;进行低价转售&#xff0c;严重损害了平台的合法权益。 飞速发展的在线教育和看不见的风险 随着5G、视频编解码等技术融合&#xff…

DevExpress .Net Components 22.2.3 Crack

DevExpress .Net适用于 Windows、Internet 以及您的移动世界的用户界面组件 使用适用于 WinForms、WPF、ASP.NET&#xff08;WebForms、MVC 和 Core&#xff09;、Windows 10、VCL 和 JavaScript 的 DevExpress 组件&#xff0c;打造一流的用户体验并模拟最热门的企业生产力程…

产品负责人 VS 产品经理

概述 Scrum框架创造了对新角色的需求&#xff0c;其中就包括 “产品负责人” 。这不可避免额外地导致对产品负责人和产品经理角色的误解和误用&#xff0c;对团队产生不必要的压力。 角色混淆会带来噪音和摩擦&#xff0c;削弱团队对价值、质量、速度和满意度的关注。这种混乱…

让搜狗快速收录网站的方法,批量查询网站有没有被搜狗收录

让搜狗快速收录只需做到以下8点&#xff1a; 1、网页标题要与内容相关。 2、页面少用flash&#xff0c;图片等 3、将网站链接大量推送给搜狗。 4、网页尽量采用静态网页。 5、首页的外部链接不要过多。 6、搜狗更喜欢受用户欢迎的内容的网站。 7、网站不要欺骗用户。 8、网站不…

四道编程题(涉及最大公约数最小公倍数,子序列等)

tips 1. scanf当是读取整数%d的时候&#xff0c;这时候如果它读取到\n&#xff0c;它就会停止读取。并且碰到空格的时候也会跳过。 2. getchar不需要传入参数&#xff0c;读取失败的时候会返回EOF。那getchar或者scanf到底是怎么从键盘上读取我输入的字符呢&#xff1f;在getc…

VSCode入门

VSCode入门 零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#…

[附源码]Node.js计算机毕业设计高校创新学分申报管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

微服务实用篇4-消息队列MQ

今天主要来学习异步通讯技术MQ&#xff0c;主要包括初识MQ&#xff0c;RabbitMQ快速入门&#xff0c;SpringAMQP三大部分&#xff0c;下面就来一起学习吧。路漫漫其修远兮&#xff0c;吾将上下而求索&#xff0c;继续加油吧&#xff0c;少年。 目录 一、初识MQ 1.1、同步通讯…

文件历史记录无法识别此驱动器如何修复?

案例&#xff1a; 在电脑中尝试使用内置工具文件历史记录将文件备份到另一个硬盘时&#xff0c;发现如图所示的错误“文件历史记录无法识别此驱动器”&#xff0c;这可怎么办&#xff1f; 文件历史记录驱动器断开连接的原因 文件历史记录无法识别此驱动器的原因可能是启动类型…

四种排序(选择排序、冒泡排序、快速排序和插入排序)

四种排序&#xff08;选择排序、冒泡排序、快速排序和插入排序&#xff09;选择排序&#xff1a;完整代码&#xff1a;运行结果&#xff1a;冒泡排序&#xff1a;完整代码&#xff1a;运行结果&#xff1a;插入排序&#xff1a;完整代码&#xff1a;运行结果&#xff1a;快速排…