详解Hystrix

简介: 1.微服务中的容错1.1.服务雪崩要说容错的话,肯定是有多种维度的。横向维度上来说,分布式架构,天然就带有分区容错性,多节点部署相同的服务就是为了容错,保证其中某些节点挂掉后,其它节点任然能提供该类服务。微服务种更需要考虑的是纵向维度上的容错机制,防止服务雪崩。所谓的服务雪崩,指的是服务间存在着纵向的链路式的调用关系:服务A调用服务B,服务B调用服务C。

1.微服务中的容错

1.1.服务雪崩

要说容错的话,肯定是有多种维度的。横向维度上来说,分布式架构,天然就带有分区容错性,多节点部署相同的服务就是为了容错,保证其中某些节点挂掉后,其它节点任然能提供该类服务。微服务种更需要考虑的是纵向维度上的容错机制,防止服务雪崩。


所谓的服务雪崩,指的是服务间存在着纵向的链路式的调用关系:


服务A调用服务B,服务B调用服务C。

要说容错的话,肯定是有多种维度的。横向维度上来说,分布式架构,天然就带有分区容错性,多节点部署相同的服务就是为了容错,保证其中某些节点挂掉后,其它节点任然能提供该类服务。微服务种更需要考虑的是纵向维度上的容错机制,防止服务雪崩。


所谓的服务雪崩,指的是服务间存在着纵向的链路式的调用关系:


服务A调用服务B,服务B调用服务C。

f74ac7a504e1467c9f60252a087f8cd1.png

当链路上有节点出现错误,无法正常提供服务,无法立即响应请求时,请求会逐步积压在上层服务,逐步打挂整个链路上的服务,就像异常雪崩一样,从一点开始引起全局的一场大崩溃。

a532326254fc4dbc9875a470939eda6d.png


1.2.解决办法

预防、解决服务雪崩有三种方法:


服务降级

服务熔断

服务限流

服务降级:


当服务提供方向服务调用方返回一个响应(fallback),而不是长时间等待或者直接抛出无法处理的异常。例如:“服务器忙,请稍后再试!”


服务降级的触发条件可以人为规定,乐意的话想定成什么都可以,一般常见的触发条件如下


报异常

超时

通信线程池被打满

服务熔断:


直接拒绝访问,快速返回一个开发者自定义的“异常信息”。


服务限流:


限制一个时间段内能够通行的请求数量。


降级和熔断的区别:


熔断:


熔断后请求不会再进调用服务的方法体,直接将链路断开,此后的每次请求都会直接被抛给fallback。


降级:


降级后请求依然会进调用服务的方法体,每次请求都会先试图去调用服务,只是服务自己察觉到自己可能出问题了从而拒绝服务,然后再将请求转给fallback。直接转发到即当服务的调用出现超时、异常等情况时,返回一个响应(fallback)。降级可以用在服务调用的全链路上的任意位置,既可以用在服务提供方,也可以用在服务提供方,不过为了使用规范,一般建议用在提供方(让服务自己管好自己)。

2.hystrix

2.1.概述

hystrix归属于Netflix版本的spring cloud中,是开源的一款微服务容错组件,提供了开箱即用的服务降级、熔断、监控等能力。由于Netflix将自己版本的spring cloud捐给apache后,后续apache维护的版本只维护了eureka,也就是说交给apache后,更新的spring cloud Netflix中只包含eureka,而不包含其它组件了,所以要用hystrix时,版本一定要选还在Netflix时的版本号,本文选择H版本以及其对应的spring boot 2.2.X为例:

e650d5d7647c4022b7e88739c7ee094f.png

如果对spring cloud版本问题还不是很清楚的同学,推荐去看博主另一篇文章,其中详细清晰快速的理清楚了整个spring cloud杂乱的版本关系:

详解Spring Cloud版本问题__BugMan的博客-CSDN博客

2.2.项目结构及依赖

项目结构:

e0e4ab2a90794773bd358bbb3d9f74af.png

maven项目,consumer,服务调用者;userService,服务提供者;eureka,注册中心

依赖:

98103bf3d4ec45fe89476e632591530c.png

<properties>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
        <spring-boot.version>2.2.10.RELEASE</spring-boot.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2.3.代码示例

2.3.1.注册中心

依赖:

86ddc22a1f79416498ee365cff8beff4.png

配置:

de607922456642ca8a9f8f05d195196e.png启动:

46df4914dc9d4671994c219eeae71bd2.png

2.3.2.服务调用者

依赖:

4e3908806907457ea7f385a619ffcefb.png

配置:

ec88c27fc3df4450854d66d111c2fc25.png

用ribbon来做RPC:

ddfc0a5a702547fb912b2cf5c8cd2d63.png

f27ea72f63c344068e9cebaf196b83fb.png

2.3.3.服务提供者

依赖:

c6e885d99d4341e3958f69e9fa96ea3b.png

配置:

5e604c1af1bf4a898c56f0744c8820d3.png

启动:

4d6f672bbe6e458b92ff0228d45840dc.png

服务:

c4efcebfd0e24335b16ed583ebf2f361.png

开启容错和降级:

f6475965c661433ebbb8bf35c9fe79d8.png

2.4.服务降级

2.4.1.单点响应

即每个服务接口单独定义异常响应ac3f934e4cba4a87b177d9b4ddf97f9b.png 0fd9a08289a942df828f1accf277ca26.png

2.4.2.默认响应

单点响应,每个服务单独对应一个fallback,会造成代码膨胀,高耦合的问题。


可以定义一个默认的全局响应,来统一处理服务降级。


单点响应优先,有单点响应的服务会优先匹配单点响应,没有单点响应的服务匹配全局响应。一般很重要的核心业务的熔断才单独写响应,一般业务用默认响应足以。


这里给一个博主之前写的默认响应的代码示例:

7383f25ac593425d8d6bc03e05eb00ab.png

2.4.3.前置响应

无论是单点响应还是默认响应,响应代码和业务代码都耦合在一起,前置响应将响应放在OpenFeign调用侧,使得业务代码和响应代码解耦。

依赖:

OpenFeign的依赖中包含了hystrix,导入OpenFeign后不用单独导入hystrix。

配置:

75aa633c6e534897a16ee7edbbed3bcb.png

67da4ae9ce6c4c1fb76103abf7727507.png

映射:

dcaa540c5e954966be8586721562ae02.png

2.5.服务熔断

2.5.1.概述

hystrix实现了熔断机制,会监控服务间的调用情况,当失败的次数达到一定阈值时(默认是5秒内20次调用失败),就会启动熔断机21f588a7e26346b3a876fb98d485532a.png制。

“断路器”总共有三种状态:

  • 1.close,闭合状态,正常工作。
  • 2.Open,开启状态,熔断。
  • 3.Half Open,半开状态,“我觉得我又行了,我先放过一波请求试试实际行不行?”

2.5.2.使用

  • 用@HystrixCommand来定制断路器的触发规则。

dff028f4eaf143928108f4f38db12ec7.png

2.6.hystrix的文档地址

由于交给apache后最新版本的Netflix的spring cloud只包含了eureka,相应的也只包含了eureka的文档,其它组件的文档都不太好找,这里给出hystrix在github上的文档地址:


GitHub - Netflix/Hystrix: Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.

目录
相关文章
|
4月前
|
编解码 算法 数据安全/隐私保护
手机常用压缩工具推荐,RAR,ZIP,7Z解压缩,zip解压缩,Bandizip,ZArchiver等解压工具
在手机上解压RAR、ZIP、7Z等格式文件时,选择一款功能强大的解压缩工具至关重要。本文介绍了多款实用的解压软件,如7Z解压缩、ZArchiver、RAR、Bandizip等,它们不仅支持多种压缩格式的解压和压缩,还具备文件管理、加密、分享、媒体预览等功能。无论是处理文档、图片还是视频,这些工具都能提供高效便捷的解决方案,满足日常使用需求。
1615 0
|
10月前
|
人工智能 关系型数据库 分布式数据库
PolarDB-PG AI最佳实践3 :PolarDB AI多模态相似性搜索最佳实践
本文介绍了如何利用PolarDB结合多模态大模型(如CLIP)实现数据库内的多模态数据分析和查询。通过POLAR_AI插件,可以直接在数据库中调用AI模型服务,无需移动数据或额外的工具,简化了多模态数据的处理流程。具体应用场景包括图像识别与分类、图像到文本检索和基于文本的图像检索。文章详细说明了技术实现、配置建议、实战步骤及多模态检索示例,展示了如何在PolarDB中创建模型、生成embedding并进行相似性检索
|
9月前
|
缓存 负载均衡 Java
2025春招 SpringCloud 面试题汇总
大家好,我是V哥。SpringCloud是面试中的重点,涵盖基础概念、组件细节、高级特性及性能优化等内容。为帮助大家更好地准备2025年的Spring Cloud面试,我整理了一系列常见面试题及答案,涉及服务注册与发现(Eureka)、配置管理(Spring Cloud Config)、负载均衡(Ribbon)、断路器(Hystrix)、微服务网关(Spring Cloud Gateway)等关键知识点。此外,还包括分布式事务管理、链路追踪(Sleuth+Zipkin)、安全性(OAuth2)以及性能优化和实践经验。希望这些内容能助你一臂之力,顺利通过面试。欢迎关注威哥爱编程,全栈之路就你行。
2836 24
|
小程序 前端开发 API
一文就知道uniapp等跨端开发的使用场景,学习成本,如何快速使用,基本语法等
uniapp是一个跨平台开发各种各样应用的一套框架。只需要写一套代码,可以适配多达14种产品类型,比如H5移动端、微信小程序及各种其他小程序,ios、安卓等接近原生APP的应用(可以上架到App Store或应用商店)。所以这里的多端,指的并不是PC、平板、手机端,而是移动端优先,开发者可以一次编码,分别编译为小程序和 Android 以及 iOS 应用,实现多端开发
1047 0
|
监控 安全 中间件
Python 日志处理详解:从基础到实战
【2月更文挑战第5天】Python 日志处理详解:从基础到实战
|
JSON 负载均衡 Java
SpringCloud Feign 远程调用(史上最详细讲解)
SpringCloud Feign 远程调用(史上最详细讲解)
14717 0
SpringCloud Feign 远程调用(史上最详细讲解)
|
Java Nacos 网络架构
SpringCloud Gateway的使用 + Nacos动态路由
SpringCloud Gateway的使用 + Nacos动态路由
|
SpringCloudAlibaba Java 微服务
|
机器学习/深度学习 缓存 人工智能
X-Anylabeling: 新一代自动标注工具
X-AnyLabeling:具备增强功能的高级自动标注解决方案
9168 0
X-Anylabeling: 新一代自动标注工具