熔断和限流-Sentinel
文章目录
一、Sentinel简介
Sentinel 是面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。
二、Sentinel使用
保护REST端点
1、引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、整合控制台
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8010
3、在控制台进行规则调整即可
控制台界面以及控制规则详解
1、控制台信息
2、簇点链路视图
3、流控规则
默认QPS(每秒请求数)到达指定阈值直接快速失败
阈值类型
线程数和QPS的区别:
线程数是指工作线程的数量若请求数超过工作线程数量则限流
QPS是指外部请求进入系统的最大数量
流控模式
直接:直接反应流控效果(测试略)
关联:当关联的资源达到设定阈值则限流自己(测试如下)
压力测试结果:
链路:
流控效果
直接失败:直接返回调用失败的结果
预热:从设置的阈值/冷加载因子(默认3)开始 经过设置的预热时长后逐渐到达阈值
排队等待:将请求排队
4、降级规则
熔断策略:
慢调用比例:(请求数每秒大于等于5)检查请求返回慢的请求所占比例 到达阈值或者超过最大RT时间则熔断指定时长
异常比例:(请求数每秒大于等于5)异常比例到达阈值则熔断指定时长
异常数:(近一分钟内异常数)异常数到达阈值熔断指定时长
SentinelResource注解的使用(保护资源)
按照资源名称限流
1、点击流控规则可以发现有一栏资源名
2、在资源名称中输入相应的资源id 之后在控制台配置规则即可
@GetMapping("/{id}")
@SentinelResource(value = "id",fallback = "block")
public String consummer(@PathVariable("id") String id){
return providerFeignClient.getService(id);
}
@SentinelResource注解的属性(class属性与普通属性混用指定处理方法)
属性名 | 作用 |
---|---|
value | 资源名称 |
fallback | 出现异常降级后执行的本地方法 |
blockHandler | 被限流后默认执行的本地方法 |
fallbackClass | 出现异常降级后进行处理的类 |
blockHandlerClass | 被限流后进行处理的类 |
Sentinel熔断FeignClient
1、开启配置FeignClient支持Sentinel
feign:
sentinel:
enabled: true
2、创建FeignClient接口实现类(记得添加注解@Component)
@Component
public class ProviderImpl implements ProviderFeignClient {
@Override
public String getService(String id) {
return "本地调用";
}
}
3、设置@FeignClient注解的fallback属性
@FeignClient(value = "cloud-provider",fallback = ProviderImpl.class)
public interface ProviderFeignClient {
@GetMapping("/provider/{id}")
public String getService(@PathVariable("id") String id);
}
注意:熔断feign的作用是在无法进行远程调用的时候进行断路,返回正常结果,如果不处理限流还是会出现报错。