科普文:科普文:springcloud之-Hystrix服务容错

Hystrix概念

Hystrix 服务容错保护 的概念和说明

这就是大名鼎鼎的:豪猪

豪猪的英文就是:Hystrix,国外一些大牛的程序员在给自己的架构起名字的时候,往往就这么特别。哪天咱们中国人自己也能写出些架构,咱们就按照中国人的习惯给自己的框架命名,要我就命名为:熊猫、神龙、白蛇、神雕。嘿嘿!有点不正经了,下面回到今天的正题,Hystrix  。

在微服务架构中,服务与服务之间通过远程调用的方式进行通信,一旦某个被调用的服务发生了故障,其依赖服务也会发生故障,此时就会发生故障的蔓延,最终导致系统瘫痪。Hystrix实现了断路器模式,当某个服务发生故障时,通过断路器的监控,给调用方返回一个错误响应,而不是长时间的等待,这样就不会使得调用方由于长时间得不到响应而占用线程,从而防止故障的蔓延。Hystrix具备服务降级、服务熔断、线程隔离、请求缓存、请求合并及服务监控等强大功能。

Spring Cloud Hystrix 是Spring Cloud Netflix 子项目的核心组件之一,具有服务容错及线程隔离等一系列服务保护功能,从今天开始,咱们介绍springcloud 中比较重要的一部分内容: Hystrix 服务容错保护机制。

一、 哪服务框架中为什么需要服务容错保护呢?

在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式互相众依赖。由于每个单元都在不同的进程中进行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的服务也出现延迟,如果调用方的请求不断增加,最后就会因等待出现故障的依赖方响应形成任务积压,最终导致自身服务的瘫痪。

上面这些文字比如抽象,咱们通过一个词和一张图就可以说明【雪崩效应】。哪什么是雪崩效应呢?请看下图,一边看图一边说明

在微服务架构中通常会有多个服务层调用,大量的微服务通过网络进行通信,从而支撑起整个系统。各个微服务之间也难免存在大量的依赖关系。然而任何服务都不是100%可用的,网络往往也是脆弱的,所以难免有些请求会失败。基础服务的故障导致级联故障,进而造成了整个系统的不可用,这种现象被称为服务雪崩效应。服务雪崩效应描述的是一种因服务提供者的不可用导致服务消费者的不可用,并将不可用逐渐放大的过程。

 正如上面的图表示的一样: A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。

二、要解决雪崩效应带来的系统瘫痪影响,我们程序员和架构人员应该要怎么做呢?

两种解决方案和思路:超时机制 、断路器模式

超时机制

通过网络请求其他服务时,都必须设置超时。正常情况下,一个远程调用一般在几十毫秒内就返回了。当依赖的服务不可用,或者因为网络问题,响应时间将会变得很长(几十秒)。而通常情况下,一次远程调用对应了一个线程/进程,如果响应太慢,那这个线程/进程就会得不到释放。而线程/进程都对应了系统资源,如果大量的线程/进程得不到释放,并且越积越多,服务资源就会被耗尽,从而导致资深服务不可用。所以必须为每个请求设置超时。

但超时机制不能彻底解决雪崩的出现。

断路器模式

上面就是一个“断路器”原理图。

“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线咱中有电器 发生短路时,“断路器”能及时切断故障电路和,防止发生过载、发热甚至起火等严重后果。

试想一下,家庭里如果没有断路器,电流过载了(例如功率过大、短路等),电路不断开,电路就会升温,甚至是烧断电路、起火。有了断路器之后,当电流过载时,会自动切断电路(跳闸),从而保护了整条电路与家庭的安全。当电流过载的问题被解决后,只要将关闭断路器,电路就又可以工作了。

所以有了这个“断路器”,家里就安全多了。

三、分布式架构中 “断路器”模式的作用

当某个服务单元发生故障(类似电器发生短路)后,通过断路器的故障监控(类似熔断保险丝),向调用 方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用而不释放,避免了故障在分布式系统中的蔓延(雪崩效应就不会发生,家里就不会发生电器过热导致火灾)。

同样的道理,当依赖的服务有大量超时时,再让新的请求去访问已经没有太大意义,只会无谓的消耗现有资源。譬如我们设置了超时时间为1秒,如果短时间内有大量的请求(譬如50个)在1秒内都得不到响应,就往往意味着异常。此时就没有必要让更多的请求去访问这个依赖了,我们应该使用断路器避免资源浪费。

断路器可以实现快速失败,如果它在一段时间内侦测到许多类似的错误(譬如超时),就会强迫其以后的多个调用快速失败,不再请求所依赖的服务,从而防止应用程序不断地尝试执行可能会失败的操作,这样应用程序可以继续执行而不用等待修正错误,或者浪费CPU时间去等待长时间的超时。断路器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

断路器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。

四、Spring cloud Hystrix 服务容错保护机制

下面这段代码中直接使用Hystrix介绍中的一张原图:

spring cloud Hystrix 实现了断路器、线程隔离等一系列服务保护功能。该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力 ,Hystrix 具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等功能。

Hystrix 是 Netflix 开源的一个用于处理分布式系统的延迟和容错的库,可以防止系统间的级联故障,提高系统的弹性。

以下是一个简单的使用 Hystrix 的 Java 示例代码,使用了 Hystrix 的命令模式来包装对依赖服务的调用:

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;public class HelloWorldCommand extends HystrixCommand<String> {private final String name;public HelloWorldCommand(String name) {// 设置命令组的键,Hystrix会根据这个键对命令进行分组监控和报告super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));this.name = name;}@Overrideprotected String run() {// 这里可以执行实际的业务逻辑,如调用远程服务return "Hello " + name + "!";}@Overrideprotected String getFallback() {// 当执行业务逻辑失败时,会执行这里的逻辑return "Hello Failure " + name + "!";}
}// 使用示例
public class HystrixTest {public static void main(String[] args) {HelloWorldCommand command = new HelloWorldCommand("World");String result = command.execute();  // 同步执行// 或者使用// String result = command.queue().get(); // 异步执行System.out.println(result);}
}

在这个例子中,HelloWorldCommand 继承自 HystrixCommand 类,并实现了 run() 方法来执行业务逻辑,如果执行失败或者超时,则执行 getFallback() 方法返回备用响应。在 main 方法中,我们创建了 HelloWorldCommand 的实例并调用 execute() 方法同步执行命令。

这个例子展示了如何使用 Hystrix 来包装和执行对依赖服务的调用,并提供了失败回退的机制,增加了系统的健壮性。

1.1、熔断机制

原理:

  • 在正常状态下,电路处于关闭状态
  • 如果调用服务持续出错或者超时达到一个阀值,则断路器会直接切断请求链,电路被打开进入熔断状态,以避免发送大量无效请求而影响系统吞吐量,后续一段时间内所有调用都会被拒绝
  • 一段时间以后,保护器会尝试进入半熔断状态,允许少量请求进行尝试。如果调用仍然失败,则回到熔断状态;如果调用成功,则回到电路关闭状态

1.2、隔离机制

1.2.1、线程池隔离模式

在Hystrix的线程池隔离模式下,会为每一个依赖建立一个线程池,以存储对当前依赖的请求。每个依赖可以根据权重分配资源(线程),一部分依赖出现问题不会影响其它依赖使用资源。

1.2.2、信号量隔离模式

原理:

2.jpg

2.jpg

  • 记录当前运行的信号量
  • 判断信号量的值,如果大于设置的最大线程值,则丢弃该类型请求;如果小于设置的值,则执行计数操作,信号量+1

信号量隔离模式无法应对突发流量。

1.2.3、降级机制

服务降级是指:如果整体资源快不够用了,则将某些服务先关掉,等到资源足够时再重新开启这些服务。和熔断的目的一样,该机制也是用来保证上游服务的稳定性。

降级一般采用两种模式:

  • fallback模式:如果服务失败,则通过fallback返回静态值进行降级
  • 服务级联的模式:如果服务失败,则调用备用服务。服务级联模式的目的是尽可能返回数据。但是如果考虑不充分,则有可能导致级联的服务崩溃
1.2.4、缓存机制

缓存机制是将请求结果缓存起来,如果相同"key"的请求发送过来,则将直接从缓存中取出结果,以减少请求开销。采用这种机制会对排查故障造成一定的困扰。

六、总结

Hystrix 提供一系列服务保护功能,是服务治理框架必不可少的一部分内容。
 

Hystrix实战(springcloud工程引入Hystrix)

参考:Spring Cloud Hystrix:服务容错保护_springcloud alibaba hystrix 的服务保护机制-CSDN博客

一、如何添加并整合Hystrix

这段英文中主要提到添加整合Hystrix,需要引入spring-cloud-starter-hystrix这个资源,在pom.xml配置中就需要引入这个资源路径了。


二、怎么使用Hystrix呢?

如何使用Hystrix呢,主要是在启动类中添加@EnableCircuitBreaker注解。

在要访问的接口中,配置 @HystrixCommand,并配置fallbackMethod的方法; 


注意:  

  1. 回退方法的名称可随意定,但出、入参必须和所注解的方法一致,否则报fallbackMethod未定义错误。
  2. 远程方法执行时间大于断路器的时限(例如timeoutInMilliseconds=5s,而远程方法执行10s),hystrix中的MethodExecutionAction.execute捕获异常,HystrixCommand检查是否有配置回退方法,如果有,则回退方法执行,调用方按回退方法返回的内容继续执行,直到业务处理结束。如果没有,则抛HystrixRuntimeException


 

三、定义服务降级

fallback是hystrix 命令执行失败时使用的后备方法,用来实现服务的降级处理逻辑。在HystrixCommand 中可以通过重载getFallback()方法来实现服务降级逻辑,Hystrix 会在run()执行过程中出现错误,超时,线程池拒绝、断路器熔断等情况时,执行getFallback()方法内的逻辑。

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

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

相关文章

2024后端开发面试题总结

一、前言 上一篇离职贴发布之后仿佛登上了热门&#xff0c;就连曾经阿里的师兄都看到了我的分享&#xff0c;这波流量真是受宠若惊&#xff01; 回到正题&#xff0c;文章火之后&#xff0c;一些同学急切想要让我分享一下面试内容&#xff0c;回忆了几个晚上顺便总结一下&#…

【VS2019安装+QT配置】

【VS2019安装QT配置】 1. 前言2. 下载visual studio20193. visual studio2019安装4. 环境配置4.1 系统环境变量配置4.2 qt插件开发 5. Visual Studio导入QT项目6. 总结 1. 前言 前期安装了qt&#xff0c;发现creator编辑器并不好用&#xff0c;一点都不时髦。在李大师的指导下&…

C++画蜡烛图

GPT-4o (OpenAI) 在 C 中绘制蜡烛图通常不像在高级语言&#xff08;如 Python&#xff09;中那么简单&#xff0c;因为 C 并没有内置的图形绘制库。然而&#xff0c;您可以使用一些第三方库来完成这项任务&#xff0c;比如使用 Qt 或者 SFML 等图形库。这里我们以 Qt 库为例&a…

PM2 快速上手指南

PM2是 Node.js 的优秀运行时管理工具&#xff0c;专为简化和优化 Node.js 应用程序的生产部署与运行而设计。 PM2 官网链接: https://pm2.keymetrics.io/ 1.PM2 的优势 持续运行&#xff1a;即使应用出错或崩溃&#xff0c;也能自动重启。负载均衡&#xff1a;智能地自动分…

Linux shell编程学习笔记67: tracepath命令 追踪数据包的路由信息

0 前言 网络信息是电脑网络信息安全检查中的一块重要内容&#xff0c;Linux和基于Linux的操作系统&#xff0c;提供了很多的网络命令&#xff0c;今天我们研究tracepath命令。 Tracepath 在大多数 Linux 发行版中都是可用的。如果在你的系统中没有预装&#xff0c;请根据你的…

WordPress插件介绍页源码单页Html

源码介绍 WordPress插件介绍页源码单页Html源码&#xff0c;这是一款产品介绍使用页面&#xff0c;也可以用来做其他软件或者应用介绍下载页&#xff0c;界面简约美观&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器…

合作伙伴中心Partner Center中添加了Copilot预览版

目录 一、引言 二、Copilot 功能概述 2.1 Copilot 简介 2.2 Copilot 的核心功能 2.3 Copilot 的访问和使用 三、Copilot 的使用方法 3.1 Copilot 功能区域 3.2 Copilot 使用示例 3.2.1 编写有效提示 3.2.2 使用反馈循环 四、负责任的人工智能 4.1 Copilot 结果的可…

UE4如何直接调试Game

某些功能在编辑器里不好调试&#xff0c;例如Pak&#xff0c;就需要直接调试 Game&#xff0c;做法是选择 Game&#xff0c;不要选择Client&#xff0c;加断点&#xff0c;然后点击 Debug 就好了。 断点调试成功&#xff1a; 同时看到界面&#xff1a;

PCIe总线-Linux内核PCIe软件框架分析(十一)

1.简介 Linux内核PCIe软件框架如下图所示&#xff0c;按照PCIe的模式&#xff0c;可分为RC和EP软件框架。RC的软件框架分为五层&#xff0c;第一层为RC Controller Driver&#xff0c;和RC Controller硬件直接交互&#xff0c;不同的RC Controller&#xff0c;其驱动实现也不相…

【React】详解 React Hooks 使用规则

文章目录 一、Hooks 的基本原则1. 只在最顶层调用 Hooks2. 只在 React 函数组件和自定义 Hooks 中调用 Hooks 二、常见 Hooks 及其使用规则1. useState2. useEffect3. useContext4. useReducer5. useMemo6. useCallback 三、常见错误及其解决方案1. 在条件语句中调用 Hooks2. 在…

RK3568 Linux 平台开发系列讲解(内核入门篇):从内核的角度看外设芯片的驱动

在嵌入式 Linux 开发中,外设芯片的驱动是实现操作系统与硬件之间交互的关键环节。对于 RK3568 这样的处理器平台,理解如何从内核的角度构建和管理外设芯片的驱动程序至关重要。 1. 外设驱动的基础概念 外设驱动(Device Driver)是操作系统与硬件设备之间的桥梁。它负责控…

机器学习(二十一):错误分析、创造数据和迁移学习

一、错误分析 假设交叉验证集一共有500个数据点&#xff0c;模型拟合结果中&#xff0c;有100个数据点有误。 错误分析就是&#xff0c;手动地分析这100个错误数据&#xff08;或随机选择一些错误数据&#xff09;&#xff0c;根据它们的共同属性、共同特征分类&#xff0c;然…

在QT中使用多线程并发服务器(C++)

什么是多线程并发服务器&#xff1f;在QT里如何使用多线程并发服务器呢&#xff1f; 多线程并发服务器是一种网络服务器设计&#xff0c;它能够同时处理多个客户端的请求。在多线程服务器中&#xff0c;主线程负责监听和接受来自客户端的连接请求&#xff0c;每当有一个新的连…

C++(week13): C++基础: 标准模板库 STL

文章目录 零、标准模板库 STL一、容器 (Container)1.序列式容器(1)vector2.五种遍历10.vector的迭代器失效问题 (2)deque(3)list 2.关联式容器(1)set4.set的查找(2)find() 8.set中存储自定义类型&#xff1a;三种方法 (2)multiset7.multiset的特殊操作&#xff1a;bound系列函数…

【前端 15】Vue生命周期

Vue生命周期 在Vue.js中&#xff0c;了解组件的生命周期对于开发者来说是至关重要的。Vue的生命周期指的是Vue实例从创建到销毁的一系列过程&#xff0c;每个阶段都对应着特定的生命周期钩子&#xff08;或称为生命周期方法&#xff09;&#xff0c;允许我们在不同的时间点加入…

【网络安全】AWS S3 Bucket配置错误导致敏感信息泄露

未经许可&#xff0c;不得转载。 文章目录 前言技术分析正文 前言 AWS&#xff08;Amazon Web Services&#xff09;是亚马逊公司提供的一个安全的云服务平台&#xff0c;旨在为个人、公司和政府机构提供计算能力、存储解决方案、内容交付和其他功能。作为全球领先的云服务提供…

Autodesk Revit v2025 激解锁版下载及安装教程 (三维建模软件)

前言 Revit是欧特克公司知名的三维建模软件&#xff0c;是建筑业BIM体系中使用最广泛的软件之一&#xff0c;其核心功能是三维建筑模型参数化设计、渲染效果图、算量&#xff0c;土建建模、机电建模、用来帮助工程师在施工前精确模拟阶段。 一、下载地址 下载链接&#xff1…

体育赛事中的AI运用

7月24日&#xff0c;国际奥委会&#xff08;IOC&#xff09;举办了新闻发布会&#xff0c;宣布计划在2024年巴黎奥运会上展示一系列创新的人工智能&#xff08;AI&#xff09;技术。这次会议不仅是对即将到来的奥运赛事的预热&#xff0c;也深入探讨了人工智能在体育领域可能带…

快速重装系统

挑选系统 https://d1506.xy58.net/202002/Js_GhostWin7z_x64_2020T.iso WIN11镜像 安装PE启动U盘安装工具 本地安装

【机器学习】深入理解损失函数(Loss Functions)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解损失函数(Loss Functions)什么是损失函数?常见损失函数类型1. 均方误差…