为了账号安全,请及时绑定邮箱和手机立即绑定

Sentinel不同的流控模式资料详解

概述

Sentinel支持多种流控模式,包括直接模式、链路模式、系统模式和自定义模式,每种模式都有其特定的应用场景和配置方式。这些模式能够帮助开发人员更好地保护系统免受各种异常流量的影响。本文详细介绍了每种模式的配置细节和示例,帮助用户理解和应用这些模式。

Sentinel简介

Sentinel 是阿里巴巴开源的一款基于Java语言的分布式服务保护组件,它能够对微服务进行实时的流量控制和保护,预防因负载过大导致服务雪崩,保障系统的稳定性和用户体验。

Sentinel的作用和应用场景

Sentinel 能够实现多个维度的流量控制和异常保护,如基于QPS的流量控制、基于并发量的流量控制、基于链路的流量控制、异常检测、系统保护等。其应用场景非常广泛,例如:

  • 微服务治理:对微服务进行实时的流量控制和保护,防止服务雪崩。
  • 限流保护:当请求量超过系统阈值时,进行限流操作,保证系统可用性。
  • 异常检测:自动检测系统中的异常流量,防止异常流量对系统造成伤害。
流控模式概述
流控的概念

流控(Flow Control)是指通过调整流量来控制资源的使用,以确保系统在面临高负载时不会崩溃。在分布式系统中,流控是实现服务降级、服务隔离、服务保护的必要手段。

Sentinel支持的流控模式简介

Sentinel 支持多种流控模式,包括直接模式、链路模式、系统模式和自定义模式等。每种模式都有其特定的应用场景和配置方式。这些模式能够帮助开发人员更好地保护系统免受各种异常流量的影响。

熟悉各个流控模式
直接模式详解

直接模式是Sentinel中最基础的一种流控模式,主要用于对单个资源进行流量控制,例如对某个接口的请求进行限流。直接模式支持基于QPS、并发数、响应时间等维度进行流量控制。

直接模式配置细节

直接模式的配置主要包括:

  • 资源名称:指定要进行流量控制的资源名称。
  • 阈值类型:选择基于QPS、并发数或响应时间进行控制。
  • 阈值:设置具体的阈值,例如每秒允许的最大请求数量。
  • 流控策略:设置当超过阈值时采取的策略,例如降级、快速失败等。

直接模式配置示例

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

public class DirectModeConfig {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setLimitCount(10); // 设置阈值
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));
    }
}
链路模式详解

链路模式主要用于保护在分布式系统中服务间的相互调用,例如通过Retrofit或Feign进行的远程调用。链路模式可以对方法调用的链路进行流量控制,确保调用链路的稳定性。

链路模式配置细节

链路模式的配置主要包括:

  • 资源名称:指定要进行流量控制的资源名称。
  • 阈值类型:选择基于QPS、并发数或响应时间进行控制。
  • 阈值:设置具体的阈值,例如每秒允许的最大请求数量。
  • 链路策略:设置针对链路调用的特殊策略,例如链路降级、快速失败等。

链路模式配置示例

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

public class ChainModeConfig {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setRefResource("com.example.data.UserData"); // 设置引用资源
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));
    }
}
系统模式详解

系统模式主要用于保护整个系统,防止系统整体的过载。系统模式根据系统的整体负载情况,动态调整系统的处理能力,以确保系统稳定运行。

系统模式配置细节

系统模式的配置主要包括:

  • 阈值类型:选择基于系统CPU使用率、系统负载等维度进行控制。
  • 阈值:设置具体的阈值,例如CPU使用率超过80%时触发保护。
  • 系统防护:设置系统整体的保护策略,例如保护系统避免过载。

系统模式配置示例

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

public class SystemModeConfig {

    public static void main(String[] args) {
        SystemRule systemRule = new SystemRule();
        systemRule.setId(SystemRuleManager.DEFAULT_SYSTEM_RULE_ID);
        systemRule.setCount(80); // 设置CPU使用率阈值为80%
        systemRule.setGrade(SystemParamConstant.STAGE_SYSTEM_LOAD_THRESHOLD); // 设置规则类型为系统负载
        systemRule.setParamIdx(SystemParamConstant.PARAM_SYSTEM_LOAD_THRESHOLD, 1); // 设置系统负载参数
        SystemRuleManager.loadRules(Collections.singletonList(systemRule));
    }
}
自定义流控模式详解

自定义流控模式允许开发人员根据特定需求定制自己的流控策略。Sentinel 提供了丰富的API和自定义能力,使得开发人员可以根据系统的实际情况灵活地设定流控策略。

自定义流控模式配置细节

自定义流控模式的配置主要包括:

  • 资源名称:指定要进行流量控制的资源名称。
  • 阈值类型:选择基于QPS、并发数或响应时间进行控制。
  • 阈值:设置具体的阈值。
  • 自定义策略:根据业务需求编写自定义的流控策略。

自定义流控模式配置示例

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

public class CustomModeConfig {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));

        // 自定义流控策略
        FlowRuleManager.registerCustomFlowChecker((entry, t) -> {
            if (entry != null && t != null) {
                entry.blockByCustomCheck(t);
            }
            return true;
        });
    }
}
流控模式配置教程
如何配置直接模式

直接模式的配置步骤如下:

  1. 创建FlowRule对象。
  2. 设置资源名称、阈值类型、阈值和策略。
  3. 将配置好的规则加载到FlowRuleManager中。

直接模式配置示例

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

public class DirectModeConfigExample {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));
    }
}
如何配置链路模式

链路模式的配置步骤如下:

  1. 创建FlowRule对象。
  2. 设置资源名称、阈值类型、阈值和链路策略。
  3. 将配置好的规则加载到FlowRuleManager中。

链路模式配置示例

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

public class ChainModeConfigExample {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setRefResource("com.example.data.UserData"); // 设置引用资源
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));
    }
}
如何配置系统模式

系统模式的配置步骤如下:

  1. 创建SystemRule对象。
  2. 设置阈值类型、阈值和系统防护策略。
  3. 将配置好的规则加载到SystemRuleManager中。

系统模式配置示例

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

public class SystemModeConfigExample {

    public static void main(String[] args) {
        SystemRule systemRule = new SystemRule();
        systemRule.setId(SystemRuleManager.DEFAULT_SYSTEM_RULE_ID);
        systemRule.setCount(80); // 设置CPU使用率阈值为80%
        systemRule.setGrade(SystemParamConstant.STAGE_SYSTEM_LOAD_THRESHOLD); // 设置规则类型为系统负载
        systemRule.setParamIdx(SystemParamConstant.PARAM_SYSTEM_LOAD_THRESHOLD, 1); // 设置系统负载参数
        SystemRuleManager.loadRules(Collections.singletonList(systemRule));
    }
}
如何配置自定义流控模式

自定义流控模式的配置步骤如下:

  1. 创建FlowRule对象。
  2. 设置资源名称、阈值类型、阈值和策略。
  3. 注册自定义的流控策略。
  4. 将配置好的规则加载到FlowRuleManager中。

自定义流控模式配置示例

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

public class CustomModeConfigExample {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));

        // 注册自定义流控策略
        FlowRuleManager.registerCustomFlowChecker((entry, t) -> {
            if (entry != null && t != null) {
                entry.blockByCustomCheck(t);
            }
            return true;
        });
    }
}
流控模式的实际应用案例
直接模式应用案例

直接模式适用于对单个资源进行流量控制的情况。例如,假设有一个用户服务类的getUsers方法,需要限制每秒的最大请求数量,以防止过多的请求导致服务不可用。

直接模式应用案例代码

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

public class DirectModeUsage {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));

        UserService userService = new UserService();
        try {
            userService.getUsers();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class UserService {
    @SentinelResource(value = "com.example.service.UserService.getUsers", blockHandler = "handleBlock")
    public void getUsers() {
        System.out.println("Processing users...");
    }

    public void handleBlock(BlockException e) {
        System.out.println("Blocked due to too many requests.");
    }
}
链路模式应用案例

链路模式适用于保护在分布式系统中服务间的相互调用。例如,假设有一个通过Feign进行远程调用的方法,需要限制每秒的最大请求数量,以防止过多的请求导致服务不可用。

链路模式应用案例代码

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

public class ChainModeUsage {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setRefResource("com.example.data.UserData"); // 设置引用资源
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));

        UserService userService = new UserService();
        try {
            userService.getUsers();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class UserService {
    @SentinelResource(value = "com.example.service.UserService.getUsers", blockHandler = "handleBlock")
    public void getUsers() {
        System.out.println("Processing users...");
    }

    public void handleBlock(BlockException e) {
        System.out.println("Blocked due to too many requests.");
    }
}
系统模式应用案例

系统模式适用于保护整个系统,防止系统整体的过载。例如,假设有一个系统需要根据CPU使用率进行保护,当CPU使用率超过80%时,需要降低系统的处理能力以防止过载。

系统模式应用案例代码

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

public class SystemModeUsage {

    public static void main(String[] args) {
        SystemRule systemRule = new SystemRule();
        systemRule.setId(SystemRuleManager.DEFAULT_SYSTEM_RULE_ID);
        systemRule.setCount(80); // 设置CPU使用率阈值为80%
        systemRule.setGrade(SystemParamConstant.STAGE_SYSTEM_LOAD_THRESHOLD); // 设置规则类型为系统负载
        systemRule.setParamIdx(SystemParamConstant.PARAM_SYSTEM_LOAD_THRESHOLD, 1); // 设置系统负载参数
        SystemRuleManager.loadRules(Collections.singletonList(systemRule));

        // 模拟系统负载
        int cpuLoad = 85; // 模拟CPU使用率超过80%

        if (cpuLoad > 80) {
            System.out.println("System load is too high, limiting requests.");
        } else {
            System.out.println("System load is normal.");
        }
    }
}
自定义流控模式应用案例

自定义流控模式适用于根据特定需求定制自己的流控策略。例如,假设有一个系统需要根据业务逻辑进行保护,当业务逻辑满足某些特定条件时,需要进行流控操作。

自定义流控模式应用案例代码

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class CustomModeUsage {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));

        FlowRuleManager.registerCustomFlowChecker((entry, t) -> {
            if (entry != null && t != null) {
                entry.blockByCustomCheck(t);
            }
            return true;
        });

        UserService userService = new UserService();
        try {
            userService.getUsers();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class UserService {
    @SentinelResource(value = "com.example.service.UserService.getUsers", blockHandler = "handleBlock")
    public void getUsers() {
        System.out.println("Processing users...");
    }

    public void handleBlock(BlockException e) {
        System.out.println("Blocked due to too many requests.");
    }
}
常见问题与解决办法
流控模式配置常见问题

流控模式配置中常见的问题包括:

  • 规则配置不生效:配置的规则没有生效,可能是规则配置有误或者资源名称不一致。
  • 资源名称不匹配:资源名称配置错误,导致规则应用不到正确的资源上。
  • 阈值设置不当:阈值设置不合理,导致流控策略无法正常工作。
  • 流控策略无法正确执行:流控策略配置错误,导致流控无法执行。
解决流控模式配置问题的方法

解决流控模式配置问题的方法包括:

  • 检查规则配置:确保规则配置正确,并且资源名称与实际使用的资源名称一致。
  • 调试日志:通过查看Sentinel的日志信息,可以更好地理解规则的执行情况。
  • 调整阈值:根据系统的实际情况调整阈值,确保阈值设置合理。
  • 验证流控策略:通过模拟测试,验证流控策略是否能够正常执行,从而确保系统稳定运行。

示例:调试日志


import com.alibaba.csp.sentinel.Sentinel;
import com.alibaba.csp.sentinel.log.SentinelLog;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

public class DebugLogExample {

    public static void main(String[] args) {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("com.example.service.UserService.getUsers");
        flowRule.setCount(10); // 设置每秒最大请求数为10
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置规则类型为QPS
        flowRule.setStrategy(RuleConstant.STATEGY_REF_COUNT); // 设置策略为按计数
        flowRule.setLimitCount(10); // 设置阈值
        FlowRuleManager.loadRules(Collections.singletonList(flowRule));

        SentinelLog.info("Flow rule loaded: {}", flowRule);
    }
}
``

通过这种方式,可以更好地理解和调试流控模式的配置问题,确保系统能够稳定运行。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消