Spring Cloud Alibaba - Sentinel入门案例(二)(流控规则 | 直接 / 关联 / 链路 / 快速失败 / Warm Up / 排队等待)

回溯

Sentinel 基本概念

  • 资源:就是Sentinel要保护的东西,它可以是 Java 应用程序中的任何内容,可以是一个服务,也可以是一个方法,甚至可以是一段代码。
  • 规则:就是用来定义如何进行保护资源的,作用在资源之上, 定义以什么样的方式保护资源,主要包括流量控制规则、熔断降级规则以及系统保护规则。

若对 Sentinel 还没有一个认知,可以参考前面的博文。

本文主要讲解 Sentinel 容错功能之一 流量控制

正文

环境准备

需要启动好 Sentinel 控制台,以及监控一个消费者。
在这里插入图片描述
若对这一步有疑虑,请参考SpringCloud Alibaba - Sentinel入门案例(一)

流控规则介绍

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

简单介绍

在这里插入图片描述
当我们点击 簇点链路 选择相对应的资源名,点击 +流控,就可为需要的资源添加流控规则。

以下做一个简单的介绍:

  • 资源名:唯一名称,默认是请求路径,可自定义(后续讲解)。
  • 针对来源:指定对哪个微服务进行限流,默认指default,意思是不区分来源,全部限制。
  • 阈值类型/单机阈值QPS(每秒请求数量): 当调用该接口的QPS达到阈值的时候,进行限流 / 线程数:当调用该接口的线程数达到阈值的时候,进行限流 。
  • 是否集群:是否集群配置 。

对 阈值类型 / 单机阈值做 测试

对于简单的配置而言,有两个默认项:

  • 流控模式:直接 。
  • 流控效果:快速失败 。

至于什么是流控模式,什么是流控效果,后续会讲解。

首先我们选择QPS,单机阈值填写2,点击新增 。
在这里插入图片描述
添加成功后我们可以到流控规则里面查看我们设置的流控。
在这里插入图片描述
由于这边我们QPS选择了阈值为2,意思是。这个请求路径,每秒只允许2个请求。超出会使用流控效果。而简单配置的流控效果是快速失败

配置完成,当我快速请求服务的时候,会出现 Blocked by Sentinel (flow limiting) ps(这个可更改,后续讲解)

在这里插入图片描述
证明 流控规则 生效。

接下来尝试点击线程数,阈值也是为2。这句话的意思是:这个请求路径,只允许两个线程访问,否则出发流控。

利用 jmeter 进行测试
在这里插入图片描述
在这里插入图片描述

修改相应的配置,点击启动,这时候我们通过浏览器再次访问,也会出现Blocked by Sentinel (flow limiting)

在这里插入图片描述
证明 流控规则 生效。

流控模式

sentinel共有三种流控模式,分别是:

  • 直接(默认):接口达到限流条件时,开启限流。
  • 关联:当关联的资源达到限流条件时,开启限流 (适合做应用让步)。
  • 链路:当从某个接口过来的资源达到限流条件时,开启限流。

直接流控模式

直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。前面的两个案例都是默认直接流控。

关联流控模式

关联流控模式指的是,当指定接口关联的接口达到限流条件时,开启对指定接口开启限流。

前面的例子都是对当前的请求服务进行流控规则的新增,而流控模式中的关联,可以使得其它的请求服务达到阈值,本服务进行流控。

在这里插入图片描述

这时候,对关联的服务进行持续访问
在这里插入图片描述
在这里插入图片描述

由于关联的服务达到了阈值,所以触发了流控,导致增加规则的本服务无法访问。
在这里插入图片描述
上图是关联服务的监控情况,下图是本服务的访问情况。
在这里插入图片描述

链路流控模式

这边需要诉苦一下,太难了啊,翻了几篇别人写的博客,要嘛写的不清不楚,要嘛干脆就没写,自己折腾了半天,最后还是买了某培训机构的课程才看明白,太难了啊。

资源名称的修改

上面有提到资源名称默认是请求路径,这个其实是可以更改的,只需要在方法上加上注解

@SentinelResource("value")

修改后,value 的值就是簇点链路的显示的资源名。

链路模式正文

链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流。它的功能有点类似于针对
来源配置项,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。

这样说的可能不好理解,我来上图,我在控制层有两个方法,同时调用了同一个接口。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这时候我们就可以对这个资源名为 message 的进行链路。

在这里插入图片描述

此时的路口资源就是

  • testMessageFunction2
  • testMessageFunction3

当入口资源达到阈值的时候,就会启动此资源名为 message 的对应路口资源的流控。

坑来了,怎么解决?
禁止收敛URL的入口 context

坑来了,不生效了啊我了个亲娘哎。弄了半天,在一个培训视频上看到了解决方案,亲测有效。

从1.6.3 版本开始,Sentinel Web filter默认收敛所有URL的入口context,因此链路限流不生效。

1.7.0 版本开始(对应SCA的2.1.1.RELEASE),官方在CommonFilter 引入了WEB_CONTEXT_UNIFY 参数,用于控制是否收敛context。将其配置为 false 即可根据不同的URL 进行链路限流。

SCA 2.1.1.RELEASE之后的版本,可以通过配置spring.cloud.sentinel.web-context-unify=false即可关闭收敛,我们当前使用的版本是SpringCloud Alibaba 2.1.0.RELEASE,无法实现链路限流。

目前官方还未发布SCA 2.1.2.RELEASE,所以我们只能使用2.1.1.RELEASE,需要写代码的形式实现。

  1. 暂时将SpringCloud Alibaba的版本调整为2.1.1.RELEASE
  2. 配置文件中关闭sentinel的CommonFilter实例化在这里插入图片描述
  3. 添加一个配置类,自己构建CommonFilter实例
package com.example.nacos.demo.config;

import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterContextConfig {
    
    
    @Bean
    public FilterRegistrationBean sentinelFilterRegistration() {
    
    
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new CommonFilter());
        registration.addUrlPatterns("/*");
        // 入口资源关闭聚合
        registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false");
        registration.setName("sentinelFilter");
        registration.setOrder(1);
        return registration;
    }
}

分别通过两个路口资源进行访问,发现设置的入口资源被限流了。

配置流控效果

  • 快速失败(默认): 直接失败,抛出异常,不做任何额外的处理,是最简单的效果
  • Warm Up:它从开始阈值到最大QPS阈值会有一个缓冲阶段,一开始的阈值是最大QPS阈值的1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。
  • 排队等待:让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待; 它还会让设置一个超时时间,当请求超过超时间时间还未处理,则会被丢弃。

前面的例子流控效果是默认为快速失败,更改效果,就是更改当流控规则触发的时候,结果的处理。这个不好截图演示,就不演示了。

猜你喜欢

转载自blog.csdn.net/qq_29064815/article/details/107102060