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


相关文章
|
1月前
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
57 3
|
5天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
|
22天前
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
57 0
|
1月前
|
Java API 数据格式
Spring三兄弟:Spring、Spring Boot、Spring Cloud的100个常用注解大盘点
Spring三兄弟:Spring、Spring Boot、Spring Cloud的100个常用注解大盘点
|
1月前
|
Java 开发者 Sentinel
Spring Cloud系列——使用Sentinel进行微服务保护
Spring Cloud系列——使用Sentinel进行微服务保护
36 5
|
15天前
|
Java 微服务 Spring
【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别
【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别
|
1月前
|
监控 Java API
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
36 0
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
|
1月前
|
自然语言处理 监控 开发者
springCloud之Sentinel流量路由、流量控制、流量整形、熔断降级
springCloud之Sentinel流量路由、流量控制、流量整形、熔断降级
22 0
|
1月前
|
存储 SpringCloudAlibaba 关系型数据库
springcloud alibaba(5)
springcloud alibaba
105 0
|
1月前
|
SpringCloudAlibaba Nacos
springcloud alibaba(4)
springcloud alibaba
132 0

热门文章

最新文章