当前位置: 首页 > article >正文

Sentinel-自定义资源实现流控和异常处理

目录

使用SphU的API实现自定义资源

BlockException

使用@SentinelResource注解定义资源

SentinelResourceAspect


使用Sentinel实现限流降级等效果通常需要先把需要保护的资源定义好,之后再基于定义好的资源为其配置限流降级等规则。

Sentinel对于主流框架,例如 Web Servlet、Dubbo、Spring Cloud、gRPC、Spring WebFlux、Reactor 等都做了适配,具体可以参考主流框架适配。只需要引入对应的依赖即可方便地整合 Sentinel。

但框架适配主要是对一些http或RPC接口做资源定义,如果涉及到一些代码块或者方法是无法做资源定义的,这种情况下就需要通过编码方式自定义资源,并通过捕获异常的方式实现限流或降级的逻辑。

    使用SphU的API实现自定义资源

    SphU类在sentinel-core依赖中,主要用于对资源的访问控制。当系统想要执行某个资源操作时,通过调用 SphU.entry 方法来检查该资源是否受到流量控制。

    • 如果资源当前处于限流状态,那么 SphU.entry 会抛出 BlockException 异常,表示请求被限流,此时系统可以进行降级操作。
    • 如果资源没有受到限流,那么 SphU.entry 会返回一个 Entry 对象,表示一次资源操作开始,系统可以继续执行相关的业务代码。
    • 注意SphU.entry 需要和 entry.exit 一起配合使用,确保在业务代码执行完后执行 entry.exit

    BlockException

    BlockException是sentinel流控触发后的异常类,其下包含很多个子类,分别对应不同的场景:

    • FlowException        限流异常
    • ParamFlowException   热点参数限流的异常
    • DegradeException     降级异常
    • AuthorityException   授权规则异常
    • SystemBlockException 系统规则异常

    使用SphU的API前,需要确保项目中直接或间接引入了sentinel-core的依赖(通常框架适配的stater中已经引入了)

    <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version>
    </dependency>

    下面是一个通过SphU自定义资源的实例代码:

    public PriceDTO queryPrice(String skuCode) {PriceParam param = new PriceParam();param.setSkuCode(skuCode);Entry entry = null;try {entry = SphU.entry(SentinelResourceConstant.MARKETING_SPECIAL_ACTIVITY_QUERY_SHOP_SKU_PRICE);return productFacade.queryPrice(param).unboxing();}catch(FlowException e) {log.error("查询商品价格接口触发限流,skuCode:{}", skuCode);return null;}catch(DegradeException e) {log.error("查询商品价格接口触发降级,skuCode:{}", skuCode);return null;} finally {if (entry != null) {entry.exit();}}
    }

    使用@SentinelResource注解定义资源

    上面通过SphU API自定义资源可以最小粒度的控制要保护的资源,但是侵入较大,增加了代码的复杂性。而另外一中方式就是使用@SentinelResource 注解,这种方式对代码入侵程度相对较低。

    SentinelResourceAspect

    使用@SentinelResource 注解来实现资源定义,原理与上面的API其实是一样的,Sentinel 中定义了SentinelResourceAspect 通过切面方式拦截后同样通过SphU API来实现流控功能。

    既然注解方式是通过切面来实现的,那么在使用注解方式进行资源定义的前提就是先通过配置的方式将 SentinelResourceAspect 注册为一个 Spring Bean,有了这个bean以后@SentinelResource注解才可以生效。

    @Configuration
    public class SentinelAspectConfiguration {@Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();}
    }

    开启配置后即可在代码中使用@SentinelResource注解对某个方法进行Sentinel资源定义。

    @Service
    public class TestService {// 资源定义并设置流控处理@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")public String hello(long s) {return String.format("Hello at %d", s);}// Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.public String helloFallback(long s) {return String.format("Halooooo %d", s);}// Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.public String exceptionHandler(long s, BlockException ex) {// Do some log here.ex.printStackTrace();return "Oops, error occurred at " + s;}
    }
    

    相关文章:

    Sentinel-自定义资源实现流控和异常处理

    目录 使用SphU的API实现自定义资源 BlockException 使用SentinelResource注解定义资源 SentinelResourceAspect 使用Sentinel实现限流降级等效果通常需要先把需要保护的资源定义好&#xff0c;之后再基于定义好的资源为其配置限流降级等规则。 Sentinel对于主流框架&#…...

    使用 VIM 编辑器对文件进行编辑

    一、VIM 的两种状态 VIM&#xff08;vimsual&#xff09;是 Linux/UNIX 系列 OS 中通用的全屏编辑器。vim 分为两种状态&#xff0c;即命令状态和编辑状态&#xff0c;在命令状态下&#xff0c;所键入的字符系统均作命令来处理&#xff1b;而编辑状态则是用来编辑文本资料&…...

    visual studio 2022的windows驱动开发

    在visual studio2022中&#xff0c;若在单个组件中找不到Windows Driver Kit (WDK)选项&#xff0c;可通过提升vs版本解决&#xff0c;在首次选择时选择WDM 创建好项目在Source Files文件夹中创建一个test.c文件&#xff0c;并输入以下测试代码&#xff1a; #include <ntdd…...

    基于大数据的美团外卖数据可视化分析系统

    【大数据】基于大数据的美团外卖数据可视化分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统通过对海量外卖数据的深度挖掘与分析&#xff0c;能够为美团外卖平台提供运营决策支…...

    C/C++测试框架googletest使用示例

    文章目录 文档编译安装示例参考文章 文档 https://github.com/google/googletest https://google.github.io/googletest/ 编译安装 googletest是cmake项目&#xff0c;可以用cmake指令编译 cmake -B build && cmake --build build将编译产物lib和include 两个文件夹…...

    vue2打包部署到nginx,解决路由history模式下页面空白问题

    项目使用的是vue2&#xff0c;脚手架vue-cli 4。 需求&#xff1a;之前项目路由使用的是hash&#xff0c;现在要求调整为history模式&#xff0c;但是整个过程非常坎坷&#xff0c;遇到了页面空白问题。现在就具体讲一下这个问题。 首先&#xff0c;直接讲路由模式由hash改为…...

    如何将本地项目上传到Gitee的指定分支

    在团队协作开发中&#xff0c;我们经常需要将本地项目代码上传到代码托管平台&#xff08;如Gitee&#xff09;的特定分支。本文将详细介绍从零开始完成这一过程的完整步骤&#xff0c;包含多种场景的解决方案和常见问题处理。 一、准备工作 1.1 安装Git 确保你的系统已安装…...

    【数据结构】排序算法(中篇)·处理大数据的精妙

    前引&#xff1a;在进入本篇文章之前&#xff0c;我们经常在使用某个应用时&#xff0c;会出现【商品名称、最受欢迎、购买量】等等这些榜单&#xff0c;这里面就运用了我们的排序算法&#xff0c;作为刚学习数据结构的初学者&#xff0c;小编为各位完善了以下几种排序算法&…...

    AI随身翻译设备:从翻译工具到智能生活伴侣

    文章目录 AI随身翻译设备的核心功能1. 实时翻译2. 翻译策略3. 翻译流程4. 输出格式 二、AI随身翻译设备的扩展功能1. 语言学习助手2. 旅行助手3. 商务助手4. 教育助手5. 健康助手6. 社交助手7. 技术助手8. 生活助手9. 娱乐助手10. 应急助手 三、总结四、未来发展趋势&#xff0…...

    chromadb 安装和使用

    简介 Chromadb 是一个开源的嵌入式向量数据库&#xff0c;专为现代人工智能和机器学习应用设计&#xff0c;旨在高效存储、检索和管理向量数据。以下是关于它的详细介绍&#xff1a; 核心特性 易于使用&#xff1a;提供了简洁直观的 API&#xff0c;即使是新手也能快速上手…...

    【全球首发】DeepSeek谷歌版1.1.5 - 免费GPT-4级别AI工具

    【全球首发】DeepSeek谷歌版1.1.5 - 免费GPT-4级别AI工具 资源简介 DeepSeek谷歌版1.1.5是目前全球领先的免费AI助手&#xff0c;性能超越国内主流AI产品&#xff0c;提供类似GPT-4的智能体验。 版本信息 最新版本&#xff1a;1.1.5&#xff08;2024最新版&#xff09;应用…...

    LeetCode第132题_分割回文串II

    LeetCode 第132题&#xff1a;分割回文串 II 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文。 返回符合要求的 最少分割次数 。 难度 困难 题目链接 点击在LeetCode中查看题目 示例 示例 1&#xff1a; 输入&#xf…...

    LabVIEW 在故障诊断中的算法

    在故障诊断领域&#xff0c;LabVIEW 凭借其强大的图形化编程能力、丰富多样的工具包以及卓越的功能性能&#xff0c;成为工程师们进行故障诊断系统开发的得力助手。通过运用各种算法&#xff0c;能够对采集到的信号进行全面、深入的分析处理&#xff0c;从而准确地诊断出系统中…...

    SQL DB 数据类型

    SQL DB 数据类型 引言 在数据库管理系统中,数据类型是定义和存储数据的方式。SQL(结构化查询语言)数据库中的数据类型决定了数据的存储格式、大小、取值范围以及如何处理数据。合理选择和使用数据类型对于确保数据库性能、数据完整性和应用程序的准确性至关重要。 SQL 数…...

    Qt音频输出:QAudioOutput详解与示例

    1. 简介 QAudioOutput是Qt多媒体框架中的一个关键类&#xff0c;它提供了将PCM&#xff08;脉冲编码调制&#xff09;原始音频数据发送到音频输出设备的接口。作为Qt多媒体组件的一部分&#xff0c;QAudioOutput允许开发者在应用程序中实现音频播放功能&#xff0c;支持多种音…...

    springboot 启动方式 装配流程 自定义starter 文件加载顺序 常见设计模式

    目录 springboot介绍 核心特性 快速搭建 Spring Boot 项目 方式一&#xff1a;使用 Spring Initializr 方式二&#xff1a;使用 IDE 插件 示例代码 1. 创建项目并添加依赖 2. 创建主应用类 3. 创建控制器类 4. 运行应用程序 配置文件 部署和监控 部署 监控 与其…...

    Android学习之Material Components

    以下是 Material Design 提供的核心控件列表&#xff08;基于最新 Material Components for Android 库&#xff09;&#xff0c;按功能分类整理&#xff1a; 1. 基础按钮类 控件名称类名说明MaterialButtoncom.google.android.material.button.MaterialButton遵循 Material 规…...

    sentinel新手入门安装和限流,热点的使用

    1 sentinel入门 1.1下载sentinel控制台 &#x1f517;sentinel管理后台官方下载地址 下载完毕以后就会得到一个jar包 1.2启动sentinel 将jar包放到任意非中文目录&#xff0c;执行命令&#xff1a; java -jar 名字.jar如果要修改Sentinel的默认端口、账户、密码&#xff…...

    Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)

    一、安装步骤 1.基础环境安装 安装显卡驱动、cuda&#xff0c;根据自己硬件情况查找相应编号&#xff0c;本篇不介绍这部分内容&#xff0c;只给出参考指令&#xff0c;详情请读者自行查阅互联网其它参考资料。 sudo apt install nvidia-utils-565-server sudo apt install…...

    ANTLR 实战_从零开始构建自定义语言解析器

    1. 引言 1.1 什么是 ANTLR ANTLR(Another Tool for Language Recognition)是一个强大的解析器生成器,用于构建语言解析器、编译器和解释器。 1.2 ANTLR 的历史与发展 ANTLR 由 Terence Parr 创建,最初发布于 1995 年。经过多次版本更新,ANTLR 已成为构建解析器的首选工…...

    CTF类题目复现总结-hashcat 1

    一、题目地址 https://buuoj.cn/challenges#hashcat二、复现步骤 1、下载附件&#xff0c;解压得到What kind of document is this_文件&#xff1b; 2、用010 Editor打开What kind of document is this_文件&#xff0c;发现是office文件&#xff1b; 3、将后缀名改为ppt时…...

    4月5日作业

    需求&#xff1a; 1.按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2.要求SW 1为VLAN 2/3的主根及主网关 SW2为VLAN 20/30的主根及主网关&#xff0c;SW1和 SW2互为备份 3.可以使用super vlan 4.上层通过静态路由协议完成数据通信过程 5.AR1为企业出口路由器…...

    Bert论文解析

    文章目录 BERT&#xff1a;用于语言理解的深度双向转换器的预训练一、摘要三、BERT介绍BERT及其详细实现答疑&#xff1a;为什么没有标注的数据可以用来预训练模型&#xff1f;1. 掩码语言模型&#xff08;Masked Language Model, MLM&#xff09;2. 下一句预测&#xff08;Nex…...

    无招回归阿里

    这两天&#xff0c;无招回归阿里的新闻被刷屏了。无招创业成立的两氢一氧公司无招的股份也被阿里收购&#xff0c;无招以这种姿态回归阿里&#xff0c;并且出任钉钉的 CEO。有人说&#xff0c;这是对 5 年前“云钉一体”战略的纠偏。现在确实从云优先到 AI 优先&#xff0c;但云…...

    初探:简道云平台架构及原理

    一、系统架构概述 简道云作为一款低代码开发平台&#xff0c;其架构设计以模块化和云端协同为核心&#xff0c;主要分为以下层次&#xff1a; 1. 前端层 可视化界面&#xff1a;基于Web的拖拽式表单设计器&#xff0c;支持动态渲染&#xff08;React/Vue框架&#xff09;。多…...

    LeetCode 热题 100 堆

    215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 **k** 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 …...

    面试常被问道OSPF的问题

    面试中经常会涉及到OSPF相关的问题&#xff0c;作为网络工程师&#xff0c;我们对OSPF的了解可不能仅停留在“我知道它是路由协议”这么表面。 想面试官满意&#xff0c;拿到Offer&#xff0c;必须能回答得出细节&#xff0c;深度挖掘它的工作原理、配置技巧、以及应用场景。 …...

    Redis(笔记)

    简介&#xff1a; 常用数据类型: 常用操作命令&#xff1a; Redis的Java客户端&#xff1a; 操作字符串类型的数据&#xff1a; 操作Hash类型的数据&#xff1a; 操作列表类型的数据&#xff1a; 操作集合类型的数据&#xff1a; 操作有序集合类型数据&#xff1a; 通用命令…...

    bootloader+APP中,有些APP引脚无法正常使用?

    问&#xff1a;bootloaderAPP程序中&#xff0c;为什么有些APP引脚无法正常使用&#xff1f;无法设置高低电平 主控芯片GD32F415&#xff0c;参考案例bootloader中的引脚使用&#xff1a; 参考案例APP程序的引脚使用&#xff1a; 以及个人使用的无线模组&#xff0c;高电平使能…...

    高并发内存池:原理、设计与多线程性能优化实践

    高并发内存池是一种专门为多线程环境设计的内存管理机制&#xff0c;其核心目标是通过优化内存分配和释放过程&#xff0c;解决传统内存分配器&#xff08;如malloc/free&#xff09;在高并发场景下的性能瓶颈&#xff0c;显著提升多线程程序的内存访问效率。 目录 一、核心设计…...