手记

Sentinel不同的流控模式学习简易教程

概述

本文介绍了Sentinel的多种流控模式及其应用场景,重点讲解了如何通过直接流控、链路流控和系统流控来保护服务的高可用性和稳定性。Sentinel支持多种流控模式,每种模式都有其特定的应用场景和优势,通过灵活的规则配置,可以实现对服务的全面保护。了解Sentinel不同的流控模式对于确保系统稳定运行至关重要。

引入Sentinel及其重要性
Sentinel简介

Sentinel 是阿里巴巴开源的一款分布式服务保护框架,它提供了一套完整的实时流量控制、熔断降级、系统自适应保护等功能,能够帮助开发者保障服务的高可用性和稳定性。Sentinel 通过灵活的规则配置和丰富的监控能力,使得服务治理变得更加简单和高效。

Sentinel的作用和应用场景

Sentinel 在现代分布式系统中扮演着关键的角色。通过它可以实现多种保护机制,包括但不限于:

  • 流量控制:限制进入系统的请求量,防止因大量请求导致系统过载。
  • 熔断降级:当调用链路出现异常时,断开调用链路,避免产生大量消耗资源的请求,同时提供备用方案。
  • 系统自适应保护:根据系统负载情况动态调整进入系统的流量,避免系统负载过高导致的服务不可用。
  • 热点参数防护:针对热点参数进行流量控制,避免热点参数导致的系统负载不均衡。
  • API 级别的自动降级:当调用链路的服务级别出现问题时,自动触发降级,降低系统压力。

Sentinel的作用

  • 流量控制:通过限制接口的 QPS(每秒请求数量)来保护服务不被过载。
  • 熔断降级:在服务调用失败率较高时进行熔断,避免链路故障引起雪崩效应。
  • 系统保护:根据服务器的负载情况动态调整流量,防止系统过载。

Sentinel的应用场景

  • 微服务架构:在微服务架构中,Sentinel 可以帮助实现服务间的流量控制和熔断降级。
  • 云原生应用:在云原生环境中,Sentinel 可以实现服务的自动弹性伸缩和保护。
  • 高并发系统:对于高并发系统,Sentinel 可以帮助限制系统的流量,防止系统过载。
流控模式的概念和意义

流量控制(Flow Control)是分布式系统中一个重要的机制,用于限制进入系统的流量,以防止因流量过大导致系统过载。Sentinel 支持多种流控模式,每种模式都有其特定的应用场景和优势。

  • 直接流控:针对特定资源进行流量控制,适用于需要精确控制流量的场景。
  • 链路流控:根据调用链路进行流量控制,适用于服务之间的调用。
  • 系统流控:根据系统负载情况进行流量控制,适用于需要保护整个系统的场景。
了解Sentinel的核心概念
资源和规则的基础知识

在 Sentinel 中,资源代表需要保护的逻辑执行单元,可以是接口、方法或任何业务逻辑。规则定义了如何保护这些资源,包括流量控制规则、异常比例规则、系统保护规则等。

资源的定义

资源是 Sentinel 的基本单位,它可以是一个接口、一个方法或一段业务逻辑。资源可以通过注解或编程方式定义。例如,通过 @SentinelResource 注解定义一个资源:

@SentinelResource(value = "exampleResource")
public String executeExample() {
    // 业务逻辑代码
    return "example";
}

规则的定义

规则定义了如何保护资源,可以通过编程方式或配置文件定义。例如,定义一个流量控制规则:

FlowRule rule = new FlowRule();
rule.setResource("exampleResource");
rule.setCount(10);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setLimitCallback(new FlowCallback() {
    @Override
    public void callback(FlowRule rule, boolean isPass) {
        if (!isPass) {
            System.out.println("请求被限流了");
        }
    }
});
FlowRuleManager.loadRules(Collections.singletonList(rule));
流量控制与异常检测的区别

流量控制和异常检测都是 Sentinel 提供的重要功能,但它们的作用和应用场景有所不同。

  • 流量控制:通过限制进入系统的请求量来保护系统不被过载。流量控制可以基于 QPS(每秒请求数量)、RT(响应时间)等指标来实现。
  • 异常检测:用于检测调用链路中的异常情况,如请求失败率、响应时间过长等。当检测到异常情况时,可以触发熔断降级机制,保护系统不受影响。

流量控制

流量控制旨在限制进入系统的请求量,避免系统过载。例如,可以通过限制某个资源的每秒请求数量(QPS)来保护资源不被过载:

FlowRule rule = new FlowRule();
rule.setResource("exampleResource");
rule.setCount(10);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setLimitCallback(new FlowCallback() {
    @Override
    public void callback(FlowRule rule, boolean isPass) {
        if (!isPass) {
            System.out.println("请求被限流了");
        }
    }
});
FlowRuleManager.loadRules(Collections.singletonList(rule));

异常检测

异常检测用于检测调用链路中的异常情况,如请求失败率、响应时间过长等。例如,可以通过设置异常比例规则来触发熔断降级机制:

ExceptionRule rule = new ExceptionRule();
rule.setResource("exampleResource");
rule.setCount(5);
rule.setGrade(RuleConstant.EXCEPTION_RATIO);
rule.setLimitCallback(new ExceptionCallback() {
    @Override
    public void callback(ExceptionRule rule, boolean isPass) {
        if (!isPass) {
            System.out.println("请求失败率过高,触发熔断");
        }
    }
});
ExceptionRuleManager.loadRules(Collections.singletonList(rule));
熔断降级的核心思想

熔断降级是一种保护机制,用于在调用链路出现异常时断开调用链路,避免产生大量消耗资源的请求,同时提供备用方案。熔断降级的核心思想是通过检测调用链路中的异常情况(如请求失败率、响应时间过长等)来触发熔断机制,当熔断后可以提供降级方案,如返回默认值、降级到静态页面等。

熔断降级的工作流程

  1. 检测异常:通过设置异常比例规则,检测调用链路中的异常情况。
  2. 触发熔断:当检测到异常情况时,触发熔断机制,断开调用链路。
  3. 提供降级方案:当熔断后,提供备用方案,如返回默认值、降级到静态页面等。

熔断降级的应用场景

  • 服务调用失败率高:当服务调用失败率较高时,触发熔断机制,避免链路故障引起雪崩效应。
  • 服务响应时间过长:当服务响应时间过长时,触发熔断机制,避免资源被无效耗尽。
学习Sentinel的流控模式之一:直接流控
设置直接流控的步骤

直接流控是 Sentinel 流控模式中最基础的一种模式,它针对特定资源进行流量控制,适用于需要精确控制流量的场景。设置直接流控的步骤如下:

  1. 定义资源:定义需要控制流量的资源。
  2. 设置规则:为资源设置流量控制规则。
  3. 加载规则:将规则加载到 Sentinel 中。

定义资源

资源是 Sentinel 的基本单位,可以通过注解或编程方式定义。例如,通过 @SentinelResource 注解定义一个资源:

@SentinelResource(value = "exampleResource")
public String executeExample() {
    // 业务逻辑代码
    return "example";
}

设置规则

规则定义了如何保护资源,可以通过编程方式或配置文件定义。例如,定义一个流量控制规则:

FlowRule rule = new FlowRule();
rule.setResource("exampleResource");
rule.setCount(10);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setLimitCallback(new FlowCallback() {
    @Override
    public void callback(FlowRule rule, boolean isPass) {
        if (!isPass) {
            System.out.println("请求被限流了");
        }
    }
});

加载规则

将规则加载到 Sentinel 中,使其生效:

FlowRuleManager.loadRules(Collections.singletonList(rule));
参数解析及配置说明

直接流控的规则可以通过以下参数进行配置:

  • Count:限制的 QPS(每秒请求数量)。
  • Grade:流量控制的类型,可以是 QPS 或并发线程数。
  • LimitCallback:超出流控限制时的回调函数。

参数说明

  • Count:表示每秒允许的最大请求数量。例如:

    FlowRule rule = new FlowRule();
    rule.setResource("exampleResource");
    rule.setCount(10);
  • Grade:表示流量控制的类型。可以通过 RuleConstant.FLOW_GRADE_QPS 设置为 QPS(每秒请求数量),或通过 RuleConstant.FLOW_GRADE_THREAD 设置为并发线程数。例如:

    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
  • LimitCallback:超出流控限制时的回调函数。可以通过实现 FlowCallback 接口来自定义回调逻辑。例如:

    rule.setLimitCallback(new FlowCallback() {
      @Override
      public void callback(FlowRule rule, boolean isPass) {
          if (!isPass) {
              System.out.println("请求被限流了");
          }
      }
    });
直接流控的实际应用案例

假设我们有一个电商网站,需要对某个热门商品的访问流量进行控制,以防止因访问量过大导致系统过载。我们可以使用直接流控来限制每秒访问该商品的请求数量。

示例代码

@SentinelResource(value = "hotProductResource")
public String getHotProduct() {
    // 业务逻辑代码
    return "hotProduct";
}

public static void main(String[] args) {
    FlowRule rule = new FlowRule();
    rule.setResource("hotProductResource");
    rule.setCount(10);
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    rule.setLimitCallback(new FlowCallback() {
        @Override
        public void callback(FlowRule rule, boolean isPass) {
            if (!isPass) {
                System.out.println("请求被限流了");
            }
        }
    });
    FlowRuleManager.loadRules(Collections.singletonList(rule));

    for (int i = 0; i < 20; i++) {
        getHotProduct();
    }
}

public static String getHotProduct() {
    try {
        return getHotProductResource();
    } catch (BlockException e) {
        System.out.println("请求被限流了");
        return null;
    }
}

@SentinelResource(value = "hotProductResource")
public String getHotProductResource() {
    // 业务逻辑代码
    return "hotProduct";
}

代码解析

  • 定义资源:通过 @SentinelResource 注解定义需要控制流量的资源 hotProductResource
  • 设置规则:为资源设置流量控制规则,限制每秒请求数量为 10。
  • 加载规则:将规则加载到 Sentinel 中,使其生效。
  • 验证限流:通过循环调用 getHotProduct 方法来验证是否被限流。

通过这种方式,我们可以精确控制热门商品的访问流量,避免因访问量过大导致系统过载。

学习Sentinel的流控模式之二:链路流控
链路流控的概念

链路流控是 Sentinel 流控模式中的一种,它根据调用链路进行流量控制。链路流控适用于服务之间的调用,通过限制链路中的请求数量来保护服务不被过载。

链路流控的特点

  • 跨服务调用:适用于服务之间的调用,如微服务架构中的服务调用。
  • 多级保护:通过链路流控可以实现多级保护,保护整个调用链路。
  • 动态调整:可以根据系统负载情况动态调整链路中的流量。
实现链路流控的操作方法

实现链路流控的操作方法主要包括以下步骤:

  1. 定义资源:定义需要控制流量的资源。
  2. 设置规则:为资源设置流量控制规则。
  3. 加载规则:将规则加载到 Sentinel 中。

定义资源

资源是 Sentinel 的基本单位,可以通过注解或编程方式定义。例如,通过 @SentinelResource 注解定义一个资源:

@SentinelResource(value = "exampleResource")
public String executeExample() {
    // 业务逻辑代码
    return "example";
}

设置规则

规则定义了如何保护资源,可以通过编程方式或配置文件定义。例如,定义一个流量控制规则:

FlowRule rule = new FlowRule();
rule.setResource("exampleResource");
rule.setCount(10);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setLimitCallback(new FlowCallback() {
    @Override
    public void callback(FlowRule rule, boolean isPass) {
        if (!isPass) {
            System.out.println("请求被限流了");
        }
    }
});

加载规则

将规则加载到 Sentinel 中,使其生效:

FlowRuleManager.loadRules(Collections.singletonList(rule));
链路流控的应用场景和优势

链路流控适用于服务之间的调用,如微服务架构中的服务调用。通过链路流控可以实现多级保护,保护整个调用链路。

应用场景

  • 微服务架构:在微服务架构中,服务之间的调用可以通过链路流控来保护。
  • 分布式系统:在分布式系统中,跨服务的调用可以通过链路流控来保护。

优势

  • 多级保护:通过链路流控可以实现多级保护,保护整个调用链路。
  • 动态调整:可以根据系统负载情况动态调整链路中的流量,实现弹性伸缩。
学习Sentinel的流控模式之三:系统流控
系统流控的定义

系统流控是 Sentinel 流控模式中的一种,它根据系统负载情况进行流量控制。系统流控适用于需要保护整个系统的场景,通过限制进入系统的流量来防止系统过载。

系统流控的特点

  • 全局保护:适用于需要保护整个系统的场景。
  • 动态调整:可以根据系统负载情况动态调整流量。
  • 多级保护:通过系统流控可以实现多级保护,保护整个系统。
系统流控的配置和使用

实现系统流控的操作方法主要包括以下步骤:

  1. 定义资源:定义需要保护的资源。
  2. 设置规则:为资源设置系统保护规则。
  3. 加载规则:将规则加载到 Sentinel 中。

定义资源

资源是 Sentinel 的基本单位,可以通过注解或编程方式定义。例如,通过 @SentinelResource 注解定义一个资源:

@SentinelResource(value = "exampleResource")
public String executeExample() {
    // 业务逻辑代码
    return "example";
}

设置规则

规则定义了如何保护资源,可以通过编程方式或配置文件定义。例如,定义一个系统保护规则:

SystemRule rule = new SystemRule();
rule.setResource("exampleResource");
rule.setCount(100);
rule.setGrade(RuleConstant.SYSTEM_RULE_QPS);
rule.setLimitCallback(new SystemCallback() {
    @Override
    public void callback(SystemRule rule, boolean isPass) {
        if (!isPass) {
            System.out.println("请求被限流了");
        }
    }
});

加载规则

将规则加载到 Sentinel 中,使其生效:

SystemRuleManager.loadRules(Collections.singletonList(rule));
系统流控的实际案例分析

假设我们有一个电商平台,需要对整个系统的流量进行控制,以防止因流量过大导致系统过载。我们可以使用系统流控来限制进入系统的流量。

示例代码

@SentinelResource(value = "systemResource")
public String getSystemResource() {
    // 业务逻辑代码
    return "systemResource";
}

public static void main(String[] args) {
    SystemRule rule = new SystemRule();
    rule.setResource("systemResource");
    rule.setCount(100);
    rule.setGrade(RuleConstant.SYSTEM_RULE_QPS);
    rule.setLimitCallback(new SystemCallback() {
        @Override
        public void callback(SystemRule rule, boolean isPass) {
            if (!isPass) {
                System.out.println("请求被限流了");
            }
        }
    });
    SystemRuleManager.loadRules(Collections.singletonList(rule));

    for (int i = 0; i < 200; i++) {
        getSystemResource();
    }
}

public static String getSystemResource() {
    try {
        return getSystemResource();
    } catch (BlockException e) {
        System.out.println("请求被限流了");
        return null;
    }
}

@SentinelResource(value = "systemResource")
public String getSystemResource() {
    // 业务逻辑代码
    return "systemResource";
}

代码解析

  • 定义资源:通过 @SentinelResource 注解定义需要保护的资源 systemResource
  • 设置规则:为资源设置系统保护规则,限制每秒请求数量为 100。
  • 加载规则:将规则加载到 Sentinel 中,使其生效。
  • 验证限流:通过循环调用 getSystemResource 方法来验证是否被限流。

通过这种方式,我们可以保护整个系统的流量,防止因流量过大导致系统过载。

0人推荐
随时随地看视频
慕课网APP