【Spring Cloud】Sentinel流量限流和熔断降级的讲解

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

目录

前言

服务雪崩效应

一、常见的容错方案

二、Sentinel入门

1.什么是Sentinel

2.Sentinel 分为两个部分

3.微服务集成Sentinel

三、安装Sentinel控制台

实现一个接口的限流

四、Sentinel规则

流控规则

①简单配置

②配置流控模式

③链路流控模式

配置流控效果

五、Feign整合Sentinel

前言

在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪(雪崩)。

接下来,我们来模拟一个高并发的场景

①编写java代码

@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private IFeignProductService feignProductService;

    @RequestMapping("/findByParameter")
    public String findByParameter(String name,Double price){
        log.info("服务消费者日志:name={},price={}",name,price);
        return feignProductService.findByParameter(name,price);
    }
}

②修改配置文件中tomcat的并发数

1秒钟20个请求,最大连接数10,最大等待数10,最大线程数2,相当于一个线程1s能处理5个请求(2个处理10个请求)

server:
  port: 8091
  tomcat:
    max-threads: 2     #最大线程数
  max-connections: 10  #最大连接数
  accept-count: 10     #最大线程等待数

如果我1s发送5个以上的请求,此时会发现, 由于order方法囤积了大量请求, 导致message方法的访问出现了问题,这就是服务雪崩的雏形。

服务雪崩效应

在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了 问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等 待,进而导致服务瘫痪。 由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是 服务故障的 “雪崩效应” 。

雪崩发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某 台机器的资源耗尽。我们无法完全杜绝雪崩源头的发生,只有做好足够的容错,保证在一个服务发生问 题,不会影响到其它服务的正常运行。也就是"雪落而不雪崩"。  

一、常见的容错方案

要防止雪崩的扩散,我们就要做好服务的容错,容错说白了就是保护自己不被猪队友拖垮的一些措 施, 下面介绍常见的服务容错思路和组件。 常见的容错思路 常见的容错思路有隔离、超时、限流、熔断、降级这几种,下面分别介绍一下。

  • 隔离 它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务。常见的隔离方式有:线程池隔离和信号量隔离。

  • 超时 在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。

  • 限流 限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到 的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。

  • 熔断 在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整 体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断

服务熔断一般有三种状态:

  • 熔断关闭状态(Closed) 服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制
  • 熔断开启状态(Open) 后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
  • 半熔断状态(Half-Open) 尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断启动状态。
  • 降级 降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托底方案。

常见的容错组件

  • Hystrix Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止 级联失败,从而提升系统的可用性与容错性。

  • Resilience4J Resilicence4J一款非常轻量、简单,并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推 荐的替代产品。不仅如此,Resilicence4j还原生支持Spring Boot 1.x/2.x,而且监控也支持和 prometheus等多款主流产品进行整合。

  • Sentinel Sentinel 是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。

    下面是三个组件在各方面的对比:

SentinelHystrix
隔离策略信号量隔离线程池隔离/信号量隔离
熔断降级策略基于响应时间或失败比率基于失败比率
实时指标实现滑动窗口滑动窗口(基于 RxJava)
规则配置支持多种数据源支持多种数据源
扩展性多个扩展点插件的形式
基于注解的支持即将支持支持
限流基于 QPS,支持基于调用关系的限流不支持
流量整形支持慢启动、匀速器模式不支持
系统负载保护支持不支持
控制台开箱即用,可配置规则、查看秒级监控、机器发现等不完善
常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC 等Servlet、Spring Cloud Netflix

二、Sentinel入门

1.什么是Sentinel

Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量 为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。 Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景, 例如秒杀(即 突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

  • 完备的实时监控:Sentinel 提供了实时的监控功能。通过控制台可以看到接入应用的单台机器秒 级数据, 甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块, 例如与 Spring Cloud、Dubbo、gRPC 的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

2.Sentinel 分为两个部分

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等 应用容器。

3.微服务集成Sentinel

为微服务集成Sentinel非常简单, 只需要加入Sentinel的依赖即可,在需要的模块pom.xml中加入下面依赖

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

网关gateway集成sentinel,需还另添加以下依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

另外编写一个Controller测试使用

(我这里就直接用我之前讲解组件所写的生产服务和消费服务做模拟,以下是我生产服务的代码)

@RestController
public class ProduceController {
    @RequestMapping("/run")
    public String run() {
        return "🍗";
    }
}

三、安装Sentinel控制台

Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能。

①下载jar包,解压到文件夹 Releases · alibaba/Sentinel · GitHub

②启动控制台

# 直接使用jar命令启动项目(控制台本身是一个SpringBoot项目)
java -Dserver.port=9999 -Dcsp.sentinel.dashboard.server=localhost:9999 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar

#参考1
java -jar sentinel-dashboard-1.8.1.jar --server.port=8080
#参考2
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

③修改shop-order ,在里面加入有关控制台的配置

   sentinel:
      transport:
        port: 8719
        dashboard: localhost:9999
      eager: true
      web-context-unify: false

④通过浏览器访问localhost:9999进入控制台 ( 默认用户名密码是 sentinel/sentinel )

 补充:

了解控制台的使用原理 Sentinel的控制台其实就是一个SpringBoot编写的程序。我们需要将我们的微服务程序注册到控制台上,即在微服务中指定控制台的地址, 并且还要开启一个跟控制台传递数据的端口, 控制台也可以通过此端口调用微服务中的监控程序获取微服务的各种信息。

实现一个接口的限流

1 通过控制台为message1添加一个流控规则

2 通过控制台快速频繁访问, 观察效果

四、Sentinel规则

流控规则

流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时 对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 第1步: 点击簇点链路,我们就可以看到访问过的接口地址,然后点击对应的流控按钮,进入流控规则配置页面。新增流控规则界面如下:

资源名:唯一名称,默认是请求路径,可自定义 针对来源:指定对哪个微服务进行限流,默认指default,意思是不区分来源,全部限制 阈值类型/单机阈值

  • QPS(每秒请求数量): 当调用该接口的QPS达到阈值的时候,进行限流

  • 线程数:当调用该接口的线程数达到阈值的时候,进行限流

是否集群:暂不需要集群 接下来我们以QPS为例来研究限流规则的配置。

①简单配置

我们先做一个简单配置,设置阈值类型为QPS,单机阈值为3。即每秒请求量大于3的时候开始限流。 接下来,在流控规则页面就可以看到这个配置。

然后快速访问/order/message1 接口,观察效果。此时发现,当QPS > 3的时候,服务就不能正常响应,而是返回Blocked by Sentinel (flow limiting)结果。

配置流控模式

点击上面设置流控规则的编辑按钮,然后在编辑页面点击高级选项,会看到有流控模式一栏。

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

  • 直接(默认):接口达到限流条件时,开启限流

  • 关联:当关联的资源达到限流条件时,开启限流 [适合做应用让步]

  • 链路:当从某个接口过来的资源达到限流条件时,开启限流

 下面呢分别演示三种模式:

直接流控模式 直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。上面案例使用的就是直接流控模式。

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

第1步:配置限流规则, 将流控模式设置为关联,关联资源设置为的 /run2。

第3步:通过produce软件向/run2连续发送请求,注意QPS一定要大于3

第4步:访问/run2,会发现已经被限流

链路流控模式

链路模式是Sentinel流量控制框架中的一种模式,用于对特定的请求链路进行限流。在一个复杂的系统中,请求可能会经过多个服务或接口的调用链,而其中的某一个接口可能会成为整个链路的瓶颈,导致系统性能下降或者不可用。链路模式允许在该接口的流量达到限制条件时进行限流,以保护整个链路的稳定性。

第1步: 编写一个service,在里面添加一个方法message

@Service
 class OrderServiceImpl2 {
    @SentinelResource("message")
    public void message() {
    	System.out.println("message");
    }
}

第2步: 在Controller中声明两个方法,分别调用service中的方法message

@RestController
@Slf4j
public class OrderController5 {
    @Autowired
    private OrderServiceImpl2 orderService;
    @RequestMapping("/order/message1")
    public String message1() {
        orderService.message();
        return "message1";
	}
    @RequestMapping("/order/message2")
    public String message2() {
        orderService.message();
        return "message2";
    }
}

第3步:配置文件中将spring.cloud.sentinel.web-context-unify=true即可开启收敛

在 Web 应用中,同一个请求可能会有多种不同的 URL 地址和 HTTP 方法,例如 GET /user 和 POST /user 是两个不同的请求,但它们都是对用户资源的操作。如果不统一这些请求,会导致资源的重复计数,从而影响限流效果。因此,通过设置 web-context-unifytrue,Sentinel 可以将这些不同的请求统一为同一个资源,并对其进行流量控制。

 第4步: 控制台配置限流规则

 第5步: 分别通过/order/message1 和/order/message2 访问, 发现1没问题, 2的被限流了

配置流控效果

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

 

五、Feign整合Sentinel

①导入依赖

 <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 </dependency>

  ②在配置文件中开启Feign对Sentinel的支持

# 开启feign对sentinel的支持
feign:
  sentinel:
    enabled: true

   ③创建容错类

@Component
public class FeignUserServiceImpl implements FeignUserService {
    //容错类要求必须实现被容错的接口,并为每个方法实现容错方案
    @Override
    public String getByPath(String account) {
        //写入到自己的数据估值表中
        //程序员看到就会来处理
        return "容错类启动......";
    }

}

④为被容器的接口指定容错类

@FeignClient(value = "produce" ,fallback = FeignUserServiceImpl.class)
@Primary
public interface FeignUserService {

    @RequestMapping("/user/{account}")
    public String getByPath(@PathVariable(value = "account") String account);

}

在Spring Cloud中,使用Feign进行服务间的调用时,可以通过设置fallback属性来指定当请求失败或超时时的容错处理类。fallback属性是一个接口的实现类,它会在调用失败时被触发,以提供一个备用的处理逻辑。 

当我们正常调用localhost:8084/test01的时候就会响应相应的结果

如果我们访问的模块服务宕机了就会跳转到我们的容错类

 

我们容错类就会将请求信息进行保存等待我们模块服务正常后重新发送请求 

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

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

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

相关文章

【SAP-PP】生产订单导入问题--完成日期向前推了一天

问题描述&#xff1a; 在执行BAPI_PRODORD_CREATE生产订单导入的时候&#xff0c;发现填写入模板中的基本完成日期是12月31日&#xff0c;但是到具体工单时变成了12月30日 截图说明&#xff1a; 感觉很神奇&#xff0c;咋一看&#xff0c;真的是日期提前了一天&#xff0c;de…

线性回归实例

1、线性回归&#xff08;linear Regression&#xff09;和逻辑回归&#xff08;logistic Regression&#xff09;的区别 线性回归主要是用来拟合数据&#xff0c;逻辑回归主要是用来区分数据&#xff0c;找到决策边界。 线性回归的代价函数常用平方误差函数&#xff0c;逻辑回…

函数指针和回调函数

文章目录 一.函数指针1.什么是函数指针2.函数指针的形式3.函数指针的用途。1.调用函数2.作为参数进行传递 二.函数指针数组三.回调函数 一.函数指针 1.什么是函数指针 函数指针是指向函数的指针。在C语言和C中&#xff0c;函数指针可以用来存储函数的地址&#xff0c;并且可以…

Kotlin程序设计(二)面向对象

Kotlin程序设计中级篇 我们在前面已经学习了Kotlin程序设计的基础篇&#xff0c;本章我们将继续介绍更多Kotlin特性&#xff0c;以及面向对象编程。 函数 其实函数我们在一开始就在使用了&#xff1a; fun main() {println("Hello World") }我们程序的入口点就是…

恒创科技:解决Windows服务器磁盘空间不足的问题

​  服务器硬盘的大小是决定空间是否充足的主要因素。但在日常使用中&#xff0c;服务器和网站备份会消耗大量存储空间&#xff0c;如果维护不当&#xff0c;最终将耗尽您的容量。同样&#xff0c;日志文件、临时文件和数据库可以在硬盘驱动器上或回收站中无休止地建立。当您…

windows10使用Shift+Win+S快捷键来截图

有时候电脑上没有打开微信QQ等软件&#xff0c;但是想使用一下截图&#xff0c;就很麻烦&#xff0c;还好windows10开始已经支持快捷键截图了&#xff1a; 打开截图工具并获取屏幕截图 - Microsoft 支持 快捷键&#xff1a;ShiftWinS 使用教程&#xff1a; 顺带说下系统这个自…

Mingw32编译opencv库

文章目录 1. 准备工作2. 编译cmake构建程序mingw32-make编译 3. 安装4. 安装完的结果 注意&#xff1a; mingw32-make编译的库和MSVC编译的库不兼容&#xff0c;MSVC和mingw-make生成的动态库使用的是不同的ABI&#xff08;Application Binary Interface&#xff09;&#xff0…

货拉拉智能监控实践:如何解决多云架构下的故障应急问题?

一分钟精华速览 在月活超千万的大规模业务背景下&#xff0c;货拉拉遭遇了多云环境下的监控碎片化、规划无序等问题。为了应对这些挑战&#xff0c;货拉拉开发了一站式监控平台——Monitor。该平台的部署有效地实现了对核心应用的监控和报警全覆盖&#xff0c;显著提高了应急响…

【算法Hot100系列】组合总和

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【算法】七夕祭

题目 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。 于是 TYVJ 今年举办了一次线下七夕祭。 Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕&#xff0c;于是他们决定去 TYVJ 七夕祭游玩。 TYVJ 七夕祭和 11 区的夏祭的形式很像。 矩形的祭典会场由 N 排 M 列共…

作业--day45

定时播放 #include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MyWidget) {ui->setupUi(this);ui->bg_lab->setPixmap(QPixmap(":/pictrue/shanChuan.jpg"));ui->bg_…

装饰器模式

装饰器模式 什么是装饰器模式: 是一种结构型设计模型&#xff0c;允许在不改变对象结构的情况下&#xff0c;动态的将新的功能添加到对象上&#xff0c; 核心思想&#xff1a; 通过组合而非继承的方式来实现功能的扩展。他可以在运行时动态的添加活移除对象的功能&#xff…

刷题第十六天-扰乱字符串

扰乱字符串 题目要求 解题思路 初步分析 给定两个字符串T和S&#xff0c;假设T是由S变换而来的 如果T和S长度不一样&#xff0c;必定不能变来如果长度一样&#xff0c;顶层字符串S能够划分 S 1 S_1 S1​和 S 2 S_2 S2​&#xff0c;同样字符串T也能够划分为 T 1 T_1 T1​和…

[问题记录] vue-router中导航守卫默认跳转login失败

问题 做博客后台的时候发现一个问题&#xff0c;在没启动服务的情况下&#xff0c;后台在 router 中并未读取到配置的情况下&#xff0c;应该默认跳转 login 页面。但是页面始终不跳转&#xff0c;并且伴随多个执行错误弹窗。 router.beforeEach(async (to, from, next) >…

常见类型的yaml文件如何编写?--kind: Job|CronJob

本次介绍两个关联度很高的类型&#xff0c;Job和CronJob。 Job基本说明 在 Kubernetes 中&#xff0c;Job 是一种用于运行一次性任务的资源对象。它用于确保在集群内部执行某个任务&#xff0c;即使任务运行失败或其中一个 Pod 发生故障时&#xff0c;也会进行重试。Job 可以…

软件测试|使用Pytest、Allure Step和Allure Attach创建详细测试报告

引言 在软件开发过程中&#xff0c;测试是不可或缺的一部分。为了更好地展示测试结果并定位问题&#xff0c;结合Pytest测试框架和Allure测试报告工具可以创建清晰、详细的测试报告。本文将介绍如何使用Pytest、Allure的allure.step()和allure.attach()功能来创建具有丰富信息…

AI嵌入式K210项目(2)-开发环境搭建

文章目录 前言windows开发环境&#xff08;vscode&#xff09;VSCode下载安装CMake下载安装交叉编译器Toolchain下载安装SDK下载安装Kflash下载安装镜像烧录 总结 前言 该教程先介绍使用C语言进行裸机开发&#xff0c;完成这一部分的学习之后在介绍如何使用MicroPython进行开发…

Django 框架添加管理员,完成对普通用户信息管理

前情回顾&#xff1a;Django框架 完成用户登录注册 文章目录 1.创建管理员2.完善管理员功能2.1增加管理员登录功能2.2完善展示用户信息功能2.3完善修改用户信息功能2.4完善删除用户信息功能 1.创建管理员 一般管理员都是直接指定&#xff0c;不开放页面注册&#xff0c;可以直…

工程机械比例阀电流采集方案——IPEhub2与IPEmotion APP

自从国家实施一带一路和新基建计划以来&#xff0c;工程机械的需求量呈现出快速增长的趋势。而关于工程机械&#xff0c;其比例阀的控制问题不容忽视。比例阀是一种新型的液压控制装置——在普通压力阀、流量阀和方向阀上&#xff0c;用比例电磁铁替代原有的控制部分&#xff0…

大创项目推荐 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…