zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

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

2023-03-14 22:49:31 时间

前言:

 

如果不知道如何配置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()+"	 服务不可用");
    }
}


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


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