天天看点

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

文章目录

  • 前言
  • 一、实时监控
  • 二、簇点链路
  • 三、流控规则
    • (1)什么是流量控制
    • (2)流量控制的两种类型
    • (3)规则配置详解
    • (4)QPS限流
    • (5)线程数限流
    • (6)流控模式
    • (7)流控效果
    • (8)流控模式与流控效果结合使用
      • (1)直接模式+快速失败
      • (2)直接模式+Warm Up(预热)
      • (3)直接模式+排队等待
      • (4)关联模式+快速失败
      • (5)链路模式+快速失败

前言

springcloud-alibaba生态环境

springcloud-alibaba-sentinel(1)sentinel流量卫兵介绍

springcloud-alibaba-sentinel(2)sentinel下载安装运行

springcloud-alibaba-sentinel(3)sentinel的基本使用

在最新的

springcloud-alibaba-sentinel(3)sentinel的基本使用

文章中,我们已经将sentnel融合进了springboot项目,并且初步体验了

sentinel

的流量监控功能,接下来,咱们仔细研究下sentinel的一些强大的流控功能!

一、实时监控

实时监控,是

sentinel

对服务中的接口进行请求监控,当我们的项目连接且配置了

sentinel-dashboard

服务,我们的服务的请求数据将会被sentinel进行监控,由于其是通过轮询机制请求

sentinel-dashboard

的接口

/metric/queryTopResourceMetric.json

获取的监控数据,所以其仍存在一定的延迟性,大约5S左右

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

当我们请求服务器某一资源(接口)时,请求情况就会被

sentinel

收集并展示

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

这里,对实时监控功能做一些简单的解释说明:

  • 实时监控仅针对服务连接到sentienl后,且被请求过的接口,未被请求(或一定时间不被请求)会从实时监控列表移除,当有了请求后,又会恢复
  • springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
  • 时间:用户请求该接口的时间
  • 通过QPS:当前秒内,接口通过的请求数量
  • 拒绝QPS:当前秒内,接口拒绝的请求数量
  • 响应时间(ms):接口的响应时间

二、簇点链路

簇点链路:簇点链路就是我们当前服务接口(资源)情况,我们可以在此页面统一的设置某个接口的访问限制或者流量限制以及降级策略等等…相当于一个统一管理页面

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

我们来仔细解释一下当前页面各个属性

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
  • 资源名:资源,sentinel中一个非常核心的概念!sentinel本身,就是对服务资源的保护,我们的接口,便是我们的资源,当未显示的指明某一接口的资源名,其默认就是以url作为接口的资源名字!!!
  • ip:右上角的IP,代表着当前我这个

    app-login

    服务连接的sentinel的通信地址,端口号为8719 (默认)其会与sentinel-dashboard服务端进行通信,如果您更改了默认通信端口,则需要在项目中指明,例如:

    spring.cloud.sentinel.transport.port=xxxx

  • springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

三、流控规则

流控规则就是对某一资源(接口)设置请求规则,当触发该规则做什么…未触发该规则做什么…

流控是流量控制的简称,是sentinel的核心功能!

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

(1)什么是流量控制

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

(2)流量控制的两种类型

QPS统计

什么是QPS?

贴近开发来讲,就是每秒钟对服务资源请求次数

当 QPS 超过某个阈值的时候,则采取措施进行流量控制

并发线程数统计

并不是多少个请求就会有多少个线程进行执行,因此,sentinel还可以精准的控制资源请求的线程并发数量

(3)规则配置详解

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

一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:

resource:资源名,即限流规则的作用对象

count: 限流阈值

grade: 限流阈值类型(QPS 或并发线程数)

limitApp: 流控针对的调用来源,若为 default 则不区分调用来源

strategy: 调用关系限流策略

controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

如果了解更多请移步官网:sentinel流控规则详解

接下来,咱们进行流量控制实操!!

(4)QPS限流

当我们在页面疯狂请求接口

http://192.168.125.8:30020/test/sentinel

后,发现我手速最多可达6次每秒,且这几秒内,拒绝QPS都为0

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

接口(资源)如果不设置流量控制,那么其默认是没有配置的,无论接口还是服务器最大可承受并发为多少,sentinel都不会主动拒绝任何请求!

此时,假如这个接口每秒钟最多只能承受两次请求,那么QPS持续为6就可能击垮我们的服务,这个时候呢,就需要对

/test/sentinel

这个接口(资源)进行流量控制了…

如何设置流量控制呢?

①在簇点链路

/test/sentinel

后点击流控按钮,设置QPS流控

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

② 点击左侧流控规则菜单栏,再点击新建规则按钮,设置流控

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

两者,本质都是一样,仅仅是展示在不同菜单罢了

点击后,会出现流控设置弹框

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

解释说明:

资源名:流控规则作用的资源(接口)

针对来源:针对某个来源设置的规则,默认default,针对所有来源

阈值类型:规则触发阈值类型,QPS还是线程数,单选,默认为QPS

单机阈值:阈值达到多少触发限流

是否集群:是否集群配置(我这里为单机)

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

设置好后,我们再来访问

http://192.168.125.8:30020/test/sentinel

接口,疯狂刷新

测试结果:每秒只能最大接收2个请求,超过2个页面会显示如下报错信息

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

(5)线程数限流

为了避免干扰测试,我们在测试线程数限流之前,先将QPS限流阈值2的规则删除掉

接口

/test/sentinel

添加线程数限流

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

为了方便线程数测试,我这里直接使用

Jemeter

压测工具了!

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

测试结果:每秒最多接受两个线程处理,多余请求线程分配不过来时进行限流报错

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

以上,QPS限流以及线程数限流便简单的演示完了,但sentinel的流控规则不仅仅是这么简单,他还包含了很多高级功能

在设置QPS限流或者线程数限流的时候,下方有一个高级选项按钮

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

点击展开

选择QPS限速阈值类型的时候 下方出现了

流控模式

以及

流控效果

面板选项

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

选择线程数限速阈值的时候,仅仅只有

流控效果

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

我们不由发出疑问,流控模式,流控效果,到底是什么呢?我们先来看看它们的概念

(6)流控模式

sentinel

中,流控模式共三种:

直接

关联

链路

直接(模式)

对资源的请求达到设置的规则阈值时直接对该资源触发流量控制

关联(模式)

下边是官网原文解释:

当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。

链路(模式)

这个模式很好理解,尤其是在微服务间相互调用情况下尤为常见(a->b->d)

假设我以a为入口资源,d为终点资源,对这条链路进行限制的话,则资源a,b,d均会被限制访问。

(7)流控效果

sentinel中,流控效果共三种:

快速失败

Warm Up(预热)

排队等待

快速失败

(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流控效果,当QPS或线程数超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。

就是我们一开始配置流控规则触发阈值后看到的

Blocked by Sentinel (flow limiting)

Warm Up(预热)

当流量突然增大的时候,我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些。即如果系统在此之前长期处于空闲的状态,我们希望处理请求的数量是缓步的增多,经过预期的时间以后,到达系统处理请求个数的最大值。Warm Up(冷启动,预热)模式就是为了实现这个目的的。

这个场景主要用于启动需要额外开销的场景,例如建立数据库连接等。

排队等待

(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,让请求以均匀的速度通过,对应的是漏桶算法。 只能对请求进行排队等待

(8)流控模式与流控效果结合使用

流控模式与流控效果必须相结合使用,在未显示的指定模式与效果的时候,默认是

直接模式+快速失败

效果,两种混搭出来的效果有:

直接模式+快速失败

直接模式+Warm Up(预热)

直接模式+排队等待

关联模式+快速失败

关联模式+Warm Up(预热)

关联模式+排队等待

链路模式+快速失败

链路模式+Warm Up(预热)

链路模式+排队等待

一共以上九种限流搭配组合效果!

(1)直接模式+快速失败

这是sentinel默认的流控组合,对某一资源设置了限流阈值后,达到阈值直接抛出异常

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

(2)直接模式+Warm Up(预热)

预热:就是俗称的

冷启动

,当某个接口并发飙升的时候,对这个接口一点点的扩宽限制,直到满足要求

我们首先,将原接口添加打印日志

@GetMapping("/test/sentinel")
    public String get() {
        String message = "赵钱孙李" + new Random().nextInt(20);
        log.info(message);
        return message;
    }
           
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

(3)直接模式+排队等待

设定每秒钟并发阈值,该方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,阀值类型必须设成QPS

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

注意:超时时间指的是该资源处理时长,例如我这里,对接口的请求响应如果超过了1秒,会出触发限流异常

设置后结果:当设置完QPS为16后,Jemeter压测每秒钟最多接受16个请求

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
2021-01-18 23:06:20.066  INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController          : 赵钱孙李17
2021-01-18 23:06:20.129  INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController          : 赵钱孙李19
2021-01-18 23:06:20.193  INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController          : 赵钱孙李9
2021-01-18 23:06:20.255  INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController          : 赵钱孙李15
2021-01-18 23:06:20.318  INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController          : 赵钱孙李2
2021-01-18 23:06:20.380  INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController          : 赵钱孙李19
2021-01-18 23:06:20.445  INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController          : 赵钱孙李9
2021-01-18 23:06:20.508  INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController          : 赵钱孙李19
2021-01-18 23:06:20.570  INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController          : 赵钱孙李4
2021-01-18 23:06:20.634  INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController          : 赵钱孙李10
2021-01-18 23:06:20.697  INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController          : 赵钱孙李0
2021-01-18 23:06:20.760  INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController          : 赵钱孙李7
2021-01-18 23:06:20.822  INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController          : 赵钱孙李12
2021-01-18 23:06:20.886  INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController          : 赵钱孙李0
2021-01-18 23:06:20.948  INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController          : 赵钱孙李12
2021-01-18 23:06:21.012  INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController          : 赵钱孙李15
2021-01-18 23:06:21.075  INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController          : 赵钱孙李4
2021-01-18 23:06:21.137  INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController          : 赵钱孙李17
2021-01-18 23:06:21.200  INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController          : 赵钱孙李6
2021-01-18 23:06:21.263  INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController          : 赵钱孙李1
2021-01-18 23:06:21.326  INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController          : 赵钱孙李10
2021-01-18 23:06:21.390  INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController          : 赵钱孙李16
2021-01-18 23:06:21.452  INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController          : 赵钱孙李7
2021-01-18 23:06:21.514  INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController          : 赵钱孙李6
2021-01-18 23:06:21.578  INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController          : 赵钱孙李14
2021-01-18 23:06:21.642  INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController          : 赵钱孙李3
2021-01-18 23:06:21.704  INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController          : 赵钱孙李14
2021-01-18 23:06:21.768  INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController          : 赵钱孙李18
2021-01-18 23:06:21.831  INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController          : 赵钱孙李1
2021-01-18 23:06:21.892  INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController          : 赵钱孙李5
2021-01-18 23:06:21.956  INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController          : 赵钱孙李16
2021-01-18 23:06:22.020  INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController          : 赵钱孙李17
2021-01-18 23:06:22.083  INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController          : 赵钱孙李2
2021-01-18 23:06:22.145  INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController          : 赵钱孙李19
2021-01-18 23:06:22.208  INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController          : 赵钱孙李5
2021-01-18 23:06:22.271  INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController          : 赵钱孙李8
2021-01-18 23:06:22.335  INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController          : 赵钱孙李13
2021-01-18 23:06:22.397  INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController          : 赵钱孙李7
2021-01-18 23:06:22.461  INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController          : 赵钱孙李8
2021-01-18 23:06:22.523  INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController          : 赵钱孙李4
2021-01-18 23:06:22.586  INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController          : 赵钱孙李1
2021-01-18 23:06:22.650  INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController          : 赵钱孙李14
2021-01-18 23:06:22.713  INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController          : 赵钱孙李18
2021-01-18 23:06:22.774  INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController          : 赵钱孙李10
2021-01-18 23:06:22.839  INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController          : 赵钱孙李9
2021-01-18 23:06:22.902  INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController          : 赵钱孙李17
2021-01-18 23:06:22.963  INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController          : 赵钱孙李1
2021-01-18 23:06:23.028  INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController          : 赵钱孙李18
2021-01-18 23:06:23.090  INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController          : 赵钱孙李4
2021-01-18 23:06:23.154  INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController          : 赵钱孙李1
           

(4)关联模式+快速失败

当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联,这个时候如果在sentinel流控中对两个资源设置了关联关系,那么被关联的资源在达到阈值时另一个资源则会进入流控状态

现在假如下方两个接口存在着资源竞争关系

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

假如设置了如下的关联流控规则

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

特别特别注意:关联资源,反而是触发流控阈值的资源,资源名处资源是被流控资源!!

如果按照图上这样设置流控规则,那么结果就是当

/test/name

QPS达到10+的时候,

/test/sentinel

资源将会进入流控状态,流控效果是快速失败!

结果展示:

我们的

/test/sentinel

资源,连每秒钟1QPS都直接进行了拒绝,而

/test/name

每秒钟2200QPS都会被接受

springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则
springcloud-alibaba-sentinel(4)sentinel流控详解前言一、实时监控二、簇点链路三、流控规则

至于

关联模式+预热

以及

关联模式+排队等待

,我这里就不演示了!!感兴趣的可以自己玩玩

(5)链路模式+快速失败

…后续待更

继续阅读