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

news2024/9/23 13:20:33

       

目录

一、雪崩效应

二、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.coloradmin.cn/o/1502787.html

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

相关文章

5G 网络切片VLAN ID配置错误导致业务不可用

【摘要】随着电联5G共建共享工作的开展&#xff0c;无法及时有效观测到单逻辑站点的相关指标&#xff0c;导致单运营商用户业务出现异常。本案例中着重对单运营商用户无法使用网络进行相关参数排查&#xff0c;从KPI性能指标结合故障告警发生时间&#xff0c;从而分析由于网络切…

Web APIs 5 Window对象、本地存储

Web APIs 5 一、Window对象1、BOM2、定时器-延时函数3、JS执行机制4、location对象案例&#xff1a;5秒钟之后跳转的页面 5、navigator对象6、histroy对象 二、本地存储本地存储 localStorage本地存储 sessionStorage存储复杂数据类型案例&#xff1a;学生就业统计表字符串拼接…

光致发光谱荧光量子效率测量系统

荧光量子积分球是一个专门用于测量荧光量子效率的设备。荧光量子效率是指物质吸收光后所发射的荧光光子数与所吸收的激发光光子数之间的比值。这种设备通过比较待测荧光物质和已知荧光量子产率的参比物质&#xff0c;在相同激发条件下所测得的积分荧光强度&#xff08;即校正的…

微信小程序实现上拉加载更多

一、前情提要 微信小程序中实现上拉加载更多&#xff0c;其实就是pc端项目的分页。使用的是scroll-view&#xff0c;scroll-view详情在微信开发文档/开发/组件/视图容器中。每次上拉&#xff0c;就是在原有数据基础上&#xff0c;拼接/合并上本次上拉请求得到的数据。这里采用…

搜狐新闻Hybrid AI引擎端侧离线大语言模型探索

本文字数&#xff1a;3027字 预计阅读时间&#xff1a;20分钟 01 一、导读 • LLM 以及移动平台落地趋势 • 搜狐AI引擎内建集成离线可运行的GPT模型 • Keras 定制预训练模型 • TensorFlow Lite converter 迁移到移动设备 02 二、LLM 1.1什么是LLM L…

HTML入门:属性

你好&#xff0c;我是云桃桃。今天来聊一聊 HTML 属性写法和特点。 HTML 属性是用于向 HTML 标签&#xff08;也叫 HTML 元素&#xff09;提供附加信息或配置的特性。 如果说&#xff0c;把HTML 标签比作一个房子&#xff0c;HTML 标签定义了房子的结构和用途&#xff0c;比如…

蓝桥杯之【01背包模版】牛客例题展示

牛客链接 #include <bits/stdc.h> using namespace std; int n,V; const int N1010; int v[N],w[N]; int dp[N][N]; int main() {cin>>n>>V;for(int i1;i<n;i){cin>>v[i]>>w[i];}for(int i1;i<n;i){for(int j1;j<V;j){dp[i][j]dp[i-1][…

idea远程服务器debug

前提 本地代码和服务器代码一致 idea中创建远程服务 一般只需要修改ip&#xff0c;注意这边的端口是监听Socket的端口&#xff0c;不是服务的端口 然后把运行参数复制一下 -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 tomcat启动 在tomcat的lib下的c…

OJ_二叉排序树

题干 C实现 循环双指针法(一个指向父亲&#xff0c;一个指向待插入结点) #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <queue> using namespace std;struct TreeNode {char data;TreeNode* left;TreeNode* right; };void InsertBST(TreeNode* …

扩展黄永刚原始晶体塑性程序加入AF背应力模拟金属疲劳问题

参考文献&#xff1a;《Low-cycle fatigue life prediction of a polycrystalline nickel-base superalloy using crystal plasticity modelling approach》 在原始程序中修改流动方程&#xff0c;加入背应力项&#xff0c;引入运动硬化项&#xff0c;从而可以描述多晶金属循环…

智慧公厕系统的运作过程

智慧公厕是一种新型的未来城市公共厕所&#xff0c;通过物联网、互联网、大数据、云计算、自动化控制等技术&#xff0c;实现公共厕所使用、运营、管理、养护的全过程全方位信息化。 那么&#xff0c;智慧公厕是如何运作的&#xff1f;智慧公厕的运作过程包括什么技术&#xf…

悬浮工具球(仿 iphone 辅助触控)

悬浮工具球&#xff08;仿 iphone 辅助触控&#xff09; 兼容移动端 touch 事件点击元素以外位置收起解决鼠标抬起触发元素的点击事件问题 Demo Github <template><divref"FloatingBal"class"floating_ball":class"[dragging, isClick]&q…

【Docker4】使用Harbor搭建私有仓库

Docker私有仓库一、搭建本地私有仓库1、daemon.json 配置文件中常用配置项2、搭建私有仓库3、Docker容器重启策略 二、Docker--harbor私有仓库部署与管理1、Harbor 简介2、Harbor的特性3、Harbor的构成4、Harbor 部署4.1、部署 Docker-Compose 服务4.2、部署 Harbor 服务4.3、启…

OJ_判断两序列是否为同一二叉搜索树序列

题干 C实现 求出两棵树的中序和先序序列对比中序和先序序列是否相同 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string> #include <queue> using namespace std;struct TreeNode {char data;TreeNode* left;TreeNode* right; };void …

day17_订单(结算,提交订单,支付页,立即购买,我的订单)

文章目录 订单模块1 结算1.1 需求说明1.2 获取用户地址1.2.1 UserAddress1.2.2 UserAddressController1.2.3 UserAddressService1.2.4 UserAddressMapper1.2.5 UserAddressMapper.xml 1.3 获取购物项数据1.3.1 CartController1.3.2 CartService1.3.3 openFeign接口定义 1.4 环境…

VUE_nuxt启动只能通过localhost访问,ip访问不到:问题解决

修改项目根目录下的 package.json "config": {"nuxt": {"host": "0.0.0.0","port": "3000"} } 这样项目启动后就可以通过ip进行访问了

ViewModel

1.ViewModel的诞生与作用 Activity package com.tiger.viewmodel;import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.ViewModelProvider;import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Te…

Codeforces Round 929 (Div. 3)- ABCDEFG

A:Turtle Puzzle: Rearrange and Negate 思路&#xff1a; 将负的元素全部排到一起&#xff0c;然后对它们符号取反&#xff0c;然后求所有元素的和&#xff0c;此时就是最大值了。 代码&#xff1a; #include<iostream> using namespace std;void solve() {int n;cin&…

电脑资料管理软件(5个高效批量管理电脑资料的方法)

企业电脑资料管理是企业一大难题&#xff0c;为什么这样说&#xff1f; 首先&#xff0c;企业电脑资料的数量庞大且种类繁多。 其次&#xff0c;电脑资料的安全性和保密性要求高。 再者&#xff0c;电脑资料的管理涉及到多个部门和员工的协作。 ...... 针对此类情况很多企业…

Vue中的组件:构建现代Web应用的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…