SpringCloud Alibaba学习(九):Sentinel的@SentinelResource注解详解

简介: SpringCloud Alibaba学习(九):Sentinel的@SentinelResource注解详解

前言:

 

如果不知道如何配置sentinel或者不知道如何打开文章中的一些网页,可以参考我前面的文章:     SpringCloud Alibaba学习(五):Sentinel的介绍与搭建


有关流控规则的讲解与实战:SpringCloud Alibaba学习(六):Sentinel的流控规则


有关降级规则的讲解与实战:SpringCloud Alibaba学习(七):Sentinel的降级规则


有关热点规则的讲解与实战:SpringCloud Alibaba学习(八):Sentinel的热点规则  


一、按资源名称限流+后续处理



1、修改8401


(1)在pom中增加自己之前写过的的工具api

<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>com.shang.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


api的具体代码详见我之前的文章:

     

SpringCloud学习(三):工程重构


(2) 新建一个业务类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 服务不可用");
    }
}


代码也很简单,一个简单的方法和兜底方法。


2、配置流控规则


7db7ebc56fc641b8b5c229ef0c1ca399.png


3、测试

     

先访问一次byResource,正常访问。


3113c9158b8f4b87aceb26e2343a3cdd.png


然后疯狂刷新,出现限流。

3190eb874f8f41d1a29feed24ff30335.png

这是正常的现象,我们在前文中已经见过,这里有传送门,忘记的可以复习一下:


SpringCloud Alibaba学习(六):Sentinel的流控规则


二、按照Url地址限流+后续处理


       

通过访问的URL来限流,会返回Sentinel自带默认的限流处理信息


1、修改8401

     

在controller类中再增加一个方法

@GetMapping("/rateLimit/byUrl")
    @SentinelResource(value = "byUrl")
    public CommonResult byUrl()
    {
        return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002"));
    }


由于没有指定blockedHandler,就会使用系统默认的降级提示。


2、配置方法

     

由于我们是通过URL来限流,所以资源名前面要记得加上/


e8e5145eb95949e29aaa6863c3fe6583.png


3、测试

     

疯狂点击后,出现了降级。


三、上面的兜底方法面临的问题



 1 、 显示的提示为系统默认的,没有体现我们自己的业务要求;

     

2 、 如果自定义提示,那么自定义的处理方法又和业务代码耦合在一块,不直观;

     

3 、 每个业务方法都添加一个兜底方法,那么会导致代码膨胀加剧;

     

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


这些问题在我们学习Hystrix时就已经提出并解决过,可以参考我之前的文章:


SpringCloud学习(十三):Hystrix的服务降级实现


下面我们来看一下sentinel如何解决这些问题。


四、客户自定义限流处理逻辑

 



1、创建CustomerBlockHandler类用于自定义限流处理逻辑


这是一个全局的限流处理方法,我将它写在myhandler包下。

public class CustomerBlockHandler {
    //写多个方法,我们希望能够自主选择其中一个方法进行处理
    public static CommonResult handlerException(BlockException exception){
        return new CommonResult(4444, "按用户自定义处理global CustomerBlockHandler------1");
    }
    public static CommonResult handlerException2(BlockException exception){
        return new CommonResult(4444, "按用户自定义处理global CustomerBlockHandler------2");
    }
}


2、自定义限流处理逻辑

     

写在RateLimitController类中

@GetMapping("/rateLimit/customerBlockHandler")
    @SentinelResource(value = "customerBlockHandler",
                        blockHandlerClass = CustomerBlockHandler.class,     //兜底方法的类
                        blockHandler = "handlerException2"      //具体调用该类中的哪个兜底方法
                    )
    public CommonResult customerBlockHandler(){
        return new CommonResult(200,"按用户自定义",new Payment(2020L,"serial003"));
    }


3、配置流控规则

3bc5cb4f9ee54461954f6444bc608341.png


4、测试

     

先访问一次        http://localhost:8401/rateLimit/customerBlockHandler

ec80abc30e844e5c8fce6aa6672d01ff.png


能够正常显示。

     

然后疯狂刷新

03409fc8d61f46419b7ba5de74fd27c0.png

可以看到,显示的是我们自定义的限流处理规则,并且是我们指定的方法。


5、说明

11c1111228a74d2099ce1c4019edef2b.png


五、更多注解属性



f67eeaf76f194c849a35c4c2353384d0.png


另外,sentinel还提供了三个核心api,除了用注解方式配置之外,还可以用代码来配置,但是并不推荐。


目录
打赏
0
0
0
0
178
分享
相关文章
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
288 1
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
252 4
【SpringCloud Alibaba系列】Dubbo高级特性篇
本章我们介绍Dubbo的常用高级特性,包括序列化、地址缓存、超时与重试机制、多版本、负载均衡。集群容错、服务降级等。
【SpringCloud Alibaba系列】Dubbo高级特性篇
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
本文介绍了 Dubbo-Admin 的安装和使用步骤。Dubbo-Admin 是一个前后端分离的项目,前端基于 Vue,后端基于 Spring Boot。安装前需确保开发环境(Windows 10)已安装 JDK、Maven 和 Node.js,并在 Linux CentOS 7 上部署 Zookeeper 作为注册中心。
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
【SpringCloud Alibaba系列】Dubbo基础入门篇
Dubbo是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
【SpringCloud Alibaba系列】Dubbo基础入门篇
|
3月前
|
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
756 13
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
557 7
Sentinel学习圣经:从入门到精通 Sentinel,最全详解 (40+图文全面总结)
尼恩给大家做一下系统化、体系化的梳理,联合社群小伙伴,来一个Sentinel学习圣经:从入门到精通Sentinel。