流控规则
阈值类型
QBS即每秒请求数采用计数器,比较轻量 并发线程池需要使用线程池 一般使用QBS即可 单机阈值即每秒请求总量,若使用集群模式单机均摊,则指每台机器每秒最多处理,若总体阈值,则集群每秒最多处理
流控模式
直接流控即直接对资源进行控制
链路规则即直针对某一个链路进行限制
@GetMapping("/create")
public Order createOrder(@RequestParam("userId") Long userId,
@RequestParam("productId") Long productId){
Order order = orderService.createOrder(productId, userId);
return order;
}
@GetMapping("/seckill")
@SentinelResource(value = "seckill-order",fallback = "seckillFallback")
public Order seckill(@RequestParam(value = "userId",required = false) Long userId,
@RequestParam(value = "productId",defaultValue = "1000") Long productId){
Order order = orderService.createOrder(productId, userId);
order.setId(Long.MAX_VALUE);
return order;
}
public Order seckillFallback(Long userId,Long productId, Throwable exception){
System.out.println("seckillFallback....");
Order order = new Order();
order.setId(productId);
order.setUserId(userId);
order.setAddress("异常信息:"+exception.getClass());
return order;
}
使用链路规则需要关闭上下文统一,两条链路是两个链路
spring:
cloud:
openfeign:
client:
config:
default:
logger-level: full
connect-timeout: 1000
read-timeout: 2000
service-product:
logger-level: full
connect-timeout: 3000
read-timeout: 5000
sentinel:
transport:
dashboard: localhost:8080
eager: true
# 关闭上下文统一
web-context-unify: false
feign:
sentinel:
enabled: true
即可对来自seckill链路进行限制
关联资源即,当关联的资源压力大的时候,才对本资源限制
即,当写的压力过大的时候,才对读进行限制,正常则不限制
流控效果
快速失败,即超过了阈值,直接拒绝请求,走兜底回调或默认异常处理
Warm Up,即逐步提升处理请求数量,直至阈值
排队等待,以毫秒为单位,即阈值为2,则500毫秒处理一次,未处理的请求排队,若超时才会丢弃
熔断规则
为什么需要熔断降级
断路器工作原理
慢调用比例
最大RT:单位毫秒,响应超过1秒则为慢调用
比例阈值:慢调用比例,超过此比例则熔断
熔断时长:断路器熔断状态时间,超过则转换为半打开状态
最小请求数:样本统计最小数量
统计时长:样本统计时长
当超过了慢调用比例后,则执行兜底方法
异常比例
当被调用方业务出现异常,熔断器进入打开状态
若不配置熔断规则,实际上也会执行兜底方法,两者的区别在于,若配置了熔断规则,请求在断路器打开状态下,不会到达被调用服务
异常数
即直接统计异常的数目,而非比例
热点规则
热点规则实际上就是更精细的流控规则,可以对参数级别进行控制 自适配的资源不支持热点规则,需要使用@SentinelResource指定资源名,且不能和自适配的资源名重复,否则会造成重复统计
//自适配资源名为/seckill
@GetMapping("/seckill")
@SentinelResource(value = "seckill-order",fallback = "seckillFallback")
public Order seckill(@RequestParam(value = "userId",required = false) Long userId,
@RequestParam(value = "productId",defaultValue = "1000") Long productId){
Order order = orderService.createOrder(productId, userId);
order.setId(Long.MAX_VALUE);
return order;
}
public Order seckillFallback(Long userId,Long productId, Throwable exception){
System.out.println("seckillFallback....");
Order order = new Order();
order.setId(productId);
order.setUserId(userId);
order.setAddress("异常信息:"+exception.getClass());
return order;
}
情景
针对限流的参数,若没有携带这个参数,则不限流
@SentinelResource优先走blockHandler,没有则fallback
@SentinelResource指定兜底方法使用blockHandler,可以专门处理被流控的异常BlockException
而使用fallback还可以处理业务异常,但此时的异常需要使用Throwable
如上代码演示
授权规则
即明确谁可以访问我
系统规则
使用容器化平台部署,k8s控制系统资源
Sentinel默认规则存储到内存中,服务重启则消失,可以配合nacos或数据库实现持久化存储