Spring Cloud Alibaba基于Sentinel实现限流降级自定义配置结果

news2024/12/24 9:31:11

hello,你好呀,我是灰小猿,一个超会写bug的程序员!

sentinel作为SpringCloudAlibaba的基本组件,在进行熔断、限流、降级等方面具有十分重要的作用,而且其基于Web界面对接口进行限流配置,使得实时监控接口流量,控制限流策略变得十分方便。

这篇文章和大家分享一下如何在对接口配置了限流规则后,使用自定义的配置实现触发限流后的返回结果和响应处理。

首先在sentinel界面对相应的接口添加一个限流策略,我配置的如下:一秒内限制接口请求量为2个。

限流的接口如下:

@RestController
public class ConsumeAController {
    @GetMapping("/getInfo")
    public String getConsumeInfo(){
        return "你好,灰小猿!";
    }
}

对接口发起请求,正常情况下相应结果为:

 

当请求量达到限流规则后,在不配置自定义返回结果的情况下,sentinel默认的返回如下:

 当然一般情况下我们需要给前端返回一个具体的相应处理结果,所以就需要我们对触发限流后的响应进行自定义配置。

sentinel进行限流处理默认方法为:

public class DefaultBlockExceptionHandler implements BlockExceptionHandler {
    public DefaultBlockExceptionHandler() {
    }

    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        response.setStatus(429);
        PrintWriter out = response.getWriter();
        out.print("Blocked by Sentinel (flow limiting)");
        out.flush();
        out.close();
    }
}

如果想要实现自定义的配置,只需要重新实现BlockExceptionHandler 接口即可:

因为sentinel的限流规则从控制台可以看出有如下五种:

 因此针对每种限流规则,可以设置分别返回不同的响应结果。每一种限流策略都对应了一种异常。我的配置类如下:

注:在下面的自定义类中,如果不需要返回自定义的响应结果,而是跳转到对应页面,可以将返回结果处理换成方法中最后的两种处理方法即可。

/**
 * 自定义配置限流降级错误信息
 */
@Slf4j
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        ResultObject resultObject = null;
        //根据限流降级的策略规则,不同的异常返回不同的提示语,
        if (e instanceof FlowException) {
            resultObject = ResultObject.builder().code(100).message("接口限流了").build();
        }else if (e instanceof DegradeException){
            resultObject = ResultObject.builder().code(101).message("服务降级了").build();
        }else if (e instanceof ParamFlowException){
            resultObject = ResultObject.builder().code(102).message("热点参数限流了").build();
        }else if (e instanceof SystemBlockException){
            resultObject = ResultObject.builder().code(103).message("触发系统保护规则了").build();
        }else if(e instanceof AuthorityException){
            resultObject = ResultObject.builder().code(104).message("授权规则不通过").build();
        }


        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        response.setCharacterEncoding("utf-8");
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        new ObjectMapper().writeValue(response.getWriter(),resultObject);

        //如果需要跳转到指定页面使用如下处理:
        //request.getRequestDispatcher("/index.jsp").forward(request,response);
        //跳转到网站
        //response.sendRedirect("https://blog.csdn.net/weixin_44985880");
    }
}

其中的ResultObject为我自定义的统一返回结果类

/**
 * 统一返回结果
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder //生成构建器模式
public class ResultObject implements Serializable {
    private Integer code;
    private String message;
    private Object data;
}

重新启动项目运行,多次刷新接口,触发限流策略后界面响应结果为:

 至此,自定义限流处理成功!

我是灰小猿,我们下期见!

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

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

相关文章

环形链表II(链表篇)

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整…

伪原创文章生成器-伪原创工具在线使用

文章伪原创工具 在如今数字时代,内容创作已经成为了一项必不可少的营销策略。然而,创作原创内容需要相当的时间和精力,尤其是对于需要大量输出内容的企业或个人而言。这时,文章伪原创工具就成为了一种快速、高效的选项。在本文中…

Doris(15):物化视图

1 概念 物化视图是将预先计算(根据定义好的 SELECT 语句)好的数据集,存储在 Doris 中的一个特殊的表。 物化视图的出现主要是为了满足用户,既能对原始明细数据的任意维度分析,也能快速的对固定维度进行分析查询。 首…

【C++】布尔类型(bool)

目录​​​​​​​ 1、缘起 2、笔记整理 4、用法 4.1、布尔变量的定义和初始化 4.2、布尔类型的运算符 4.3、布尔类型的条件语句 4.4、布尔类型的循环语句 5、总结 1、缘起 最近在 BiliBili 黑马程序员学习 C 编程语言,今天学习到了 布尔(b…

算法套路十二——回溯法之排列型回溯

算法套路十二——回溯法之排列型回溯 该节是在第十节回溯法之子集型回溯的基础上进行描写,组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求, 故请首先阅读第十节算法套路十——回溯法之子集型回溯 算法示例一:LeetCode46. 全…

windows环境安装tensorflow-gpu-2.10.1

Tensorflow 2.10是最后一个在本地windows上支持GPU的版本 1. 通过.whl文件方式安装2.创建anaconda虚拟环境3.安装对应的cuda与cudnn版本,local不必装cuda和cudnn4. 测试tensorflow gpu是否可用 1. 通过.whl文件方式安装 .whl文件的下载地址: tensorflow…

Linux — 线程概念和线程控制

目录 一、 线程的概念 什么是线程? 线程的优点 线程的缺点 线程异常 线程用途 二、线程的控制 创建线程 pthread_create函数 线程终止 pthread_exit函数 pthread_cancel函数 线程等待 pthread_join函数 分离线程 一、 线程的概念 之前的文章说过每个进程有…

IDE后端启动JetLinks 物联网基础平台(2.x)

目录 一、官网 二、文档中心 三、下载源码 四、安装依赖 五、IDE配置 六、修改配置文件:jetlinks-standalone/src/main/resources/application.yml 七、启动项目(项目会自动建表) 一、官网 JetLinkshttps://www.jetlinks.cn/#/ 二、…

率先实现One-box量产后,这家厂商重磅发布智能底盘“三步走”战略

率先实现One-box和Two-box产品量产之后,利氪科技向业界发布了重要的产品布局规划及进展。 在4月18日开幕的上海国际车展上,利氪科技重磅发布了全新的智能化线控底盘产品矩阵,同时发布了智能底盘“三步走”计划。据了解,利氪科技将…

数据结构(五)—— 栈与队列

文章目录 前言一、基础1.1 stack1.2 queue 二、题2.1 232 用栈实现队列2.2 225 用队列实现栈2.3 20 有效的括号2.4 1047 删除字符串中的所有相邻重复项 前言 灵魂四问: 1、C中stack,queue 是容器么? 答:不是,而是容器…

高数基础3

目录 极限的概念,性质以及存在准则 求极限的方法 ​编辑 常用的基本极限 1的无穷次方常用的结论 例题: 方法2:利用等价无穷小代换求极限 例题: 常用的等价无穷小 利用有理运算法则求极限 例题 极限的概念,性质以…

【C语言】函数讲解(上)

【C语言】函数讲解(上) 1.函数是什么2.C语言中函数的分类2.1库函数2.1.1如何学会使用库函数 2.2.自定义函数 3.函数的参数3.1实际参数(实参)3.2形式参数(形参) 4.函数调用4.1传值调用4.2传址调用4.3练习 所…

Redis分布式锁实现方案

一、什么是分布式锁,与本地锁有什么区别 本地锁: 解决同一进程内多个线程操作同一资源的问题。 分布式锁: 解决多个进程同时操作同一资源的问题。 二、Redis的SETNX Redis之所以能实现分布式锁,得益于Redis的单线程处理模式&am…

Macbook(苹果电脑) VSCode 创建简单c++程序 配置C++开发环境

1.打开 Terminal 终端(Command空格,输入Terminal)。 1.1 输入如下指令,查看是否显示版本信息。 clang --version 1.2 如果出现版本信息,则跳过,否则输入 xcode-select --install 2. 为 VS Code 安装插件 …

docker中的四种网络模式

docker中的四种网络模式 实现原理四类网络模式host模式container模式none模式bridge模式 实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Con…

MySQL_第06章_多表查询

第06章_多表查询 讲师:尚硅谷 - 宋红康(江湖人称:康师傅) 官网: http://www.atguigu.com 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的…

【Python】darts包(Python时序预测库的安装方法)+conda环境和库的建立

一、介绍 "darts"是一个Python编程语言中的数据处理和时间序列分析工具包。它提供了一系列用于处理、建模和分析时间序列数据的功能,包括时间序列的预处理、特征工程、模型训练和预测等。darts包含了许多常用的时间序列模型,如ARIMA、Prophet…

Linux权限 - 概念与管理 | 文件权限的修改与转让 【详解】

目录 Linux权限 Linux权限的概念 Linux权限的基础操作 (1).实现用户账号的切换 (2).仅提升当前指令的权限 Linux权限管理 1、文件访问者的分类(人) 2、文件类型和访问权限(事物属性) 3、文件权限值的表示方法 4、文件访…

数据结构与算法基础(王卓)(28):排序概述(分类)、直接插入排序思路

目录 排序分类:(本章目录) 按数据存储介质:(学习内容) 内部排序: 外部排序: 按比较器个数:(学习内容) 串行排序: 并行排序&…

arduino学习笔记2

一.蜂鸣器输出实验 1.源代码 int buzzer2;//设置控制蜂鸣器的数字口对应板子上2口 void setup() { pinMode(buzzer,OUTPUT);//设置对应的输出模式 } void loop() { unsigned char i,j;//定义变量while(1) { for(i0;i<50;i)//输出一个频率的声音{ digitalWrite(buzzer,H…