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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

第三十篇——微分(上):如何从宏观变化了解微观趋势?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 微分给我们带来的思维方式的变化&#xff0c;更加符合现在这个时代对于我…

Springboot项目报错记录

SpringBoot测试报错&#xff1a;Unable to find a SpringBootConfiguration, you need to use Context 该测试类所在测试包test下的包名和类路径java下的包名不一致导致的 引发以下报错 java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need…

VTK知识学习(3)-显示圆柱

1、添加显示控件 前台界面 <WindowsFormsHost x:Name"windowHost" Grid.Row"1"/> 构造函数中添加。 private RenderWindowControl renderWindowControl new RenderWindowControl();public MainWindow(){InitializeComponent();windowHost.Child …

《FreeRTOS的配置与临界段》

目录 1.FreeRTOS配置的重要性 2.初学者使用FreeRTOSConfig.h 文件 3.“INCLUDE_”开始的宏 4.FreeRTOS 中断配置和临界段 4.1 中断简介 4.2 中断优先级分组定义 4.3优先级设置 4.4 重要的中断屏蔽寄存器 一、PRIMASK 和 FAULTMASK 寄存器 二、BASEPRI 寄存器 4.5 F…

Vue:模板 MVVM

Vue&#xff1a;模板 & MVVM 模板插值语法指令语法 MVVMdefineProperty数据代理 模板 Vue实例绑定一个容器&#xff0c;想要向容器中填入动态的值&#xff0c;就需要使用模板语法。模板语法分为插值语法和指令语法。 插值语法 插值语法很简单&#xff0c;使用{{}}包含一…

极简实现酷炫动效:Flutter隐式动画指南第三篇自定义Flutter隐式动画

目录 前言 一、TweenAnimationBuilder 二、使用TweenAnimationBuilder实现的一些动画效果 1.调整透明度的动画 2.稍微复杂点的组合动画 3.数字跳动的动画效果 前言 上两节博客分别介绍了Flutter中的隐式动画的基础知识以及使用隐式动画实现的一些动画效果。当系统提供的隐…

熵基ZKTeco考勤机门禁如何重置密码(适用于大多数彩屏门禁机)

公司的一台门禁忘记密码了打不开&#xff0c;找了很久终于找到了密码重置的方法。 1、断电拆机(机器底部的螺丝,将机器从墙上拿下来) 2、插电重启&#xff08;或者杵下底部reset小孔&#xff09; 3、机器屏幕显示被拆除&#xff08;或右上角红色小感叹号闪烁&#xff0c;后者启…

​基于学习的地铁客流动态预测智能调度方法

1 文章信息 文章题为“A Learning Based Intelligent Train RegulationMethod With Dynamic Prediction forthe Metro Passenger Flow”&#xff0c;该文于2023年发表至“IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS”。文章的核心观点是提出了一种基于学习的智…

RNA-seq 差异分析的点点滴滴(1)

引言 本系列[1])将开展全新的转录组分析专栏&#xff0c;主要针对使用DESeq2时可能出现的问题和方法进行展开。 为何使用未经标准化的计数数据&#xff1f; DESeq2 工具包在接收输入时&#xff0c;期望得到的是未经处理的原始计数数据&#xff0c;比如从 RNA-seq 或其他高通量测…

Python初始环境搭建和Pycharm的安装

Python和PyCharm安装步骤 刚学习Python编程&#xff0c;按照书上的方法安装了Python和PyCharm&#xff0c;并做练习。但是今天PyCharm软件忽然不能使用了&#xff0c;不知道什么原因。于是&#xff0c;将这两个软件全部卸载&#xff0c;在网上查找软件安装方法&#xff0c;重新…

云上拼团GO指南——腾讯云博客部署案例,双11欢乐GO

知孤云出岫-CSDN博客 目录 腾讯云双11活动介绍 一.双十一活动入口 二.活动亮点 &#xff08;一&#xff09;双十一上云拼团Go (二&#xff09;省钱攻略 &#xff08;三&#xff09;上云&#xff0c;多类型服务器供您选择 三.会员双十一冲榜活动 (一)活动内容 &#x…

[ 常用工具篇 ] 使用 kali 实现 ARP 攻击 -- arpspoof 实战详解(ARP欺骗-断网攻击中间人攻击)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

无人机之飞行管控平台篇

无人机的飞行管控平台是一种基于互联网和物联网技术的智能管理系统&#xff0c;旨在实现对无人机飞行任务的全自动化、全过程化管理。 一、主要功能 飞行计划管理&#xff1a;用户可以通过平台提前设置好无人机的飞行计划&#xff0c;包括起飞时间、航线、飞行高度等信息。平…

C++ 继承

一. 继承的概念与定义 1.1. 继承的概念 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段&#xff0c;它允许程序员在 保 持原有类特性的基础上进行扩展 &#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承 呈现了面向对象…

【启程Golang之旅】深入理解 Protocol Buffers 及其应用

如果你是 Go 语言的开发者&#xff0c;理解如何在 Go 中使用 Protobuf&#xff0c;将帮助你大幅提升数据传输的效率&#xff0c;并实现更高性能的系统设计。 本篇文章将深入探讨 Go 语言中使用 Protobuf 的基础知识、常见应用以及最佳实践&#xff0c;带你一步步了解如何在项目…

vue3.5+版本 defineProps响应式解构,保留数据响应式

正确写法&#xff1a;直接通过 defineProps 结构可以保留响应式 let {num:numNew} defineProps({num: {} }) console.log(具有响应式,numNew); 错误写法&#xff1a;这样会丢失响应式 const props defineProps({num: {} }) let {num:numNew} props console.log(会丢失响…

直播 鸿蒙5.0面试必修技能之鸿蒙性能优化技术

一&#xff1a;行业分析&#xff1a; PC时代---互联网---移动互联网---大数据/人工智能---物联网 c/c/java/php--- andorid/ios/前端/hadoop(存储)/spark/flink【12-14年】 --- ArkTS 李兴平 hao123.com/ 网站:6w/day 06年 5000w卖给了百度 盛大传奇/ 腾讯 互联…

怎么能更好的通过驾考呢?

充分准备&#xff1a; 提前了解驾考内容和要求&#xff0c;包括理论知识、场地驾驶技能、道路驾驶技能和安全文明驾驶常识等。合理安排学习时间&#xff0c;确保有足够的时间进行学习和练习。理论学习&#xff1a; 认真阅读和理解驾考相关书籍和资料&#xff0c;特别是交通法规…

Notion + Python + scholarly = 超强文献管理助手

摘要&#xff1a;在科研文献管理中&#xff0c;研究人员常常需要维护自己的文献数据库&#xff0c;我使用 Notion-database 作为的文献数据库管理工具&#xff08;开源模板&#xff09;。Notion-based 的方法无法实时更新文章的引用量信息。我结合了 Notion Integration 和 sch…

Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法

Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法 起源 让我们从一个常见的Git错误开始&#xff1a; fatal: bad object refs/heads/master - 副本这个错误提示通常意味着Git在引用&#xff08;ref&#xff09;中发现了不一致或损坏的数据。引用是Git用…