菜单
本页目录

流控规则

阈值类型

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或数据库实现持久化存储