代码编织梦想

在上一篇文章中,我们已经对 Sentinel 有了基本的了解,并通过一个基本案例看到了 Sentinel 的流控效果,今天我们就来研究一下 Sentinel 的流控规则。

话不多说,开始今天的学习。

一、什么是流控

流控:即流量控制,通常所说的缓冲、限流、降级、熔断等在本质上是一致的,均为流量控制手段,用于防止系统过载,区别在于流控的手段和程度不同。

那么为什么要进行流控呢?

因为大型互联网应用都会有大量的用户流量,当遇到了某些特殊的时间节点,如:双十一秒杀、春节抢票等,大量的流量突然涌入系统,容易引发系统过载,造成系统整体的不稳定甚至崩溃。

那么对这种问题,我们就需要对流量进行限制,对于超过限制的流量,我们可以采用熔断、降级、排队等待等方式来解决。

二、基本流控规则

在上一篇 微服务系列:Spring Cloud Alibaba 之 Sentinel 详细入门 Sentinel 入门篇中,我们启动了 Sentinel 控制台,并在项目中集成了 Sentinel

这次我们依旧启动控制台,并写一个这样的测试接口:

@RestController
public class TestController {

    @GetMapping("/testA")
    public String testA(){
        return "testA....";
    }

    @GetMapping("/testB")
    public Object testB(){
        return "testB......";
    }
}

浏览器访问地址:localhost:9201/testA,观察控制台簇点链路菜单

image-20220126224833145

出现了我们刚才访问的那个接口资源

1. 控制台定义

点击 “流控” 按钮,添加 /testA 接口的流量控制的规则

image-20220126225047092

其中:

  • 资源名: 唯一名称,默认请求路径
  • 针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)官方文档 - 根据调用方限流
  • 阈值类型/单机阈值:
    • QPS(每秒请求数量):当调用该api的QPS达到阈值的时候,进行限流
    • 线程数:当调用该api的线程数达到阈值的时候,进行限流
  • 是否集群: 不需要集群

这些参数就是配置 Sentinel 的基本流控规则的参数,至于高级选项中的配置,我们本篇暂不学习,将在下一篇中去学习 Sentinel 的高级流控规则

2. 代码定义

理解上面规则的定义之后,我们可以通过调用FlowRuleManager.loadRules()方法来用硬编码的方式定义流量控制规则,比如:

private void initFlowQpsRule() {
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule(resourceName);
    rule.setCount(2);
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    rule.setLimitApp("default");
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}

属性说明:

参数描述描述
resourceName资源名,资源名是限流规则的作用对象
limitApp流控针对的调用来源,若为 default 则不区分调用来源default,代表不区分调用来源
grade限流阈值类型,QPS 模式(1)或并发线程数模式(0)QPS 模式
count限流阈值
strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
controlBehavior流量控制效果(直接拒绝、Warm Up、匀速排队)直接拒绝
clusterMode是否集群限流

前四个参数就与上面控制台中的基本规则相对应,下面的三个参数就对应高级规则啦,依旧是本篇暂不讨论。

限流的直接表现是在执行 Entry nodeA = SphU.entry(资源名字) 的时候抛出 FlowException 异常。FlowExceptionBlockException 的子类,你可以捕捉 BlockException 来自定义被限流之后的处理逻辑。

注意:

同一个资源可以同时有多个限流规则,会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。

三、流控测试

经过上面的学习,相信你对 Sentinel 的基本限流规则配置有了一定了解,接下来我们就来实战操作一下。

1. 控制台定义

1.1、QPS

QPS(每秒请求数量):当调用该api的QPS达到阈值的时候,进行限流

我们设置资源 /testA 的阈值类型是 QPS,单机阈值是 2

image-20220126230043478

点击新增就会发现流控规则菜单下多了一条新规则

这条规则的意思就是:当每秒访问资源 /testA 的请求超过 2 个时,触发限流

image-20220126230259617

然后我们快速刷新请求:localhost:9201/testA 当一秒内刷新了 2 次,到第 3 次的时候将触发限流

image-20220126230753328

怎么样?是不是觉得 Sentinel 控制台配置限流规则非常的方便,并且不用重启项目和控制台,即刻生效。

1.2、并发线程

当调用该api的线程数达到阈值的时候,进行限流

线程数限流用于保护业务线程数不被耗尽,如果超出阈值,新的请求会被立即拒绝。

我们设置资源 /testA 的阈值类型是 QPS,单机阈值是 3

image-20220128212132111

这条规则的意思就是:当同时访问资源 /testA 的线程数超过 3 个时,触发限流,第四个请求会被立即拒绝

了解了一下,Postman 的 runner 并不是并发执行的,实际还是串行

所以,这里并发测试工具我们选择使用 Jemeter

Jemter 的下载安装这里就不介绍了,我们直接开始

a. 添加线程组

image-20220128212657245

b. 设置线程数为5和永远循环

image-20220128212755952

c. 添加取样器

image-20220128212852112

配置访问的接口信息

image-20220128213017328

d. 添加个监听器,看访问结果

image-20220128213106233

e. 点击启动测试

image-20220128213209701

f. 结果

image-20220128213324035

启动过程中,浏览器访问这个地址很容易就出现了限流

image-20220128213418029

2. 代码定义

接下来我们使用代码硬编码的方式来定义流量控制规则

  • initFlowQpsRule()
@SpringBootApplication
public class SentinelApplication {

    public static void main(String[] args) {
        SpringApplication.run(SentinelApplication.class, args);
        initFlowQpsRule();
    }

    //定义了每秒最多接收3个请求
    private static void initFlowQpsRule() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule("testA");
        rule.setCount(3);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}
  • TestController.java
@RestController
public class TestController {

    @GetMapping("/testA")
    @SentinelResource(value = "testA", blockHandler = "handleException")
    public String testA(){
        return "testA....";
    }

    public String handleException(BlockException exception){
        return "{\"code\":\"500\",\"msg\": \"" + "服务流量控制处理\"}";
    }
}

注意:handleException 方法中参数必须和 testA 参数一致并且最后要加上参数 BlockException exception ,否则会报错

  • 重启项目,并访问地址

访问地址:localhost:9201/testA

image-20220126232004608

流控规则下也自动出现了这条规则

image-20220126232051890

  • 快速刷新地址

快速刷新地址:localhost:9201/testA 触发限流

image-20220126232744283

到这里,Sentinel 的基本流控规则我们就会配置啦,下一篇我们就去研究 Sentinel 的高级流控规则

PS: 都看到这里了,点个赞吧,彦祖

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhang33565417/article/details/122763095

Spring Cloud Alibaba教程:Sentinel 流控规则详解-爱代码爱编程

一、流量控制( flow control) 简单来讲,就是监控应用服务流量的QPS或者并发线程数一些指标,当达到指定的阈值时对流量进行控制,以免被瞬时的流量高峰冲垮,从而达到应用的高可用。 1.1 概念解释: resource 资源名称 :可以认为是接口的请求路径grade 阈值类型:QPS、线程数是否集群: 单机还是集群strategy : 流控制模

SpringCloud Alibaba之Sentinel的流控规则简介-爱代码爱编程

所有代码都在github上:https://github.com/demonruin/cloud2020/tree/master 一、流控规则 :流量限制控制规则 Sentinel-dashboard中的流控规则菜单项: 资源名:唯一名称,默认请求路径针对来源: Sentine可以针对调用者进行限流,填写微服务名,默认default (不区分来源

SpringCloud Alibaba微服务中Sentinel流控规则(详解+示例demo+测试效果)-爱代码爱编程

前言: 本篇博客介绍了有关于Sentinel的几种常用的流控规则。 文章目录 一。概述二。QPS-直接-快速失败三。线程-直接-快速失败四。QPS-关联-快速失败五。QPS-链路-快速失败六。QPS-直接-预热七。QPS-直接-匀速排队 一。概述 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当

Spring Cloud Alibaba:Sentinel 流控规则-爱代码爱编程

文章目录 1. 前言2. 阈值类型2.1 QPS2.2 线程数3. 流控模式3.1 直接3.2 关联3.3 链路4. 流控效果4.1 快速失败4.2 Warm Up4.3 排队等待 1. 前言 在前面的文章中,已经介绍过了 Sentinel安装和基本使用。这次主要讲的是Sentinel 的流量控制规则,使用版本为1.8.0,它提供了以下几个配

112.SpringCloud(高级三):SpringCloud Alibaba之Sentinel-爱代码爱编程

目录 一、什么是Sentinel 1.sentinel作用 2.sentinel构成 二、Sentinel下载安装,基本使用 1.下载地址 2.安装sentinel (1)运行前提 (2)下载好jar包后,直接java -jar运行 三、初始化演示工程 1.sentinel启动 2.nacos启动 3.编写一个module (1)

SpringCloud Alibaba学习(六):Sentinel的流控规则-爱代码爱编程

目录 一、基本介绍  二、配置方法  三、流控模式          1、 直接-->快速失败(系统默认)         2、关联                 (1)是什么                  (2)配置方法                 (3)测试                 (4)应用场景     

微服务系列:Spring Cloud Alibaba 之 Sentinel 详细入门-爱代码爱编程

微服务系列:服务网关 Spring Cloud Gateway 集成 Sentinel 限流在前面学习 Spring Cloud Gateway 的时候,我们已经使用过了 Sentinel 来进行限流,但是并没有对 Sentinel 进行详细的学习,那今天就要补上这块知识了。 话不多说,开始今天的学习。 Sentinel 介绍 Sentinel

微服务系列:Spring Cloud Alibaba 之 Sentinel 高级流控规则-爱代码爱编程

微服务系列:Spring Cloud Alibaba 之 Sentinel 基本流控规则在上一篇中,我们学习完了 Sentinel 的基本流控规则,这篇我们来研究一下 Sentinel 的高级流控规则。 话不多说,开始今天的学习。 一、概述 控制台打开流控规则的高级选项如下 出现了 流控模式 和 流控效果 配置选项,这些配置项都是什么意思呢?

微服务系列:Spring Cloud Alibaba 之 Sentinel 熔断降级规则-爱代码爱编程

微服务系列:Spring Cloud Alibaba 之 Sentinel 基本流控规则 微服务系列:Spring Cloud Alibaba 之 Sentinel 高级流控规则 在上面两篇文章中,我们研究完了 Sentinel 的流控规则,从这篇开始,我们继续去学习 Sentinel 的熔断降级规则。 话不多说,开始今天的学习。 一、概述 除了

微服务系列:Spring Cloud Alibaba 之 Sentinel 热点限流规则-爱代码爱编程

微服务系列:Spring Cloud Alibaba 之 Sentinel 基本流控规则 微服务系列:Spring Cloud Alibaba 之 Sentinel 高级流控规则 微服务系列:Spring Cloud Alibaba 之 Sentinel 熔断降级规则 上面几篇中我们已经学习完了 Sentinel 的基本、高级、熔断规则,这篇我们继续

Spring Cloud Gateway 整合 sentinel 实现流控熔断-爱代码爱编程

一、什么是网关限流:         在微服务架构中,网关层可以屏蔽外部服务直接对内部服务进行调用,对内部服务起到隔离保护的作用,网关限流,顾名思义,就是通过网关层对服务进行限流,从而达到保护后端服务的作用。         Sentinel 从 1.6.0 版本开始就提供了 Spring Cloud Gateway 的适配,可以提供两种资源维度的限流