一文讲明Hystrix熔断器
前言
解决问题: 主要防止服务器集群发生雪崩, 起到对服务器的保护作用
GitHub地址:https://github.com/Netflix/Hystrix/wiki
1 Hystrix是什么
1.1 分布式系统面临的问题
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
1.1.1 服务雪崩
-
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所渭的“扇出“,如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的"雪崩效应"
-
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
-
所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障或者叫雪崩。
1.2 是什么
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack
),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
2 Hystrix的主要功能
- 熔断,当服务压力过大,错误比例过多时,熔断所有请求,所有请求直接降级
- 降级,超时、出错、不可到达时,对服务降级,返回错误信息或者是缓存数据
2.1熔断
服务熔断熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。
10秒内20次请求,50%调用失败,执行了降级代码,会触发熔断
熔断可以避免故障的传播,避免引起雪崩效应
限流,后台服务压力过大出现故障,可以断开连接,限制访问流量
熔断的条件(两个条件必须都满足)
10秒20次请求(首先满足)
50%失败,执行了降级代码
2.2 降级
一个服务调用后台服务失败(出现异常、等待超时、不能连接),可以执行当前服务中的一段代码,向前返回响应(错误提示、缓存数据)
系统容错,当后台服务出现错误,还可以向客户端返回结果
3、使用
3.1 熔断的使用
3.1.1 创建module子项目
首先在原有微服务基础上创建microservicecloud-provider-dept-hystrix-8001
服务子服务。
3.1.2 修改pom文件
添加依赖
<!-- hystrix --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency>
3.1.3 修改yml文件
主要修改的是: instance-id: microservicecloud-dept8001-hystrix #自定义hystrix相关的服务名称信息
目的是方便查看注册的服务名称
server:port: 8001mybatis:config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径type-aliases-package: com.zyz.springcloud.entities # 所有Entity别名类所在包mapper-locations:- classpath:mybatis/mapper/**/*.xml # mapper映射文件spring:application:name: microservicecloud-deptdatasource:type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包url: jdbc:mysql://localhost:3306/cloudDB01 # 数据库名称username: rootpassword: rootdbcp2:min-idle: 5 # 数据库连接池的最小维持连接数initial-size: 5 # 初始化连接数max-total: 5 # 最大连接数max-wait-millis: 200 # 等待连接获取的最大超时时间eureka:client: #客户端注册进eureka服务列表内service-url:
# defaultZone: http://localhost:7001/eurekadefaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: microservicecloud-dept8001-hystrix #自定义hystrix相关的服务名称信息prefer-ip-address: true #访问路径可以显示IP地址info:app.name: atguigu-microservicecloudcompany.name: www.atguigu.combuild.artifactId: $project.artifactId$build.version: $project.version$
3.1.4 修改DeptController
一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
@RestController
public class DeptController
{@Autowiredprivate DeptService service = null;@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)/*** 一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法*/@HystrixCommand(fallbackMethod = "processHystrix_Get")public Dept get(@PathVariable("id") Long id){Dept dept = this.service.get(id);if (null == dept) {throw new RuntimeException("该ID:" + id + "没有没有对应的信息");}return dept;}public Dept processHystrix_Get(@PathVariable("id") Long id){return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand").setDb_source("no this database in MySQL");}
}
3.1.5 修改启动类
添加注解:@EnableCircuitBreaker//对hystrixR熔断机制的支持
@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@EnableDiscoveryClient //服务发现
@EnableCircuitBreaker//对hystrixR熔断机制的支持
public class DeptProvider8001_Hystrix_App
{public static void main(String[] args){SpringApplication.run(DeptProvider8001_Hystrix_App.class, args);}
}
3.1.6 测试
启动过程
- 1、启动eureka集群
- 2、启动8001服务(将服务注册到eureka中)
- 3、启动80服务 (服务消费)
3.2 降级的使用
整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来。
服务降级处理是在客户端实现完成的,与服务端没有关系
3.2.1 修改 microservicecloud-api 服务
根据已经有的DeptClientService
接口新建一个实现了FallbackFactory
接口的类DeptClientServiceFallbackFactory
@Component // 不要忘记添加,不要忘记添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>
{@Overridepublic DeptClientService create(Throwable throwable){return new DeptClientService() {@Overridepublic Dept get(long id){return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭").setDb_source("no this database in MySQL");}@Overridepublic List<Dept> list(){return null;}@Overridepublic boolean add(Dept dept){return false;}};}
}
3.2.2 添加注解
修改microservicecloud-api工程,DeptClientService接口在注解@FeignClient中添加fallbackFactory属性值
/*** @author zyz* @version 1.0* @data 2023/2/20 21:04* @Description:修改microservicecloud-api工程,根据已经有的DeptClientService接口* 新建** 一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory*/
@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService
{@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)public Dept get(@PathVariable("id") long id);@RequestMapping(value = "/dept/list", method = RequestMethod.GET)public List<Dept> list();@RequestMapping(value = "/dept/add", method = RequestMethod.POST)public boolean add(Dept dept);
}
3.2.3 修改服务fegin(负载均衡)的yml文件
microservicecloud-consumer-dept-feign工程修改YML
feign:hystrix:enabled: true
3.2.4 测试
启动步骤
- 1、启动eureka集群
- 2、启动8001服务(注册服务)
- 3、启动feigin (发现服务)
访问地址:
查看集群情况:在这里插入代码片
http://localhost:800/consumer/dept/get/1
关停8001服务、、模拟宕机
完整源码地址:GitHub代码仓库
参考资料:1、熔断器 ;2、Hystrix断路器
相关文章:

一文讲明Hystrix熔断器
前言 解决问题: 主要防止服务器集群发生雪崩, 起到对服务器的保护作用 GitHub地址:https://github.com/Netflix/Hystrix/wiki 1 Hystrix是什么 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不…...
第12篇:Java类核心构成要素分析
目录 1、Java类构成要素 1.1 如何定义类 1.2 如何定义变量 1.2.1 类变量 1.2.2 实例变量...

记一次 .NET 某医保平台 CPU 爆高分析
一:背景 1. 讲故事 一直在追这个系列的朋友应该能感受到,我给这个行业中无数的陌生人分析过各种dump,终于在上周有位老同学找到我,还是个大妹子,必须有求必应 😁😁😁。 妹子公司的…...

滤波算法 | 无迹卡尔曼滤波(UKF)算法及其MATLAB实现
目录简介UKF滤波滤波流程和公式MATLAB程序结论简介 本文接着分享位姿跟踪和滤波算法中用到的一些常用程序,希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章:位姿跟踪 | 相关内容目录和链接总结(不断更新中~~~) 本…...

JAVA开发(运行JAR包怎么指定虚拟机内存大小)
我们都使用过 java -jar xxx.jar包去运行jar包。但是有时候要指定jar包运行时内存,该怎么做,而且设置多大怎么衡量,很多人从来没有了解过。 背景: 我们开发java程序,可能涉及到开发环境,测试环境&#x…...
领导力的终极奥义
过去,我曾多次演讲、著书,把自己在长达半个世纪的经营实践中所体悟到的经营思想和方法告诉中国的企业家。 但是,对于任何一家企业来说,不管它倡导了多么高尚的经营哲学,不管它构建了多么精致的管理系统,这样…...

1-MATLAB APP Design-图像的输入与输出
一、APP 界面设计展示 新建一个空白的APP,在此次的学习中,我们会用到编辑字段(文本框)、 按钮、坐标区和面板,首先在界面中拖入一个编辑字段(文本框),在文本框中输入内容:图形的输入与输出,调整背景颜色,字体的颜色为黑色,字体的大小调为25....

【C++】内存管理
目录一、C/C内存分布二、C内存管理方式2.1、new/delete操作内置类型2.2、new和delete操作自定义类型三、operator new与operator delete函数3.1、operator new与operator delete函数四、new和delete的实现原理4.1、内置类型4.2、自定义类型五、定位new表达式(placement-new)六、…...
Dilworth定理
偏序关系 设RRR是集合AAA的一个二元关系,若RRR满足: 1.自反性:∀x∈A\forall x \in A∀x∈A,有xRxxRxxRx 2.反对称性:∀x,y∈A\forall x,y \in A∀x,y∈A,若xRy,yRxxRy,yRxxRy,yRx,则xyxyxy 3.传递性&…...

使用loading动画让你的条件渲染页面更高级
前言在我们做项目的使用常常会使用条件渲染去有选择的给用户展示相关页面,如果渲染的数据或场景比较多比较复杂,那么往往需要3、4s的时间去完成,用户点击了之后就会陷入3、4s的空白期,并且这段时间屏幕是处于一种”未响应“的状态…...

Renegade:基于MPC+Bulletproofs构建的anonymous DEX
1. 引言 白皮书见: Renegade Whitepaper: Protocol Specification, v0.6 开源代码见: https://github.com/renegade-fi/renegade(Renegade p2p网络每个节点的核心网络和密码逻辑)https://github.com/renegade-fi/mpc-bulletpr…...
二、Plugin The chain/event/query function
The chain function 链函数是所有数据处理都在其中进行的函数。在简单过滤器的情况下(本节示例的情况),_chain()函数大多是线性函数——因此对于每个传入的缓冲区,也将输出一个缓冲区。下面是一个非常简单的chain函数的实现: sta…...
了解 PostgreSQL 的扩展查询协议
1.介绍 本篇博客用于解释扩展协议的工作原理以及它与简单查询的区别。 2.简单查询 在PostgreSQL中,客户端连接能够发起两种类型的查询:简单查询和扩展协议查询。 简单查询顾名思义。 当启动 psql 客户端连接到pg服务器时,几乎所有发送的…...
接入网关和隔离网关
文章目录1. 什么是网关?2. 网关的作用是什么?3. 接入网关和隔离网关1. 什么是网关? 网关(Gateway)是一种网络设备,通常用于将不同网络之间的流量进行转发和路由,将一个网络连接到另一个网络&…...

实用指南:如何在Anolis OS上轻松使用 Kata 安全容器?
文/云原生SIG本篇文章我们将详细介绍怎么轻松在 Anolis OS 上使用 Kata Containers 安全容器,我们将介绍 Kata Container 社区于 2022 年 10 月 10 日最新发行的 Kata3.0.0 的安装部署方式,3.0.0 版本包含了基于袋鼠 RunD 开源的最新 Rust Kata runtime …...

如何锁定Word文档部分文字不被修改
我们知道,想要保护Word文档的内容无法随意更改,可以设置“限制编辑”的保护模式。 那如果实际工作中,只需要固定的一部分内容不能编辑,可以实现吗?答案是肯定的,今天就来说说如何设置Word文档部分文字可修…...

聊聊8万8的私董会,很扎心
聊聊8万8的私董会,很扎心 道几句真心话,很扎心,但也很现实。 如果你喜欢刷抖音,这种感觉应该会更加明显。 股市哀鸿遍野,实体一地鸡毛,我们办公室楼下的门面换了一波又一波。 别说那些不起眼的小生意&a…...

卷积网络与全连接网络的区别
问题卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络。全连接神经网络是具有多层感知器的的网络&a…...

【5000左右电脑配置清单】预算不高于5000,不带显示器的电脑配置清单推荐
由于本人是学生党经济有限,预算不高于5000元配一套电脑主机,说实话5000左右的电脑配置已经很好了,今天站长整理了几款配置给大家参考参考,更多电脑配置还请继续关注西安SEO优化站点! 配置1: <CPU> I5…...

在 4G 内存的机器上,申请 8G 内存会怎么样?
在 4GB 物理内存的机器上,申请 8G 内存会怎么样? 这个问题在没有前置条件下,就说出答案就是耍流氓。这个问题要考虑三个前置条件: 操作系统是 32 位的,还是 64 位的?申请完 8G 内存后会不会被使用&#x…...

VBA进度条ProgressForm1
上一章《VBA如何使用ProgressBar进度条控件》介绍了ProgressBar控件的使用方法,今天我给大家介绍ProgressForm1进度条的使用方法,ProgressForm1是集成ProgressBar控件和Label控件的窗体,可以同时显示进度条和百分比,如下图&#x…...
机器翻译模型笔记
机器翻译学习笔记(简体中文) 1. 任务概述 目标:将英文句子翻译成简体中文。 示例: 输入:Tom is a student. 输出:汤姆是一个学生。 框架:Seq2Seq(序列到序列)模型。…...

Golang基础学习
初见golang语法 go项目路径 cd $GOPATH //ls可以看到有bin,pkg,src三个文件 cd src/ mkdir GolangStudy cd GolangStudy mkdir firstGolanggo程序执行: go run hello.go//如果想分两步执行: go build hello.go ./hello导入包的方式 import "f…...
LangChain面试内容整理-知识点1:LangChain架构与核心理念
LangChain 是一个用于构建基于大型语言模型(LLM)的应用的框架,其架构采用模块化设计,核心理念是将语言模型与外部工具、数据源相结合,以实现复杂任务的分解与执行medium.com。整个框架可以理解为一系列可组合的组件,包括链(Chain)、智能体(Agent)、工具(Tool)和LLM…...

Linux--进程的调度
1.进程切换 CPU上下⽂切换:其实际含义是任务切换, 或者CPU寄存器切换。当多任务内核决定运⾏另外的任务时, 它保存正在运⾏任务的当前状态, 也就是CPU寄存器中的全部内容。这些内容被保存在任务⾃⼰的堆栈中, ⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该…...

Scrapy爬虫教程(新手)
1. Scrapy的核心组成 引擎(engine):scrapy的核心,所有模块的衔接,数据流程梳理。 调度器(scheduler):本质可以看成一个集合和队列,里面存放着一堆即将要发送的请求&#…...

Model Context Protocol (MCP) 是一个前沿框架
微软发布了 Model Context Protocol (MCP) 课程:mcp-for-beginners。 Model Context Protocol (MCP) 是一个前沿框架,涵盖 C#、Java、JavaScript、TypeScript 和 Python 等主流编程语言,规范 AI 模型与客户端应用之间的交互。 MCP 课程结构 …...
数据类型 -- 字符
在C中,字符型(char)用于存储单个字符,如字母、数字、符号等。字符型是最基本的数据类型之一,常用于处理文本、字符数组(字符串)等场景。 1. 基本类型 • char:标准字符类型&#x…...
学习笔记(26):线性代数-张量的降维求和,简单示例
学习笔记(26):线性代数-张量的降维求和,简单示例 1.先理解 “轴(Axis)” 的含义 张量的 “轴” 可以理解为 维度的方向索引 。对于形状为 (2, 3, 4) 的张量,3 个轴的含义是: 轴 0(axis0&…...
JavaScript 中的单例内置对象:Global 与 Math 的深度解析
JavaScript 中的单例内置对象:Global 与 Math 的深度解析 在 JavaScript 的世界中,单例内置对象是开发者必须了解的核心概念之一。它们是语言规范中预定义的对象,无需显式创建即可直接使用。本文将深入解析 JavaScript 中最重要的两个单例内…...