- 一、@SentinelResource全属性解析
- value
- entryType
- blockHandler
- blockHandlerClass
- fallback
- fallbackClass
- defaultFallback(since 1.6.0)
- exceptionsToIgnore(since 1.6.0)
- 二、流控实践
- 1.基于资源名称限流
- 写测试代码
- 控制面板配置
- 测试异常发生
- 出现问题
- 2.基于URL资源名称限流
- 写测试代码
- 控制面板配置
- 测试异常发生
- 出现问题
- 3.用户自定义限流处理
- 1.概述
- 2.实践
- 3.测试
- 三、熔断降级实践
- 1.概述
- 2.实践
- java代码如下
- 控制台配置如下
- 测试
上面提到该注解可以监控一个方法,不管是Controller还是service中的都可以。 一、@SentinelResource全属性解析
valueentryType
- 资源名称,必需项,因为需要通过resource name找到对应的规则,这个是必须配置的。
blockHandler
- entry 类型,可选项。有IN和OUT两个选项,默认为 EntryType.OUT。
blockHandlerClass
- blockHandler 对应处理 BlockException 的函数名称,可选项。
blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,
参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。fallback
- blockHandler 函数默认需要和原方法在同一个类中,如果希望使用其他类的函数,则需要指定blockHandlerClass 为对应的类的 Class 对象。注意对应的函数必需为** static 函数**,否则无法解析。
fallbackClass
- fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。
fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。defaultFallback(since 1.6.0)
- fallbackClass的应用和blockHandlerClass类似,fallback 函数默认需要和原方法在同一个类中。
若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。exceptionsToIgnore(since 1.6.0)
- 如果没有配置defaultFallback方法,默认都会走到这里来。
默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑。
默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。
- 用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
看了一大片文字,头是不是要zha掉了,现在要想把知识变少,就要分类处理。
之前说过,sentinel的主要作用用于流量控制,熔断降级。上面的属性就是为了实现这两个功能才有的。
-
流量控制:blockHandlerClass+blockHandler,指定流量达到阈值后触发哪个类(blockHandlerClass)的哪个方法(blockHandler)
-
熔断降级:fallbackClass+fallback,指java代码出现异常时触发哪个失败类(fallbackClass指定)的哪个方法(fallback指定)。其中defaultFallback指定默认的方法,exceptionsToIgnore忽略哪个异常不处理。
注意上面指定的方法需要是static静态方法。下面我们开始实战,等实践完,相信你会更透彻。
概述:下面的基于资源名称限流和基于URL名称限流,只是铺垫,让大家明白有这两种配置。用户自定义限流处理才是重点,项目中主要用它实现流量控制
1.基于资源名称限流 写测试代码@RestController
public class SentinelTestController {
@GetMapping("/byResource")
@SentinelResource(value = "byResource",blockHandler = "handleException")
public String byResource(){
return "按照资源名称限流测试ok";
}
//达到阈值走该方法
public String handleException(BlockException e){
return e.getClass().getCanonicalName()+"服务不可用";
}
}
控制面板配置点击簇点链路,资源名称流控。注意控制面板的资源名和代码哪块部分对应,这个一定要理解,如下图
配置QPS为1
com.alibaba.csp.sentinel.slots.block.flow.FlowException服务不可用
如果服务宕掉,流控规则也会消失
@GetMapping("/byResource")
@SentinelResource(value = "byResource")
public String byUrl(){
return "按照url名称限流测试ok";
}
控制面板配置
测试异常发生
Blocked by Sentinel (flow limiting),即使配了blockHandler也不会走异常方法
上面两者不具有灵活性,下面开始讲用户自定义配置
前面是铺垫,下面是重点。因为上面两种方式都不能和业务系统很好的整合。于是使用用户自定义的限流处理,大致分为两个步骤。
1.自定义限流处理类,处理类返回值进行统一。一般前后端分离架构中都有一个统一返回的类型
2.使用@SentinelResource注解中blockHandlerClass和blockHandler属性标识哪个类中的哪个方法处理流控逻辑
- blockHandlerClass:指定哪个自定义类
- blockHandler:哪个类的哪个方法处理流控逻辑
下面将代码和sentinel控制台的簇点链路做一下对应。其中CustomerBlockHandler类中可以定义多个方法。
流控规则就是QPS阈值是1
浏览器输入地址http://localhost:8090/self/test ,一直请求触发handleException方法返回com.alibaba.csp.sentinel.slots.block.flow.FlowException服务不可用
三、熔断降级实践 1.概述
从代码的角度再来说下限流和熔断降级的区别
- 限流:当对资源的请求数超过阈值时,会触发限流效果。触发限流后会走blockHandlerClass+blockHandler共同指定的方法逻辑。
- 熔断降级:当一个微服务发生异常,注意是java代码的异常,会触发熔断效果。触发熔断后会走fallbackClass+fallback共同指定的方法逻辑。
单个的熔断的实验就不做了,模仿着限流的步骤就可以做出来。现在将限流和熔断整合到一起
1.测试限流,不触发熔断 url:http://localhost:8090/self/test/1 结果:com.alibaba.csp.sentinel.slots.block.flow.FlowException服务已被限流 2.测试熔断,不触发限流 url:http://localhost:8090/self/test/0 结果:java.lang.RuntimeException服务已被熔断 3.既触发熔断,又触发限流 url:url:http://localhost:8090/self/test/0 结果:com.alibaba.csp.sentinel.slots.block.flow.FlowException服务已被限流
证明熔断和限流同时存在时,只会被限流降级,进行blockHandler指定的方法处理逻辑



