SpringCloud Alibaba @SentinelResource 注解

一、前言

        接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十五篇,即介绍 SpringCloud Alibaba 的 @SentinelResource 注解。

二、简介

        这个注解用于标记需要被流量控制、熔断降级以及系统保护等功能覆盖的方法或类。这个注解允许开发者自定义资源名称,并且可以配置异常处理逻辑和 fallback 函数。

        接下来我们分别使用按照资源名称限流和按照 url 地址限流分别来演示下。首先在 cloudalibaba-sentinel-service8401 模块新建一个 RateLimitController 类,用于下面的测试。

三、按资源名称限流

        在 RateLimitController 中创建一个方法,并指定限流时所调用的方法,代码如下:

@RestController
public class RateLimitController
{@GetMapping("/byResource")@SentinelResource(value = "byResource",blockHandler = "handleException")public CommonResult byResource(){return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));}public CommonResult handleException(BlockException exception){return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");}
}

        在 sentinel 的管理界面根据资源名称配置限流规则,如下图:

        输入 http://localhost:8401/byResource,进行测试,当 1s 访问一次时,效果如下:

        当频繁点击时效果如下,达到了我们的效果。

四、按照 url 地址限流

        在 RateLimitController 中创建一个方法,不指定发生限流时所调用的方法,代码如下:

@RestController
public class RateLimitController
{@GetMapping("/byResource")@SentinelResource(value = "byResource",blockHandler = "handleException")public CommonResult byResource(){return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));}public CommonResult handleException(BlockException exception){return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");}@GetMapping("/rateLimit/byUrl")@SentinelResource(value = "byUrl")public CommonResult byUrl(){return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002"));}}

         在 sentinel 的管理界面根据 url 地址配置限流规则,如下图:

        输入 http://localhost:8401/rateLimit/byUrl,进行测试,当 1s 访问一次时,效果如下:

        当频繁点击时效果如下,出现的是默认的限流返回消息,达到了我们的效果。

五、临时节点问题

        此时,关闭我们的 cloudalibaba-sentinel-service8401 模块,并等待一会,然后刷新我们

sentinel 管理界面,可以看到,节点全部消失了,证明我们所配置的这些限流规则均为临时节点。

六、兜底方案面临的问题

        虽然限流发生时,我们可以指定兜底的方案,也可以不指定使用系统默认的兜底方案,但是也不是很好,总结起来有下面四点不好的地方:

        1、若使用系统默认的,则没有体现我们自己的业务要求。

        2、依照现有条件,我们自定义的处理方法又和业务代码耦合在一个类中,不直观。

        3、每个业务方法都添加一个兜底的,那代码膨胀加剧。

        4、全局统一的处理方法没有体现。

七、自定义限流处理

        为了解决上面提出的这四点问题,我们可以采用自定义的限流处理逻辑,首先创建一个自定义处理的 hanler 类,代码如下:

package com.springcloud.myhandler;import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.springcloud.entities.CommonResult;public class CustomerBlockHandler {public static CommonResult handlerException(BlockException exception) {return new CommonResult(4444, "按客戶自定义,global handlerException----1");}public static CommonResult handlerException2(BlockException exception) {return new CommonResult(4444, "按客戶自定义,global handlerException----2");}
}

        在 RateLimitController 中创建一个测试方法,其中 blockHandlerClass 属性指定了兜底方法的类,blockHandler 属性指定了兜底的方法,代码如下:

    @GetMapping("/rateLimit/customerBlockHandler")@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handlerException2")public CommonResult customerBlockHandler(){return new CommonResult(200,"按客戶自定义",new Payment(2020L,"serial003"));}

        打开 sentinel 的管理界面,配置对应的限流规则,如下:

         输入 http://localhost:8401/rateLimit/customerBlockHandler,进行测试,当 1s 访问一次时,效果如下:

        当频繁点击时效果如下,出现的是我们自定义的限流返回消息,达到了我们的效果。

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

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

相关文章

解析《天道》中丁元英的五步商业运作思路

我国商战题材的电视剧中哪部最为经典?小马识途营销顾问认为那一定是《天道》,《天道》对人物的刻画非常精准,对人性的描写鞭辟入里,看过之后都会被其震撼,因此它不仅是一部电视剧,更是一部可以给人们带来商…

Databend 开源周报第 138 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持多表插入 …

位运算-201. 数字范围按位与,137. 只出现一次的数字 II(总结此类)

给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。 示例 1: 输入:left 5, right 7 输出:4 示例 2: 输入&…

鸿蒙ArkUI开发实战:制作一个【简单计数器】

构建第一个页面 使用文本组件 工程同步完成后,在 Project 窗口,点击 entry > src > main > ets > pages ,打开 Index.ets 文件,可以看到页面由 Row 、 Column 、 Text 组件组成。 index.ets 文件的示例如下&#xff1…

基于java+springboot+vue实现的健身房管理系统(文末源码+Lw)23-223

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装健身房管理系统软件来发挥其高效地信息处理的作用&#xf…

测开面经(pytest测试案例,接口断言,多并发断言)

pytest对用户登录接口进行自动化脚本设计 a. 创建一个名为"test_login.py"的测试文件,编写以下测试脚本 import pytest import requests# 测试用例1:验证登录成功的情况 # 第一个测试用例验证登录成功的情况,发送有效的用户名和密…

戴维贝拉×实在智能丨RPA助力商家线上线下一体化运营,关键指标可随时查看!

戴维贝拉(dave&bella)创立于2011年,是杭州日冠服饰有限公司旗下婴幼服饰品牌,至今已立足服装业10余年。2012年,戴维贝拉就已经成为电商销售国内前十的品牌。2021年双十一,戴维贝拉再次以傲人的战绩稳居…

如何实现无感刷新(附前后端实现)?

无感刷新的核心思路: 无感刷新机制的目的是在用户不知情的情况下,自动更新其认证令牌(通常是Access Token),以保证用户的会话不会中断。这通常涉及到两种类型的令牌: Access Token:它是用户进行…

鲁大师2024年手机Q1季报:骁龙天玑高端博弈,AI已成不可逆的大趋势

其实能够很明显的感觉到,2024年的智能手机Q1市场,恢复了近几年少有的那种激情和热闹,AI的到来,让疲于奔命在性能、影像、系统、生态之外的手机厂商们终于看到了新的发展方向。 当然,作为近几年少有的,真正能…

JAVAEE——文件IO

文章目录 文件的概念什么是文件?树型结构组织 和 目录文件路径相对路径绝对路径 文件的分类文件的权限 文件读写IO API字符流操作API 警告字节流操作APIInputStreamOutputStream 文件的概念 什么是文件? 我们先来理解一下什么是文件,那么想…

软件安全评估之设计评审入门(上)

壹 基础概念 在软件开发生命周期(Software Development Life Cycle,简称SDLC)中,设计评审(Design Review)是一个关键的阶段,旨在确保软件设计满足项目需求和目标,并且能够高效、可靠…

01 _ 分布式缘何而起:从单兵,到游击队,到集团军

这里先来聊聊什么是分布式。 与其直接用些抽象、晦涩的技术名词去给分布式下一个定义,还不如从理解分布式的发展驱动因素开始,我们一起去探寻它的本质,自然而然地也就清楚它的定义了。 这里将介绍分布式的起源,是如何从单台计算…

聚道云连接器打通红圈CRM和金蝶云星辰,赋能环境科技公司数字化转型

一、客户介绍 某环境科技有限公司是一家专注于环保科技领域的领先企业,致力于为客户提供全方位的环境解决方案。公司拥有一支经验丰富、技术精湛的团队,不断推动环保技术的创新与应用。作为业内的佼佼者,该公司在环境治理、资源回收和节能减…

深度学习理论基础(四)Parser命令行参数模块

学习目录: 深度学习理论基础(一)Python及Torch基础篇 深度学习理论基础(二)深度神经网络DNN 深度学习理论基础(三)封装数据集及手写数字识别 深度学习理论基础(四)Parse…

Datax,hbase与mysql数据相互同步

参考文章:datax mysql 和hbase的 相互导入 目录 0、软件版本说明 1、hbase数据同步至mysql 1.1、hbase数据 1.2、mysql数据 1.3、json脚本(hbase2mysql.json) 1.4、同步成功日志 2、mysql数据同步至hbase 1.1、hbase数据 1.2、mysql…

SpringBoot快速入门笔记(5)

文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架,安装 npm i element-ui -S 建议查看官方文档 Element组件,这里是Vue2搭配elementUI,如果是vue3就搭配elementPlus,这里初学就以Vue2为例子…

docker基础学习指令

文章目录 [toc] docker基础常用指令一、docker 基础命令二、docker 镜像命令1. docker images2. docker search3. docker pull4. docker system df5. docker rmi1. Commit 命令 三、 docker 容器命令1. docker run2. docker logs3. docker top4. docker inspect5. docker cp6. …

合并主分支到子分支

参考:【Git】合并分支出现 Please enter a commit message to explain why this merge is necessary.-CSDN博客 git 如何将主分支(master)合并到子分支上_git 将主分支合并到子分支-CSDN博客 1、先切换到主分支master git checkout master 2、把主分支代码拉到本地…

RankCSE

前置知识复习 https://www.cnblogs.com/Allen-rg/p/13958508.htmlword2vec详解:https://zhuanlan.zhihu.com/p/114538417 Word2Vec和GloVe都是用于将词与向量相关联的流行词嵌入模型。 相同点: 目标:Word2Vec和GloVe的共同目标是将词汇映射…

Windows/Jerry

Jerry Enumeration nmap 扫描系统发现对外开放了 8080 端口,再次使用 nmap 扫描端口详细信息,发现运行着 Apache Tomcat ┌──(kali㉿kali)-[~/vegetable/HTB/Jerry] └─$ nmap -sV -sC -p 8080 -oA nmap 10.10.10.95 -Pn Starting Nmap 7.93 ( htt…