微服务韧性工程:利用Sentinel实施有效服务容错与限流降级

       

目录

一、雪崩效应

二、Sentinel 服务容错

        2.1 Sentinel容错思路

        2.2 内部异常兼容

        2.3 外部流量控制

三、Sentinel 项目搭建

四、Sentinel 工作原理


        服务容错是微服务设计中一项重要原则和技术手段,主要目标是在服务出现故障、网络波动或其他不可预见的异常情况下,保证系统的稳定性和可靠性,防止局部故障引起雪崩效应,影响整个系统的正常运行。

        下面首先看下,如果没有服务容错时,什么是服务雪崩。

一、雪崩效应

        假如有一个微服务系统,这个系统由4个微服务组成,分别是 ABCD,这4个服务以集群的方式构成。如下图:

        服务 A 会向服务 BC发起调用,而服务 BC 又会去调用服务 D,也就是说服务 ABC 都直接或间接的依赖服务 D。由于服务 D 底层依赖了数据库,有读写请求。如果服务 D 在进行 CRUD 时,执行了一个慢 SQL 语句,那么一次 DB 操作的执行时间会比较长。如果并发量比较小,这当然没什么问题,一旦并发量大了,堆积起来后,性能问题就会被逐渐放大。

        这种情况下,数据库的连接资源就会被服务 D 迅速耗尽,进而导致服务D接口响应时间变长,接口超时的情况越来越多。由于上游请求还在源源不断的到达服务 D,所以接口超时情况会迅速传到到服务 B 和服务 C,进而又影响到服务 A,导致整个微服务集群不可用。

        来自服务 D 的底层故障,如果不能得到有效处理,那么故障就会想滚雪球一样被迅速放大,进而出现服务雪崩。那么如何来防范服务雪崩呢?这时服务容错限流就登场了。

二、Sentinel 服务容错

        Sentinel 是 Spring Cloud Alibaba 的一款服务容错组件,它是阿里巴巴双十一大促核心场景的保护神,内置了丰富的服务容错应用场景。它以流量作为切入点,通过各种内外防控手段达到维持服务稳定性的目的。

        2.1 Sentinel 容错思路

        就拿服务雪崩的场景来说,这种场景主要有两个主要因素:

  • 一个是外部的流量突然增多,超过了集群的吞吐量。
  • 另一个是内部各种未知异常导致的接口异常超时。

        既然知道了这两个因素,那就分别来解决处理这两个因素。

        2.2 内部异常兼容

        在 Sentinel 中,我们可以采用降级熔断的方式来处理内部异常。

        所谓降级,当服务调用发生了响应超时、服务异常等情况时,在服务内部可以执行一段降级逻辑。

        在降级逻辑中,你可以选择静默处理,即忽略掉异常继续处理后续业务逻辑,或者你可以返回一个让业务能继续进行下去的结果,还可以在降级逻辑中尝试、或者恢复异常服务。这里可以看出,降级针对的是单次服务调用异常而执行的逻辑

        所谓熔断,是指当异常调用量达到一定数量或判定条件,比如达到了一个设置的阈值、窗口时间内降级请求当道设置的阈值情况下,微服务在一段时间内停止对目标服务发起调用,所有来访请求直接执行降级逻辑。所以,熔断是多次服务调用异常累积的结果

        可以看出当服务进入了熔断状态以后,当前服务对下游的调用就停止了,这样一来就大大降低了对下游服务的压力。

        关于熔断降级的设置,在主链路的服务商一定要设置,防止出现服务雪崩。关于降级的判定条件,需要结合压测数据来进行判定,以达到最佳的吞吐量。

        2.3 外部流量控制

        提到流量控制,一定会想到限流。没错,限流是流量整形方案的一种。在 Sentinel 中可以根据集群处理能力,为每个服务设置一个限流规则,从 QPS 维度或者并发线程数维度控制外部流量访问。一旦流量超过阈值,后续请求就会被"fast fail",这时常用的方案。但 Sentinel 中不只这一种限流方案。

        从流量整形整形效果来看,除了限流外,还可以再 Sentinel 中选择预热模型排队模型。 

  • 预热模型:在一段时间内预热时间窗口,由低到高逐渐拉高流量阈值,直到达到最高的阈值为止。
  • 排队模型:如果访问量超过了设置的阈值,服务请求不会被立即失败,而是放入一个队列中等待处理,如果服务请求在预设的超时时间内仍未被处理,就会被移除队列      

        限流的效果其实要好于熔断,熔断是请求已经进来了,但是处理不了,所以也会消耗系统资源,如 CPU 等。而限流是将请求挡在了服务的外面,它的投入产出比较高。

三、Sentinel 项目搭建

        添加依赖

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

        配置 Sentinel,在配置文件中配置 Sentinel 相关属性

spring.cloud.sentinel.transport.dashboard=localhost:8080

        启动 Sentinel 控制台,通过控制台来配置和管理 Sentinel 规则。

        启动服务,此时会自动接入 Sentinel,并在控制台上能能看到应用作为数据源出现。这样请求过来就能根据配置进行限流了。

四、Sentinel 工作原理

        先看下官方提供的流程图,可以看出请求流程。

            在 Sentinel 世界中,万物都是可以被保护的"资源",当一个外部请求想要访问 Sentinel 的资源时,便会创建一个 Entry 对象。每一个 Entry 对象都会经历好多环节,经过 Slot 链路的层层考验最终完成自己的业务逻辑,可以把 Slot 理解成一个个的 Filter,这是典型的职责链设计模式。

        分布在 SlotChain 中的各个 Slot 各司其职,这些 Slot 通过相互配合的方式执行了各项检查任务。比如有的 Slot 负责数据统计,有的负责做限流降级处理。

        在这些 Slot 中,有几个是被专门用来收集数据的。比如,NodeSelectorSlot 被用来构建当前请求的访问路径,它将上下游调用链串联起来,形成了一个服务调用关系的树状结构。而 ClusterBuilderSlot 和 StatisticSlot 这两个 Slot 会从多个维度统计一些运行期信息,比如接口响应时间、服务 QPS、当前线程数等等。

        由这几个 Slot 统计出来的结果,会为后续的限流降级等 Sentinel 策略提供数据支持。比如说我想为指定的链路定义 QPS 维度的限流策略,那么这个限流策略在执行阶段就需要获取到这些统计数据,作为决策依据。

        除此之外,Sentinel 的 Slot 机制也具备一定的扩展性,如果你想要添加一个自定义的 Slot,我们可以通过实现 ProcessorSlot 接口来完成,而且你还可以通过优先级调整各个 Slot 之间的执行顺序。

        总的来说,Sentinel 是保障微服务架构稳定性和高可用性的关键组件,对于构建大型分布式系统来说尤为重要。通过它,可以更好地实现服务治理,降低系统风险,提升服务质量。

往期经典推荐

决胜微服务架构:OpenFeign轻量级REST客户端的魅力解析-CSDN博客

一文看懂Nacos如何实现高效、动态的配置中心管理-CSDN博客

Spring Cloud + Nacos 引领服务治理新航向-CSDN博客

Spring Cloud全方位解读——构建微服务架构的利器-CSDN博客

SpringBoot项目并发处理大揭秘,你知道它到底能应对多少请求洪峰?-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷题日记——约数的个数KY3

分析 用例的0超过9个&#xff0c;需要使用long long&#xff0c;为了保险&#xff0c;我用的是unsigned long long判断约数有这样的规律&#xff1a;任何正整数a&#xff0c;如果存在约数对<m,n>&#xff0c;即amn&#xff0c;设mmin{m,n},nmax{m,n}&#xff0c;即设m是…

数据库备份.....

一.环境准备 数据库备份&#xff0c;数据库为school&#xff0c;素材如下 >create database school; >use school1.创建student和score表CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , bi…

【论文阅读】Mamba:选择状态空间模型的线性时间序列建模(一)

文章目录 Mamba:选择状态空间模型的线性时间序列建模介绍状态序列模型选择性状态空间模型动机&#xff1a;选择作为一种压缩手段用选择性提升SSM 选择性SSM的高效实现先前模型的动机选择扫描总览&#xff1a;硬件感知状态扩展 Mamba论文 Mamba:选择状态空间模型的线性时间序列建…

SaulLM-7B: A pioneering Large Language Model for Law

SaulLM-7B: A pioneering Large Language Model for Law 相关链接&#xff1a;arxiv 关键字&#xff1a;Large Language Model、Legal Domain、SaulLM-7B、Instructional Fine-tuning、Legal Corpora 摘要 本文中&#xff0c;我们介绍了SaulLM-7B&#xff0c;这是为法律领域量…

服务器-->网站制作-->接口开发,一篇文章一条龙服务(1)

作者&#xff1a;q: 1416279170v: lyj_txd前述&#xff1a;本人非专业&#xff0c;兴趣爱好自学自研&#xff0c;很多没有说清楚的地方见谅&#xff0c;欢迎一起讨论的小伙伴~ 概述 不想看概述&#xff0c;直接点击服务器部分 三者之间的关系 服务器、网站制作、接口开发这…

Redis进阶--一篇文章带你走出Redis

目录 什么是Redis?? Redis有哪些使用场景? Redis是单线程还是多线程? 为什么Redis是单线程速度还是很快?? Redis持久化 RDB机制:(Redis DataBase) [是redis中默认的持久化方式] AOF机制:(Append Only File) Redis和MySQL如何保持数据一致????…

NodeJS实现堆排序算法

NodeJS实现堆排序算法 以下是使用 Node.js 实现堆排序算法的示例代码&#xff1a; // 堆排序函数 function heapSort(arr) {// 构建最大堆buildMaxHeap(arr);// 依次取出最大堆的根节点&#xff08;最大值&#xff09;&#xff0c;并调整堆结构for (let i arr.length - 1; i…

STM32 SDRAM知识点

1.SDRAM和SRAM的区别 SRAM不需要刷新电路即能保存它内部存储的数据。而SDRAM&#xff08;Dynamic Random Access Memory&#xff09;每隔一段时间&#xff0c;要刷新充电一次&#xff0c;否则内部的数据即会消失&#xff0c;因此SRAM具有较高的性能&#xff0c;但是SRAM也有它…

c#递归函数

在 C#中&#xff0c;递归函数是指在函数内部直接或间接调用自身的函数。递归函数在解决一些问题时非常有用&#xff0c;例如遍历树形结构、递归计算等。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks…

分享axios+MQTT简单封装示例

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在19…

二维码门楼牌管理系统在教育领域的应用及其优势

文章目录 前言一、二维码门楼牌管理系统概述二、教育领域的应用场景三、二维码门楼牌管理系统的优势四、结语 前言 随着信息技术的快速发展&#xff0c;二维码门楼牌管理系统在教育领域的应用越来越广泛。该系统不仅提高了地址信息的准确性&#xff0c;还为学校、家长和教育工…

关于华为昇腾(Ascend)AI芯片,CANN计算架构,MindSpore深度学习框架,MindStudio开发工具

1、华为昇腾生态 深度学习之前的配置都是&#xff1a;NVIDIA GPU / CPU CUDA Tensorflow/PyTorch 后来老美禁止 NVIDIA 卖GPU芯片给我们&#xff0c;于是国内企业开始发力CPU和GPU硬件&#xff0c;成果丰硕&#xff0c;虽然与NVIDIA顶级GPU还有一些差距&#xff0c;但是也不…

eclipse搭建java web项目

准备条件 eclipsejdk1.8 &#xff08;配置jdk环境&#xff09;apache-tomcat-8.5.97&#xff08;记住安装位置&#xff09; 一 点击完成 开始创建javaweb项目 import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.s…

【经典案例】某大型公园构建检查监督机制项目纪实

——引入网格化监督管理机制&#xff0c;实现责任、人员、信息三位一体 公园管理由于其本身地域范围广的特性在工作中很难进行有效的监督检查&#xff0c;该公园的监督检查由不同的部门分别负责&#xff0c;同部门检查时往往会处于情面而使检查流于形式&#xff0c;并且公园的监…

Media Encoder 2024:未来媒体编码的新纪元 mac/win版

随着科技的飞速发展&#xff0c;媒体内容已成为我们日常生活中不可或缺的一部分。为了满足用户对高质量视频内容不断增长的需求&#xff0c;Media Encoder 2024应运而生&#xff0c;它凭借卓越的技术和创新的特性&#xff0c;重塑了媒体编码的未来。 Media Encoder 2024软件获…

嵌入式学习day34 网络

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK 2.在通信过程中通过序列号和确认号保障数据传输的完整性 本次发送序列号:上次…

LeetCode Python - 42.接雨水

目录 题目答案运行结果 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组…

【网站项目】096实验室开放管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Java面试——Netty

优质博文&#xff1a;IT-BLOG-CN 一、BIO、NIO 和 AIO 【1】阻塞 IO(Blocking I/O)&#xff1a; 同步阻塞I/O模式&#xff0c;当一条线程执行 read() 或者 write() 方法时&#xff0c;这条线程会一直阻塞直到读取一些数据或者写出去的数据已经全部写出&#xff0c;在这期间这条…

泛微OA服务器获取 token

泛微OA服务器获取 token 文章目录 泛微OA服务器获取 token一、泛微官方方法1 ecology 系统配置2 发放/生成许可证(appid)3 限制许可证使用ip地址&#xff08;该步骤也可以跳过&#xff09;4 使用 postman 注册5 获取 token6 访问业务系统接口 二、java 代码获取 token三、封装到…