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,除了用注解方式配置之外,还可以用代码来配置,但是并不推荐。


相关文章
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
122 1
|
1月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
122 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
19天前
|
算法 Java API
Sentinel学习圣经:从入门到精通 Sentinel,最全详解 (40+图文全面总结)
尼恩给大家做一下系统化、体系化的梳理,联合社群小伙伴,来一个Sentinel学习圣经:从入门到精通Sentinel。
|
22天前
|
消息中间件 自然语言处理 Java
知识科普:Spring Cloud Alibaba基本介绍
知识科普:Spring Cloud Alibaba基本介绍
55 2
|
30天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
80 0
|
3月前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
1323 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
3月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
3月前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
67 0