Sentinel 简单使用

2022年05月13日 阅读数:8
这篇文章主要向大家介绍Sentinel 简单使用,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Sentinel

熔断降级: 削峰填谷,集群流量控制,熔断java

实时监控: 控制台,看到接入单台机器秒级数据git

SPI扩展点: 简单易用,SPI扩展接口,快速制定逻辑,规则github

官网官网中文官中控制台 web

image-20220509135643409

Docker 安装客户端

# 拉取镜像
docker pull bladex/sentinel-dashboard

# 运行实例
docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard

访问地址http://localhost:8858docker

帐户密码: sentinelapi

熔断降级

服务之间调用时,调用路径中某一个资源出现了不稳定或者不可用,最终会致使请求发生积压,熔断降级,是为了解决这样的问题。bash

熔断降级: 当请求时间过长,或者异常比例提高,则对这个资源的请求作限制,让请求快速失败,等避免其余的业务受到影响,形成服务雪崩并发

image-20220509141351204

@SentinelResource 属性 ‼️

注解方式 不支持 private 方法app

属性 描述
value 资源名称(必填)
entryType 资源调用方向,可选项(默认EntryType.OUT)
resourceType 资源分类
blockHandler 对应处理 BlockException 的方法(方法须要 public)
blockHandlerClass 处理Class对象,方法必须为 static
fallbackClass 抛出异常的时候 提供 fallback处理逻辑
execptionsToTrace 异常类跟踪列表(默认为 Throwable.class)
execptionsTolgnore 排除掉的异常类型(指定异常 不会进入异常统计,和fallback逻辑,只是原样抛出)
fallback 用于抛出异常的时候提供 fallback处理
    /*
    value : 资源名
    blockHandler 限流处理方法
     */
    @SentinelResource(value = TEST, blockHandler = "methodA",fallback ="methodB" )
    @GetMapping("annotation")
    public String hello(){
   
   
        return "注解方式";
    }

    /*
    方法被限流时,调用此方法
    参数须要与 原方法参数一致
     */
    public String methodA(BlockedException e) {
   
   
        e.printStackTrace();
        return "注解方式限流!";
    }

    /*
        服务熔断降级处理,参数与原方法同样,最多 最后 加一个 Throwable 参数
     */
    public String methodB(Throwable e) {
   
   
        System.out.println( e.getMessage());
        return " 服务被熔断处理=="+ e.getMessage();
    }

流控规则

image-20220510133347569

选项 说明
资源名 惟一名称,默认请求路径
针对来源 Sentinel能够针对调用者进行限流,填写微服务名称,默认default(不区分来源)
阈值类型/单机阈值 QPS:(每秒请求数量):当调用该api的 QPS 达到阈值的时候,进行限流
线程数:当调用该api 的线程达到阈值的时候,进行限流
是否集群 不须要集群
流控模式 直接: api达到限流条件时,直接限流
关联: 当关联的资源达到限流阈值时,就限流本身
链路: 只记录自定链路上的流量(指定资源从入口资源进来的流量,若是达到峰值,就进行限流)【API级别针对来源】
流控效果 快速失败:直接失败,抛异常
Warm Up: 根据coldFactor(冷加载因子,默认3)的值,从阈值/coldFactor,通过预热时长才达到设置的QPS阈值
排队等待: 匀速排队,让请求以匀速经过,阈值类型必须设置为QPS,不然无效

代码设置 流控规则

    /**
     * 当前类的构造函数执行以后执行此方法
     */
    @PostConstruct
    public void initFlowRules() {
   
   
        // 建立存放流控规则的集合
        List<FlowRule> rules = new ArrayList<>();
        // 建立流控规则
        FlowRule rule = new FlowRule();
        // 定义资源,表示Sentinel会对哪一个资源生效
        rule.setResource(HELLO);
        // 定义流控规则的类型
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 定义QPS每秒能经过的请求数
        rule.setCount(2);
        // 将流控规则存放在集合中
        rules.add(rule);
        // 加载流控规则
        FlowRuleManager.loadRules(rules);
    }
}

image-20220510134637411

流控规则 FlowRulesvg

属性 说明
resource 资源名,资源名是限流规则的做用对象
limitApp 流控针对的调用来源,若为default则不区分调用来源
grade 限流阈值类型,QPS模式(1)
或并发先线程模式(0)
count 限流阈值
strategy 调用关系限流策略:直接、链路、关联
controlBehavior 流量控制效果(直接拒绝、Warm Up、匀速排队)
clusterMode 是否集群限流

同一个资源有多个限流规则,检测时会依次检测

降级规则

image-20220510161439441

资源被降级后,默认行为抛出DegradeException

同一个资源能够有多个降级规则

熔断策略

  • 慢调用比例(SLOW_REQUEST_RATIO):选择慢调用比例做为阈值,须要设置 RT(最大响应时间),请求的响应时间大于,最大响应时间,统计为慢调用,单位统计时长(statlntervalMs)内请求数目大于设置的最小请求数目,而且慢调用比例大于阈值,则接下来的熔断时长内请求会自动熔断,通过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求响应时间小于设置慢调用RT则结束熔断,若大于RT则再次熔断。
  • 异常比例(ERROR_RATIO):当单位统计时长(statlntervalMs)内请求数目大于设置的最小请求数目,而且异常的比例大于阈值,则接下来熔断时长内请求会自动被熔断。通过熔断时长后熔断器会进入探测恢复状态(HALF_OPEN状态),若接下来的一个请求成功完成(没有错误)则结束熔断,不然再次被熔断。异常比率的阈值范围是[0.0,1.0]表明0%-100%。
  • 异常数(ERROR_COUNT): 当单位统计时长内的异常数目超过阈值后会自动进行熔断。进过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求成功完成(没有错误),则结束熔断,不然再次被熔断。

异常降级仅针对业务异常,对Sentinel限流降级自己(BlockException) 不生效

DegradeRule 属性

属性 说明
resource 资源名,即规则的做用对象
grade 熔断策略,支持慢调用比例/异常比例/异常策略(默认 慢调用比例)
count 设置 RT 值
timeWindow 熔断时长,单位 s
minRequestAmount 熔断出触最小请求数,请求数小该值时即便用异常比率超出阈值也不会熔断(1.7.0引入 默认是 5)
statIntervalMs 统计时长(单位ms),如60*1000(1.8.0 引入 默认是1000ms)
slowRatioThreshold 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

代码

 // 生成 熔断降级规则
    @PostConstruct
    public void initDegradeRules() {
   
   
        //存放熔断降级规则的集合
        ArrayList<DegradeRule> rules = new ArrayList<>();
        // 建立规则
        DegradeRule rule = new DegradeRule();
        // 规则名
        rule.setResource("degradeDemo");
        // 降级类型
        rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
        // 定义降级熔断时间 单位 s
        rule.setTimeWindow(5);
        // 定义慢调用临 界RT(超出该值记为慢调用 单位s)
        rule.setCount(0.005);
        // 定义熔断出大最小请求数
        rule.setMinRequestAmount(1);
        // 定义统计时长 单位s
        rule.setStatIntervalMs(1000);
        // 定义慢调用比例阔值
        rule.setSlowRatioThreshold(0.5);

        //加入 规则
        rules.add(rule);
        DegradeRuleManager.loadRules(rules);
    }

image-20220510181600214

动态扩展

经过java代码设置,或者经过控制台手动设置,实际使用中并不方便。

Sentinel的DataSoure接口提供了对接任意数据源的能力。官网说明

将规则推送到规则中心,客户端实现 ReadableDataSource接口监听注册中心来实现获取规则变动

底部