SpringCloudAlibaba(十)——sentinel组件的熔断降级和热点规则
作者:互联网
熔断降级规则简介
熔断:用来避免微服务架构中雪崩现象,达到某个阈值条件之后自动出发熔断
原理:当监控到调用链路中某一个服务,出现异常(20个以上异常)自动出发熔断,在出发熔断之后对于该微服务调用不可用
熔断降级规则的使用
RT:根据请求响应时间熔断
异常比例:根据请求调用过程中出现异常百分比进行熔断
异常数:根据请求调用过程中异常数进行熔断
平均响应时间
当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。
异常比例
当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%
异常数
当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。
热点参数限流规则使用
热点:经常访问的数据称之为热点
热点限流:也称之为热点参数限流,日后访问资源中携带了指定参数进行限流
@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource 注解包含以下属性:
- value:资源名称,必需项(不能为空)
- entryType:entry 类型,可选项(默认为 EntryType.OUT)
- blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
- fallback / fallbackClass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
- fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 --fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
- defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
- defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
- exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
注意:使用热点参数限流时,不能使用资源路径,必须使用资源别名,sentinel提供资源别名注解 @SentinelResource(value = "别名")
package com.study.springcloudAlibaba.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@RequestMapping("/demo/{id}")
//blockHandler = "" 使用sentinel进行不同规则控制时的默认处理方案
//fallback = "" 自定义业务出错时默认处理方案
//defaultFallback = "" 指定一个业务错误时默认方案
@SentinelResource(value = "aaa",blockHandler = "blockHandler",fallback = "fallCustomer",defaultFallback = "fall") //作用代表这是一个sentinel资源
public String demo(@PathVariable("id") int id){
if (id<0)throw new RuntimeException("id无效");
return "demo ok!!!id="+id;
}
public String blockHandler(int id, BlockException e){
if (e instanceof FlowException){
return "当前请求过于火爆,您已被流量控制!!!";
}
if (e instanceof DegradeException){
return "当前请求过于火爆,您已被降级!!!";
}
if (e instanceof ParamFlowException){
return "当前请求过于火爆,您已被热点参数限流!!!";
}
return "服务器快爆了,请稍后再试!!!";
}
public String fallCustomer(int id){
return "自定义处理----我们服务器出错了"+id;
}
public String fall(int id){
return "默认处理----我们服务器出错了"+id;
}
@RequestMapping("/test")
public String test(){
return "test ok!!!";
}
}
一、
二、
三、
四、
五、
标签:函数,SpringCloudAlibaba,熔断,sentinel,import,fallback,异常 来源: https://www.cnblogs.com/luoxiao1104/p/15032997.html