快捷搜索:

Sentinel 简单使用

Sentinel

熔断降级: 削峰填谷,集群流量控制,熔断 实时监控: 控制台,看到接入单台机器秒级数据 SPI扩展点: 简单易用,SPI扩展接口,快速制定逻辑,规则

Docker 安装客户端

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

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

访问地址

账户密码: sentinel

熔断降级

服务之间调用时,调用路径中某一个资源出现了不稳定或者不可用,最终会导致请求发生积压,熔断降级,是为了解决这样的问题。 熔断降级: 当请求时间过长,或者异常比例提升,则对这个资源的请求做限制,让请求快速失败,等避免其他的业务受到影响,造成服务雪崩

@SentinelResource 属性 ‼️

注解方式 不支持 private 方法
属性 描述 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();
    }

流控规则

选项 说明 资源名 唯一名称,默认请求路径 阈值类型/单机阈值 QPS:(每秒请求数量):当调用该api的 QPS 达到阈值的时候,进行限流 线程数:当调用该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);
    }
}

流控规则 FlowRule

属性 说明 resource 资源名,资源名是限流规则的作用对象 grade 限流阈值类型,QPS模式(1) 或并发先线程模式(0) count 限流阈值 strategy 调用关系限流策略:直接、链路、关联 controlBehavior 流量控制效果(直接拒绝、Warm Up、匀速排队) clusterMode 是否集群限流
同一个资源有多个限流规则,检测时会依次检测

降级规则

资源被降级后,默认行为抛出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);
    }

动态扩展

通过java代码设置,或者通过控制台手动设置,实际使用中并不方便。 Sentinel的DataSoure接口提供了对接任意数据源的能力。 将规则推送到规则中心,客户端实现 ReadableDataSource接口监听注册中心来实现获取规则变更

底部

经验分享 程序员 职场和发展