手记

Sentinel不同的流控模式学习

概述

本文介绍了Sentinel的不同流量控制模式,包括资源模式、关联模式和系统模式,帮助读者理解如何通过这些模式保护服务的高可用性。Sentinel提供了多种流量控制策略,如直接拒绝、WarmUp和系统保护等,以适应不同的应用场景。Sentinel不同的流控模式学习对于保障系统稳定性至关重要,开发者可以根据实际需求选择合适的模式和策略。

引入Sentinel及其重要性

Sentinel是阿里巴巴开源的一款流量控制组件,其设计理念是通过实时监控和控制流量,从而保护服务的高可用性。它具有丰富的功能和强大的灵活性,适用于各种微服务架构。Sentinel不仅支持Java平台,还提供了多种语言的客户端,如Go、Python等,使得它在不同环境下都有很高的适用性。

Sentinel的核心功能包括:

  • 流量控制:基于服务调用链路来控制流量,以保证系统稳定性。
  • 系统保护:以系统资源为保护对象,提供系统维度的保护。
  • 降级:在调用链路服务不稳定时,根据调用关系进行系统保护。
  • 动态配置:提供了动态的、高可用的配置推送能力。
  • 实时监控:全面的实时监控服务调用关系,及时了解系统的运行状态。

Sentinel的这些功能能够帮助系统在面对突发流量或服务故障时,能够自我保护,避免服务崩溃,确保服务的稳定性和性能。

初识Sentinel的流控模式

Sentinel提供了多种流量控制模式,这些模式分别针对不同的应用场景和保护目标。以下是Sentinel中几种基本的流量控制模式:

1. 资源模式

在Sentinel中,一切需要保护的服务或方法都被视作“资源”。资源可以是HTTP请求,也可以是本地的某个方法调用。资源通过SphU.entry方法来定义。资源模式是最基础的流量控制模式,它和具体的流量控制策略结合使用,以达到流量控制的目的。

代码示例

import com.alibaba.csp.sentinel.slots.block.SphU;

public class SimpleResource {
    public void doSomething() {
        if (SphU.entry("my-resource")) {
            // 业务逻辑
            System.out.println("业务处理中...");
            SphU.exit();
        } else {
            System.out.println("资源被限流了...");
        }
    }
}

2. 流量控制规则

流量控制规则是定义了资源应该如何被保护的一组规则。这些规则可以限制资源的QPS(每秒请求数)或并发数,确保资源在压力过大或恶意攻击时能够正常运行。流量控制规则可以通过API来动态配置,也可以通过Sentinel控制台来静态配置。

Sentinel提供了FlowRule接口,开发者可以通过实现该接口来定义自己的流量控制规则。

代码示例

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class FlowRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("my-resource");
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setWarmUpPeriodInSecond(10);
        rule.setWarmUpCount(10);
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

3. 流量控制策略

流量控制策略定义了资源在达到流量控制规则设定的阈值时应该如何处理请求。Sentinel提供了多种流量控制策略,包括直接拒绝、WarmUp(预热)、关联、系统保护等。每种策略都有其特定的用途,可以根据实际的需求进行选择。

直接拒绝

直接拒绝是最简单的策略,当资源的访问量超过阈值时,直接拒绝掉新的请求。

WarmUp

WarmUp策略允许资源在初始阶段逐步增加访问量,避免瞬间的大量请求对系统造成冲击。

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class WarmUpRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("my-resource");
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setWarmUpPeriodInSecond(10);
        rule.setWarmUpCount(10);
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

关联

关联策略允许根据一个资源的流量控制结果影响另一个关联的资源。例如,如果一个服务的流量被限制了,那么依赖该服务的其他服务也会被限制。

系统保护

系统保护策略以系统的整体负载为保护对象,当系统负载过重时,自动对流量进行控制,以保证系统的稳定运行。

详细讲解Sentinel的规则流控模式

规则流控模式是Sentinel提供的主要流量控制模式之一,它通过自定义规则来限制资源的访问量,确保系统在高负载或恶意攻击时能够正常运行。规则流控模式可以分为资源流控模式和关联流控模式。

资源流控模式

资源流控模式下,Sentinel允许为每一个资源定义一个或多个流量控制规则。规则中可以设置资源的QPS限制、并发数限制等,从而实现细粒度的流量控制。

规则定义

流量控制规则可以通过FlowRule接口来定义。FlowRule接口中包含多个属性,如资源名、规则类型(QPS限制、并发数限制等)、阈值等。

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class ResourceFlowRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("my-resource");
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS); // 设置为QPS限制
        rule.setCount(10); // 设置阈值,这里为10 QPS
        rule.setWarmUpPeriodInSecond(10); // 设置预热期为10秒
        rule.setWarmUpCount(10); // 设置预热期阈值为10
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

配置管理

规则可以通过API动态配置,也可以通过Sentinel控制台静态配置。动态配置允许在系统运行过程中灵活调整流量控制策略。

// 动态添加流量控制规则
FlowRule rule = new FlowRule();
rule.setResource("my-resource");
rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS);
rule.setCount(10);
rule.setWarmUpPeriodInSecond(10);
rule.setWarmUpCount(10);
List<FlowRule> rules = new ArrayList<>();
rules.add(rule);
FlowRuleManager.loadRules(rules);

关联流控模式

关联流控模式允许定义资源之间的依赖关系,从而实现更复杂的流量控制策略。例如,如果一个服务依赖于另一个服务,那么当被依赖的服务流量被限制时,依赖的服务也会受到影响。

规则定义

关联流控模式通过FlowRule中的setRefResource方法来定义资源之间的依赖关系。当一个资源被流量限制时,依赖它的其他资源也会被限制。

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class ResourceFlowRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("service-A");
        rule.setRefResource("service-B"); // 设置依赖资源
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setWarmUpPeriodInSecond(10);
        rule.setWarmUpCount(10);
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

配置管理

关联流控模式同样可以通过API动态配置或Sentinel控制台静态配置。动态配置允许在系统运行过程中灵活调整依赖关系。

// 动态添加关联流量控制规则
FlowRule rule = new FlowRule();
rule.setResource("service-A");
rule.setRefResource("service-B");
rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS);
rule.setCount(10);
rule.setWarmUpPeriodInSecond(10);
rule.setWarmUpCount(10);
List<FlowRule> rules = new ArrayList<>();
rules.add(rule);
FlowRuleManager.loadRules(rules);
学习Sentinel的系统流控模式

系统流控模式是Sentinel提供的另一种流量控制模式,它以系统的整体负载为保护对象,确保系统在高负载或异常情况下能够自我保护。系统流控模式通过监控CPU、系统负载等指标来动态调整流量,确保系统的稳定运行。

系统流控规则

系统流控规则通过监控系统负载(如CPU、系统负载等)来实现流量控制。Sentinel提供了多种系统维度的保护指标,包括CPU使用率、系统负载等。

CPU使用率

CPU使用率是系统流控中最常见的监控指标之一。当CPU使用率超过阈值时,Sentinel会自动限制流量。

import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;

public class SystemRuleConfig {
    public static void loadRules() {
        SystemRule rule = new SystemRule();
        rule.setResource("default");
        rule.setGrade(SystemRuleConstant.ST_SYSTEM_ISOLATE);
        // 设置CPU使用率阈值,超过50%时触发
        rule.setControlPoint(0.5);
        rule.setNote("CPU使用率超过50%时隔离");
        List<SystemRule> rules = new ArrayList<>();
        rules.add(rule);
        SystemRuleManager.loadRules(rules);
    }
}

系统负载

系统负载监控可以针对不同的操作系统进行配置,Sentinel提供了多种系统负载监控方式,如Linux的Load 1、Load 5等。

import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;

public class SystemRuleConfig {
    public static void loadRules() {
        SystemRule rule = new SystemRule();
        rule.setResource("default");
        rule.setGrade(SystemRuleConstant.ST_SYSTEM_BLOCK);
        // 设置系统负载阈值,超过5时触发
        rule.setLoadThreshold(5);
        rule.setNote("系统负载超过5时阻塞");
        List<SystemRule> rules = new ArrayList<>();
        rules.add(rule);
        SystemRuleManager.loadRules(rules);
    }
}

自动降级

系统流控模式还提供自动降级功能,当系统负载过高时,可以自动降级某些服务,以减轻系统压力。

代码示例

import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;

public class SystemRuleConfig {
    public static void loadRules() {
        SystemRule rule = new SystemRule();
        rule.setResource("default");
        rule.setGrade(SystemRuleConstant.ST_SYSTEM_BLOCK);
        rule.setLoadThreshold(5);
        rule.setNote("系统负载超过5时阻塞");
        // 设置降级策略
        rule.setControlPoint(0.7);
        List<SystemRule> rules = new ArrayList<>();
        rules.add(rule);
        SystemRuleManager.loadRules(rules);
    }
}
探索Sentinel的自定义流控模式

Sentinel提供的流量控制模式非常灵活,支持用户自定义多种流量控制策略,以满足不同的业务需求。用户可以通过实现Sentinel提供的接口来自定义流量控制逻辑。

自定义规则定义

Sentinel允许用户通过实现FlowRule接口来定义自定义的流量控制规则。用户可以根据自己的业务需求,自定义规则的阈值、监控指标等。

代码示例

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;

public class CustomFlowRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("custom-resource");
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_SYSTEM);
        rule.setCount(10);
        rule.setControlPoint(0.7);
        rule.setNote("自定义资源规则");
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

自定义策略实现

Sentinel允许用户通过实现FlowRule接口中的isOverloaded方法来定义自定义的流量控制策略。用户可以根据自己的业务逻辑,实现更复杂的流量控制策略。

代码示例

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;

public class CustomFlowRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("custom-resource");
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_SYSTEM);
        rule.setCount(10);
        rule.setControlPoint(0.7);
        rule.setNote("自定义资源规则");

        // 自定义流量控制策略
        rule.setIsOverloaded(new CustomIsOverloaded());

        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

// 自定义流量控制策略实现
public class CustomIsOverloaded implements FlowRule {
    @Override
    public boolean isOverloaded(RuleConstant grade, int count, double controlPoint) {
        // 实现自定义的流量控制逻辑
        return super.isOverloaded(grade, count, controlPoint);
    }
}
实践与总结:如何选择合适的流控模式

在实际应用中,选择合适的流量控制模式是非常重要的。根据不同的业务场景和系统需求,可以选择不同的流量控制模式来保护服务。

选择资源流控模式

资源流控模式适用于需要细粒度控制资源访问量的场景。例如,当某个服务的访问量过高时,可以通过资源流控模式来限制该服务的访问量,从而保护服务的稳定性。

实践案例

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class ResourceFlowRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("my-service");
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setWarmUpPeriodInSecond(10);
        rule.setWarmUpCount(10);
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

选择关联流控模式

关联流控模式适用于需要管理服务之间依赖关系的场景。例如,当一个服务的流量被限制时,依赖该服务的其他服务也会受到影响。

实践案例

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class ResourceFlowRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("service-A");
        rule.setRefResource("service-B"); // 设置依赖资源
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setWarmUpPeriodInSecond(10);
        rule.setWarmUpCount(10);
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

选择系统流控模式

系统流控模式适用于需要从系统整体角度来保护服务的场景。例如,当系统负载过高时,可以通过系统流控模式来限制流量,从而保护系统的稳定运行。

实践案例

import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;

public class SystemRuleConfig {
    public static void loadRules() {
        SystemRule rule = new SystemRule();
        rule.setResource("default");
        rule.setGrade(SystemRuleConstant.ST_SYSTEM_ISOLATE);
        rule.setControlPoint(0.5);
        rule.setNote("CPU使用率超过50%时隔离");
        List<SystemRule> rules = new ArrayList<>();
        rules.add(rule);
        SystemRuleManager.loadRules(rules);
    }
}

自定义流控模式

自定义流控模式适用于需要实现更复杂流量控制逻辑的场景。用户可以根据自己的业务需求,实现自定义的流量控制规则和策略。

实践案例

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;

public class CustomFlowRuleConfig {
    public static void loadRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("custom-resource");
        rule.setGrade(FlowRuleConstant.FLOW_GRADE_SYSTEM);
        rule.setCount(10);
        rule.setControlPoint(0.7);
        rule.setNote("自定义资源规则");

        // 自定义流量控制策略
        rule.setIsOverloaded(new CustomIsOverloaded());

        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

// 自定义流量控制策略实现
public class CustomIsOverloaded implements FlowRule {
    @Override
    public boolean isOverloaded(RuleConstant grade, int count, double controlPoint) {
        // 实现自定义的流量控制逻辑
        return super.isOverloaded(grade, count, controlPoint);
    }
}

总结

在实际应用中,选择合适的流量控制模式是非常重要的。通过合理的使用资源流控模式、关联流控模式、系统流控模式或自定义流控模式,可以有效地保护服务的高可用性和稳定性。Sentinel提供了丰富的功能和强大的灵活性,可以根据实际需求灵活选择和配置流量控制策略。通过不断实践和总结,可以更好地利用Sentinel来保护服务,确保系统的稳定运行。

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