Sentinel通过限流对微服务进行保护

目录

雪崩问题

解决雪崩问题的方法:

我们使用sentinel组件实现微服务的保护

 一:下载sentinel

二.启动sentinel

三.访问:localhost:8080 默认的账号和密码都是sentinel

 微服务整合sentinel

一.导入sentinel依赖

二.在application.yml配置文件中编写配置sentinel控制台的地址

第三步:启动微服务项目,并访问微服务的某一个接口

Sentinel设置流控

使用jmeter工具测试接口

jmeter介绍

jmeter安装

 启动

​编辑 使用

测试计划添加线程组

添加http请求行为​编辑

​编辑 添加响应结果监听器

 启动线程组

查看结果树,有一个成功,因为设置了sentinel流控设置了一秒只能访问一次这个接口

查看聚合报告

​编辑 流控模式

直接模式

关联模式

链路模式 

总结:

流控效果 

warm up

排队等待

热点参数限流 

 1.给接口使用@SentinelResource注解,标记为资源

2.配置热点参数限流规则​编辑


雪崩问题

微服务调用链路中的某一个服务故障,引起整个链路中所有微服务都不可用,就会造成雪崩

举个例子:一个微服务就是一个tomcat服务器,而一个tomcat服务器只有几百个线程可用,这个A服务在访问另一个B微服务时,需要60秒才能响应,那么这个A服务的所有线程都会因为B服务的长时间不响应而阻塞,最后导致A服务不可用,进而导致调用A微服务的所有微服务都不可用,这就是雪崩问题

解决雪崩问题的方法:

1.超时处理:设置超时时间,请求超过一定时间没有响应就直接返回错误信息,这样一来就不会无休止等待

2.舱壁模式:限定每一个微服务能使S用的线程数,从而避免耗尽整个tomcat的资源,因此也叫做线程隔离

3.熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该服务,拦截访问该业务的一切请求。就是一个微服务出现内部异常,一旦超过一定比例,就会有一段时间其他服务都不能访问整个出现问题的微服务,过了一段时间后才尝试进行访问,如果还是不行就继续熔断

4.流量控制:限制业务访问的QPS(每秒的访问数量),避免服务因为流量激增而故障。就是如果有几万个请求同时访问一个服务,需要把这些请求分批次少量的发送服务

我们使用sentinel组件实现微服务的保护

 一:下载sentinel

下载地址

Release v1.8.1 · alibaba/Sentinel

下载sentinel的jar包

二.启动sentinel

java -jar sentinel-dashboard-1.8.1.jar 

三.访问:localhost:8080 默认的账号和密码都是sentinel

如果想改端口号

java -Dserver.port=9090 -Dcsp.sentinel.dashboard.server=localhost:9090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

 微服务整合sentinel

一.导入sentinel依赖

<!--        导入sentinel依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

这里我没有指定版本号,因为我在父工程已经导入了spring-cloud-alibaba的父工程来管理spring-cloud-alibaba的所有组件的版本号

<!--            SpringCloudAlibaba的父工程,管理依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

二.在application.yml配置文件中编写配置sentinel控制台的地址

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:9090 #控制台地址

第三步:启动微服务项目,并访问微服务的某一个接口

可以发现sentinel已经监控到了这个order-service微服务

簇点链路:就是项目内的调用链路,链路中被监控的每一个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),一个端点就是一个接口,因此SpringMVC的每一个端点就是调用链路中的每一个资源流控,熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击后面的按钮来设置规则

Sentinel设置流控

流控设置:点击接口后面的流控按钮

选择阈值类型未QPS(每秒中的访问次数),然后阈值设置为1

这样一来这个接口的流控为:每秒中只能访问一次

 效果

一秒内访问多次就会显示被sentinel阻塞,直接报错

使用jmeter工具测试接口

jmeter介绍

JMeter是由Apache组织开发的一款基于Java的压力测试工具。它最初设计用于Web应用测试,但随着时间的推移,JMeter的功能已经扩展到了其他的测试领域。JMeter能够模拟大量用户对服务器、网络或对象进行负载测试,从而测试它们在不同压力下的性能,并进行整体性能分析。 

jmeter安装

官网下载链接Apache JMeter - Download Apache JMeter 

 启动

解压以后进入bin目录,打开jmeter.properties文件,修改语言为中文

点击jmeter.bat文件启动jemter工具 

 使用

测试计划添加线程组

在线程组中设置线程数为200,ramp-up为在多长时间内创建这200个线程,时间越短越高并发

循环次数为每个线程的执行次数 

添加http请求行为

设置请求路径和编码格式 (utf8)

 添加响应结果监听器

 启动线程组

查看结果树,有一个成功,因为设置了sentinel流控设置了一秒只能访问一次这个接口

查看聚合报告

 流控模式

  1. 直接模式:统计当前资源的请求,触发阈值对当前资源直接限流,也就是默认的模式
  2. 关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
  3. 链路模式:统计从指定链路访问到本资源的请求,触发阈值时,对指定的链路限流

直接模式

对这个接口每秒钟只能访问五次 

设置在2秒内创建20个线程,即一秒10个线程,期望的结果就是每秒钟有五个线程访问这个接口成功 

 

关联模式

 统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流

使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改会争抢数据库锁,就会产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务进行限流

 写资源优先,一旦写资源达到阈值,就会对读资源的操作进行限流,因为写资源优先

例子:

写两个接口,一个查询,一个更新

@GetMapping("query")
    public String query() {
        return "查询订单";
    }
    @GetMapping("update")
    public String update(){
        return "更新订单";
    }

 配置流控规则:当/order/update 资源被访问的QPS超过5时,对/order/query资源进行限流

在/order/query的流控按钮中编写 

 在jmeter中测试,一秒创建10个线程去访问/order/update,这样一来已经超过了QPS阈值(一秒只能访问5次),最后sentinel对/order/query进行限流

 

链路模式 

链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。

配置示例

例如有两条请求链路:

  • /test1 --> /common

  • /test2 --> /common

如果只希望限制从/test2进入到/common的请求,而限制从/test1开始的,则可以这样配置:

实战案例

需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。

步骤:

  1. 在OrderService中添加一个queryGoods方法,不用实现业务

  2. 在OrderController中,改造/order/query端点,调用OrderService中的queryGoods方法

  3. 在OrderController中添加一个/order/save的端点,调用OrderService的queryGoods方法

  4. 给queryGoods设置限流规则,从/order/query进入queryGoods的方法限制QPS必须小于2

 注意:需要给queryGoods方法使用SentinelResourse注解,让sentinel知道这个方法也是一个资源,sentinel默认只会把使用SpringMVC注解的方法当作资源

  //让sentinel知道这个方法也是一个资源,因为sentinel默认只会把使用SpringMVC注解的方法当作资源
    @SentinelResource("goods")
    public void queryGoods(){
        System.out.println("查询商品");
    }

在链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进入SpringMVC的所有请求设置同一个root资源,会导致链路模式失效。

我们需要关闭这种对SpringMVC的资源聚合,修改order-service服务的application.yml文件:

spring:
  cloud:
    sentinel:
      web-context-unify: false # 关闭context整合

 给/order/query的goods资源做链路限制

 结果:

通过/order/save访问的goods资源不受限制

通过/order/query访问的goods资源每一秒只能访问2次

总结:

直接:直接当前资源进行限流

关联:如果高优先级资源 触发阈值,就对低优先级资源进行限制

链路:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流

流控效果 

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

  • 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。

  • warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值(自己规定的)。

  • 排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长

warm up

阈值一般是一个微服务能承担的最大QPS,但是一个服务刚刚启动时,一切资源尚未初始化(冷启动),如果直接将QPS跑到最大值,可能导致服务瞬间宕机。

warm up也叫预热模式,是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor,持续指定时长后,逐渐提高到maxThreshold值。而coldFactor的默认值是3.

例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10.

 配置流控规则:

排队等待

当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。

而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。

工作原理

例如:QPS = 5,意味着每200ms(阈值的时间间隔)处理一个队列中的请求;timeout = 2000,意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。

那什么叫做预期等待时长呢?

比如现在一下子来了12 个请求,因为每200ms执行一个请求,那么:

  • 第6个请求的预期等待时长 = 200 * (6 - 1) = 1000ms
  • 第12个请求的预期等待时长 = 200 * (12-1) = 2200ms

现在,第1秒同时接收到10个请求,但第2秒只有1个请求,此时QPS的曲线这样的:

 

如果使用队列模式做流控,所有进入的请求都要排队,以固定的200ms的间隔执行,QPS会变的很平滑:

案例

需求:给/order/{orderId}这个资源设置限流,最大QPS为10,利用排队的流控效果,超时时长设置为5s

QPS设置为每秒处理十个请求,并设置超时时间为5s

 jmeter测试为每秒创建15个线程去请求接口,如果是之前的流控效果,那么每一秒就会有五个请求是直接失败的。而我们当前使用的是排队等待模式,这个模式会把所有请求返到一个队列中,然后按照先后顺序处理队列中的请求(设置的QPS阈值为10,即可以1s处理10个请求,那么就是100ms处理队列中一个请求),当然这个队列也是有长度限制的,假设这个长度n,那么(n-1)*100=5000,n=499,因为最大延时延时等待的时间为5000ms,所以这个队列最多只能存499个请求,超过499个就会不处理这个请求

总结:

快速失败:QPS超过阈值时,直接拒绝新的请求

warm up:QPS超过阈值时,也是直接拒绝新的请求 ;但是QPS的阈值时逐渐提升的,可以避免冷启动时高并发导致服务宕机

排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时间大于超时时间,直接拒绝。队列的长度为 (n-1)*时间间隔=超时时间,n为长度

热点参数限流 

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。

之前的限流是直接通过访问某一个接口资源的请求数来判断是否到达阈值的,而热点参数限流是通过同一个路径下的不同路径参数(如/order/{orderId})来分别判断是否到达阈值 

案例需求:给/order/{orderId}这个资源添加热点参数限流,规则如下:

•默认的热点参数规则是每1秒请求量不超过2

•给102这个参数设置例外:每1秒请求量不超过4

•给103这个参数设置例外:每1秒请求量不超过10

注意事项:热点参数限流对默认的SpringMVC资源无效,需要利用@SentinelResource注解标记资源

 1.给接口使用@SentinelResource注解,标记为资源

//要在这个接口设置热点资源限流,需要使用@SentinelResource,不然不成功
    @SentinelResource("hot")
    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
       System.out.println(commonName);
        // 根据id查询订单并返回
        return orderService.queryOrderById(orderId);
    }


2.配置热点参数限流规则

 进行热点参数限流的资源叫hot,参数索引就是资源路径中需要进行限流的参数所在路径中的路径(从0开始),如/order/{orderId},orderId就是索引为0单机阈值设置为2就是其他默认的参数置QPS都是2,然后选择高级选项,参数类型设置为long,因为orderId类型为Long,然后参数值为103的QPS单独设置为10,参数为102的QPS单独设置为4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】冯诺依曼体系、再谈操作系统

目录 一、冯诺依曼体系结构&#xff1a; 1、产生&#xff1a; 2、介绍&#xff1a; 二、再谈操作系统&#xff1a; 1、为什么要管理软硬件资源&#xff1a; 2、操作系统如何进行管理&#xff1a; 3、库函数&#xff1a; 4、学习操作系统的意义&#xff1a; 一、冯诺依曼…

斗破QT编程入门系列之二:GUI应用程序设计基础:UI文件(四星斗师)

斗破Qt目录&#xff1a; 斗破Qt编程入门系列之前言&#xff1a;认识Qt&#xff1a;Qt的获取与安装&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之一&#xff1a;认识Qt&#xff1a;初步使用&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之二&#xff1a;认识…

ffmpeg命令

1. 修改视频的数据速率 ffmpeg.exe -i video.mp4 -r 30 -c:v libx264 -b:v 1500k output.mp42. mp4与h264互相转换 ffmpeg.exe -i a.mp4 -vcodec h264 output.h264 ffmpeg.exe -i output.h264 -vcodec mpeg4 output.mp4

前端三件套-css

一、元素选择器 元素选择器&#xff1a;利用标签名称。p,h1-h6...... 行内样式&#xff08;内联样式&#xff09;&#xff1a;例如<p style"color:red;font-size:50px"> id选择器&#xff1a;针对某一个特定的标签来使用。以#定义。 class&#xff08;类&a…

c++设计模式demo

模式设计原则 依赖倒置原则 ⾼层模块不应该依赖低层模块&#xff0c;⼆者都应该依赖抽象 &#xff1b; 抽象不应该依赖具体实现&#xff0c;具体实现应该依赖于抽象&#xff1b; ⾃动驾驶系统公司是⾼层&#xff0c;汽⻋⽣产⼚商为低层&#xff0c;它们不应该互相依赖&#x…

操作系统学习笔记-4.1文件管理

文章目录 文件的逻辑结构1. 顺序结构特点应用场景示例 2. 索引结构特点应用场景示例 3. 链接结构特点应用场景示例 总结 文件目录文件的物理结构1. 连续分配&#xff08;Contiguous Allocation&#xff09;2. 链接分配&#xff08;Linked Allocation&#xff09;隐式链接 3. 索…

ES文档:文档操作_doc(7.9.2)

用心记录技术&#xff0c;走心分享&#xff0c;始于后端&#xff0c;不止于后端&#xff0c;励志成为一名优秀的全栈架构师&#xff0c;真正的实现码中致富。 ElasticSearch文档的操作&#xff1b; 添加文档 新建一个索引 goboy-blog&#xff0c;如果添加文档索引不存在则会创…

深入解析 WinForms MVVM 模式中的事件驱动与数据驱动

前言 在传统的 WinForms 开发中&#xff0c;事件驱动模型&#xff08;Event-Driven Model&#xff09;是核心&#xff0c;它通过控件的事件&#xff08;如点击按钮、改变文本等&#xff09;触发业务逻辑。然而&#xff0c;MVVM 模式引入了数据驱动&#xff08;Data-Driven&…

Python中的 if __name__ == ‘__main__

在Python中&#xff0c;if __name__ __main__: 这行代码有一个特定的用途和含义。为了理解它&#xff0c;我们需要先了解Python中的__name__变量以及Python脚本是如何执行的。 __name__变量 每个Python模块&#xff08;python文件&#xff09;都有一个内置的属性__name__。当…

【系统面试篇】进程与线程类(2)(笔记)——进程调度、中断、异常、用户态、核心态

目录 一、相关面试题 1. 进程的调度算法有哪些&#xff1f; 调度原则 &#xff08;1&#xff09;先来先服务调度算法 &#xff08;2&#xff09;最短作业优先调度算法 &#xff08;3&#xff09;高响应比优先调度算法 &#xff08;4&#xff09;时间片轮转调度算法 &am…

大数据工具 flume 的安装配置与使用 (详细版)

参考网址&#xff1a;Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了 1&#xff0c;上传安装包 安装包链接&#xff1a;文件下载-奶牛快传 Download &#xff5c;CowTransfer 口令&#xff1a;x8bhcg 1&#xff0c;切换盘符到安装目录 cd /opt/moudles 解压文件…

使用uni-app框架开发各种web前端程序

使用uni-app框架开发各种web前端程序是目前非常流程的开发方式&#xff0c;比如开发APP、小程序、H5等等&#xff0c;是一个使用 vue 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到ios&#xff0c;安卓、H5、以及各种小程序&#xff08;微信、支付…

鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)

在鸿蒙ArkTS中&#xff0c;布局容器组件有很多&#xff0c;常见的有&#xff1a;   ⑴ Column&#xff1a;&#xff08;垂直布局容器&#xff09;&#xff1a;用于将子组件垂直排列。   ⑵ Row&#xff1a;&#xff08;水平布局容器&#xff09;&#xff1a;用于将子组件水…

简单介绍一下mvvm mvc mvp以及区别、历史

MVC&#xff08;Model - View - Controller&#xff09; 因MVC架构的灵活性&#xff0c;架构图形式很多&#xff0c;仅供参考 历史&#xff1a; MVC 是最早出现的软件架构模式之一&#xff0c;其历史可以追溯到 20 世纪 70 年代&#xff0c;最初被用于 Smalltalk - 80 环境。…

黑马程序员linux学习【持续更新】

Linux基础 一、Linux简介 1.分类 不同领域的主流操作系统&#xff0c;主要分为下 几类&#xff1a;桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。 桌面操作系统 操作系统特点Windows用户数量最多MacOS操作体验好&#xff0c;办公人士首选Linux用户数…

Vert.x,应用监控 - 全链路跟踪,基于Zipkin

关于Zipkin Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System)&#xff0c;能够收集服务间调用的时序数据&#xff0c;提供调用链路的追踪。Zipkin每一个调用链路通过一个trace id来串联起来&#xff0c;通过trace id&#xff0c;就能够直接定位到这次调…

ENSP作业——园区网

题目 根据上图&#xff0c;可得需求为&#xff1a; 1.配置交换机上的VLAN及IP地址。 2.设置SW1为VLAN 2/3的主根桥&#xff0c;设置SW2为VLAN 20/30的主根桥&#xff0c;且两台交换机互为主备。 3.可以使用super vlan。 4.上层通过静态路由协议完成数据通信过程。 5.AR1作为企…

从壹开始解读Yolov11【源码研读系列】——Data.dataset.py:模型训练数据预处理/YOLO官方数据集类——YOLODataset

【前情回顾】在上一篇文章记录了YOLO源码data目录下的 base.py 文件&#xff0c;其中定义了一个可灵活修改的数据加载处理基类——Class BaseDataset 灵活基类博文地址&#xff1a;https://blog.csdn.net/qq_58718853/article/details/143249295 【实验代码】所有实验代码上传至…

HFSS 3D Layout中Design setting各个选项的解释

从HFSS 3D LAYOUT菜单中&#xff0c;选择Design Settings打开窗口&#xff0c;会有六个选项&#xff1a;DC Extrapolation, Nexxim Options, Export S Parameters, Lossy Dielectrics, HFSS Meshing Method, and HFSS Adaptive Mesh. DC Extrapolation 直流外推 直流外推分为标…

【板栗糖GIS】——如果安装的vscode版本落后了,如何无障碍更新

【板栗糖GIS】——如果安装的vscode版本落后了&#xff0c;如何无障碍更新 今天想安装新扩展插件时发现vscode版本有点旧&#xff0c;于是在不影响插件的情况下更新。 打开vscode软件&#xff0c;点击设置检查更新&#xff0c;如果有需要更新的直接安装到原目录&#xff0c;如…