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

标签: Spring Cloud Alibaba  微服务  java

回溯

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,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。
  • 排队等待:让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待; 它还会让设置一个超时时间,当请求超过超时间时间还未处理,则会被丢弃。

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

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

智能推荐

linux服务器部署jenkins笔记

安装jenkins参考文档:https://blog.csdn.net/tomatocc/article/details/83930714 1. 打开jenkins官网:https://jenkins.io/download/ 将war包下载到本地 **ps:**这里要注意的是要下载左边下方的war包,不要下载右边下面的war包。左边是稳定版本,右边是最新版本,建议大家使用稳定版本(我刚开始下载的...

k8s部署elasticsearch集群

百度营销大学     环境准备 我们使用的k8s和ceph环境见: https://blog.51cto.com/leejia/2495558 https://blog.51cto.com/leejia/2499684 ECK简介 Elastic Cloud on Kubernetes,这是一款基于 Kubernetes Operator 模式的新型编排产品,用户可使用该产品在...

saas-export项目-AdminLTE介绍与入门

AdminLTE介绍 (1)AdminLTE是什么? AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具 (2)AdminLTE有什么特点? 提供一系列响应的、可重复使用的组件, 并内置了多个模板页面 自适应多种屏幕分辨率,兼容PC和移动端 快速的创建一个响应式的Html5网站 AdminLTE 不但美观, 而且可以免去写很大CSS与JS的工作量 AdminLTE...

MyBatis中ResultMap结果集映射

用于解决属性名和字段名不一致的情况: resultMap 元素是 MyBatis 中最重要最强大的元素。...

编写一个shell

编写shell的过程: 1.从标准输入中读入一个字符串。 2.解析字符串 3.创建一个子进程的执行程序。 4.子进程程序替换。 5.父进程等待子进程退出。...

猜你喜欢

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...

力扣困难难度 第4题 寻找两个正序数组的中位数

先看一眼题 我的思路: 设置下标i,j分别用于遍历两个数组,初始值均为0,直到找到两个数组中从小到大的第第length/2个数为止结束循环,length为两个数组长度之和。 ·每次比较nums[i]nums[j],如果前者小则i++,否则j++ ·循环结束时,如果count已经达到length/2,则说明已经找到了中位数,[注意:此时有可能正好其中一个数组遍历完了!所以...

[国家集训队]小Z的袜子(莫队)

[国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这NN只袜子从1到NN编号,然后从编号LL到RR(LL 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同...

服务器配置(五) 服务器使用tomcat配置https全过程

一.了解服务器配置https协议 HTTPS,是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 配置HTTPS就需要证书,证书通过权威的CA机构付费获得的证书才能被互联网承认,我们将其放在服务器上面,配置好后,就可以进行https通信了。 通过https访问的网站,在地址前可以看到安全两个字,点击可以查...

SQL语言——基本概念、操作数据库、表、表记录、数据库备份与恢复、外键约束

SQL语言 1.基本概念 1.1 SQL SQL–Structured Query Language, 结构化查询语言,是关系型数据库通用的操作语言。 是一种非过程性语言。 由美国国家标准局(ANSI)与国际标准化组织(ISO)制定SQL标准。各大数据库厂商都对其做了实现。所以我们只要学会了SQL语言,就可以操作各大关系型数据库了。 为加强SQL的语言能力,各厂商增强了过程性语言的特征...