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


相关文章
|
4月前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
101 1
|
6月前
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
170 3
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
3月前
|
监控 Java Nacos
SpringCloud基础5——微服务保护、Sentinel
sentinel、雪崩问题、流量控制、隔离和降级、授权规则、规则持久化
SpringCloud基础5——微服务保护、Sentinel
|
5月前
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
256 0
|
6月前
|
JSON Java 程序员
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(2)
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(2)
63 3
|
6月前
|
程序员 测试技术 Docker
黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day3 全网最全
黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day3 全网最全(1)
464 1
|
6月前
|
SQL Java 程序员
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(1)
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(1)
240 1
|
5月前
|
监控 Dubbo 应用服务中间件
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
55 0