前言:
如果不知道如何配置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的具体代码详见我之前的文章:
(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、配置流控规则
3、测试
先访问一次byResource,正常访问。
然后疯狂刷新,出现限流。
这是正常的现象,我们在前文中已经见过,这里有传送门,忘记的可以复习一下:
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来限流,所以资源名前面要记得加上/
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、配置流控规则
4、测试
先访问一次 http://localhost:8401/rateLimit/customerBlockHandler
能够正常显示。
然后疯狂刷新
可以看到,显示的是我们自定义的限流处理规则,并且是我们指定的方法。
5、说明
五、更多注解属性
另外,sentinel还提供了三个核心api,除了用注解方式配置之外,还可以用代码来配置,但是并不推荐。