Sentinel 降级规则模块
流控是对外部来的⼤流量进⾏控制,熔断降级的视⻆是对内部问题进⾏处理。
Sentinel 降级会在调⽤链路中某个资源出现不稳定状态时(例如调⽤超时或异常⽐
例升⾼),对这个资源的调⽤进⾏限制,让请求快速失败,避免影响到其它的资源
⽽导致级联错误。当资源被降级后,在接下来的降级时间窗⼝之内,对该资源的调
⽤都⾃动熔断。
Sentinel不会像Hystrix那样放过⼀个请求尝试⾃我修复,就是明明确确按照时间窗
⼝来,熔断触发后,时间窗⼝内拒绝请求,时间窗⼝后就恢复。
RT
平均响应时间
当 1s 内持续进⼊ >=5 个请求,平均响应时间超过阈值(以 ms 为单位),那么在接下的时间窗⼝(以 s 为单位)之内,对这个⽅法的调⽤都会⾃动地熔断(抛出 DegradeException)。
注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -
Dcsp.sentinel.statistic.max.rt=xxx 来配置。
配置一下简单测试
@GetMapping("/api/tests")
public String viewconfig(String str) {
int i = new Random(System.currentTimeMillis()).nextInt(5);
try {
Thread.sleep(i*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return str +" : tests " + LocalDateTime.now();
}
正常请求
熔断后,等待5s后才能正常请求
这里我处理了熔断请求返回信息
//熔断后限流提示
@ExceptionHandler(BlockException.class)
@ResponseBody
public String DegradeException(BlockException e) {
AbstractRule rule = e.getRule();
logger.info("Blocked by Sentinel: {}", rule.toString());
return "{\"msg\":\"请求繁忙,请稍后再试!\",\"code\":401}";
}
当然如果再请求时候,当然也会触发限流策略
异常⽐例
当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的⽐值超过阈值之后,
资源进⼊降级状态,即在接下的时间窗⼝(以 s 为单位)之内,对这个⽅法的调
⽤都会⾃动地返回。异常⽐率的阈值范围是 [0.0, 1.0] ,代表 0% - 100%。
同样的会熔断
异常数
和异常比例几乎一致,只是这个侧重数量。
当资源近 1 分钟的异常数⽬超过阈值之后会进⾏熔断。注意由于统计时间窗⼝
是分钟级别的,若 timeWindow ⼩于 60s,则结束熔断状态后仍可能再进⼊熔
断状态。
时间窗⼝ >= 60s
Sentinel ⾃定义兜底逻辑
@SentinelResource注解类似于Hystrix中的@HystrixCommand注解
@SentinelResource注解中有两个属性需要我们进⾏区分,blockHandler属性⽤来指定不满⾜Sentinel规则的降级兜底⽅法,fallback属性⽤于指定Java运⾏时异常兜底⽅法
指定方法内熔断
@RestController
@RequestMapping("/api")
public class Test3Controller {
//异常熔断测试
@GetMapping("/tests3")
@SentinelResource(value = "tests3",blockHandler = "blockHandlerVoid")
public String tests3(String str) {
int i = 1/0;
return str +" : tests " + LocalDateTime.now();
}
public String blockHandlerVoid(String str, BlockException e){
return "blockHandlerVoid...";
}
}
先请求,再sentinel控制台中设置
可以看到我们定义的请求名
设置熔断
请求测试,自定义返回的熔断信息
抽出类
代码中默认会抛出异常,但是我们自定义了异常处理,所以请求会处理异常
同理,请求名
设置规则
请求测试熔断返回
fegin调用降级
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
main方法开启fegin
@EnableFeignClients
测试接口
@GetMapping("/api/feginTest2")
public String feginTest2(String str) {
return feginTest.getConfig() + " : " + LocalDateTime.now();
}
服务
@FeignClient(value = "nacos-config-8098",
fallback = ResumeFallback.class,
path = "/config")
public interface FeginTest {
@RequestMapping(value = "/viewconfig",method= RequestMethod.GET)
String getConfig();
}
FeginTest接口降级策略
@Component // 别忘了这个注解,还应该被扫描到
public class ResumeFallback implements FeginTest {
@Override
public String getConfig() {
return "getConfig 降级...";
}
}
nacos-config-8098我们暂时不启动,直接调用
可以看到降级
当然我们正确请求我们的配置服务,如下
最后
介绍了Sentinel 的降级,熔断配置和使用
以及介绍了配合fegin 使用是如何降级的。