Spring Cloud  Hystrix实现服务容错的方法

 更新时间:2024年10月18日 14:26:57   作者:布说在见  
Hystrix是SpringCloud中重要的熔断保护组件,由Netflix开源,主要提供延迟和容错管理,以保障分布式系统的高可用性和鲁棒性,通过封装依赖项实现服务间隔离,引入回退逻辑应对依赖服务故障,有效防止系统崩溃和服务级联故障

Hystrix概述:

作为Spring Cloud体系内实现熔断机制的关键组件,Hystrix承担着服务容错保护的重要职责。

它由Netflix开源,旨在为分布式系统提供延迟处理和容错解决方案。

其核心作用在于引入延迟容忍与容错逻辑,精细管理分布式服务间的交互,确保系统的高可用性和鲁棒性。

在复杂分布式系统环境中,往往涉及数十个应用,这些应用依赖于多个项目。

不可避免地,每个依赖项目都有可能在某个时刻遭遇失败并触发故障。

若未对这些故障实施有效隔离措施,整个分布式系统可能面临崩溃风险。

在分布式系统中,当某个环节出现延迟时,可能会阻塞整个用户请求。

特别是在高流量情况下,后端依赖的延迟可能迅速导致全部服务资源在短短几秒内耗尽,从而无法处理后续请求,使应用发生故障。

更严重的是,这些问题还可能引发服务间延迟累积,占用备份队列、线程等关键资源,触发连锁反应般的级联故障。

为应对这些挑战,Hystrix应运而生。

它通过封装每一个依赖项,实现它们之间的相互隔离。

一旦延迟发生,问题被限制在局部资源中,并包含回退逻辑,该逻辑决定在依赖失败时应采取何种措施,确保系统的稳定性。

第一个Hystrix程序

步骤1:创建父工程hystrix-1

将搭建的Eureka基本应用中的3个子项目都复制到hystrix-1父工程中,并依次添加为Maven项目。

在这里插入图片描述

步骤2:改造服务提供者

在服务提供者eureka-provider中创建controller包,并在该包下创建HystrixController类,该类定义了一个demo ()方法,用于处理路径为/demo的请求。

HystrixController类的内容如下:

在这里插入图片描述

步骤3:改造服务消费者为Hystrix客户端

流程:

(1)添加Hystrix依赖

(2)添加@EnableHystrix注解

(3)创建Config配置类

(4)创建Service层类

(5)创建Controller层类

(1)添加Hystrix依赖

在项目eureka-consumer的pom文件中添加Hystrix的依赖如下:

在这里插入图片描述

  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  </dependency>

添加后重新加载pom文件。

(2)添加@EnableHystrix注解

在启动类EurekaConsumerApplication中添加@EnableHystrix注解启动熔断功能。
在这里插入图片描述

(3)创建Config配置类

在eureka-consumer中创建config包,并在该包下创建类HystrixConfig。在HystrixConfig类中注入restTemplate的Bean对象。

(4)新建service包

在service包下新建LocalItemService类

在这里插入图片描述

被@HystrixCommand注解修饰的demo()方法就启动了Hystrix熔断器的功能fallbackMethod属性定义的是处理回退(fallback)逻辑的方法。如果必须在fallback逻辑方法中远程调度其他服务,最好在远程调度其他服务时,也加上熔断器。

注:@Autowired注解不能运行时可换成@Resource注解,按Bean的名称装配。

(5)新建controller包

在controller包下新建LocalItemController类

在这里插入图片描述

步骤4:项目测试

启动服务并进行测试。依次启动eureka-server,eureka-provider,eureka-consumer,在浏览器输入http://localhost:7006/demo?name=布说,观察浏览器显示的效果。

在这里插入图片描述

在这里插入图片描述

关闭服务提供者eureka-provider,制造服务不可用的情形。再次请求 以上地址,观察浏览器显示的效果。

在这里插入图片描述

在Feign中使用Hystrix

创建父工程hystrix-2,将上述中的3个子项目都复制到hystrix-2父工程中,并依次添加为Maven项目。

步骤1:开启Hystrix熔断

Feign自带熔断功能,默认情况下,熔断功能是关闭的。如果要开启熔断,只需在配置文件中将hystrix.enabled设置为true即可。

开启Hystrix熔断功能。在eureka-consumer项目的配置文件application.yml中添加开启熔断的配置:

在这里插入图片描述

注:因为在Feign的起步依赖中引入了Hystrix依赖,所以在Feign中使用Hystrix不需要引入任何的依赖,只需要在配置文件中开启即可。

步骤2:开启Feign Client功能

因为使用Feign组件调用,需要在eureka-consumer项目的pom文件中加入feign依赖。

在项目eureka-consumer的pom文件中添加Feign的依赖如下:

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>

添加后重新加载pom文件。

在eureka-consumer的启动类中添加@EnableFeignClients开启Feign Client功能。

在这里插入图片描述

注:使用fallback属性指定的用于处理回退逻辑的类,必须实现@FeignClient注解修饰的接口。

步骤3:修改项目中接口

在service包中新建失败逻辑处理类LocalbushuoServiceImpl,并实现被@FeignClient修饰的LocalItemService接口。

在这里插入图片描述

进入项目eureka-consumer,删除掉之前的LocalItemService类。创建LocalItemService接口,并在上方的@FeignClient注解中,增加fallback属性配置,指定LocalItemServiceImpl类为失败逻辑处理类。

注:使用fallback属性指定的用于处理回退逻辑的类,必须实现@FeignClient注解修饰的接口。

在这里插入图片描述

步骤4:项目测试

启动服务并进行测试。依次启动eureka-server,eureka-provider,eureka-consumer,在浏览器输入http://localhost:7006/demo?name=www,观察浏览器显示的效果。

在这里插入图片描述

关闭服务提供者eureka-provider,制造服务不可用的情形。再次请求 以上地址,观察浏览器显示的效果。

在这里插入图片描述

在这里插入图片描述

问题

1.Hystrix 是怎么实现服务容错的?

Hystrix 主要通过以下几点实现服务容错:

断路器模式:当依赖服务频繁失败时,断路器会打开,直接拒绝请求,防止系统因等待响应而耗尽资源。当服务恢复后,断路器会进入半开状态,逐步恢复请求。(上述程序就是)

资源隔离:使用线程池或信号量隔离来限制依赖服务的请求,防止一个服务的问题影响到整个系统。
Fallback 机制:当依赖服务不可用时,提供一个备用响应(Fallback),确保请求不会完全失败,而是返回一个默认值或备用结果。

超时与重试:设置请求超时时间,超出时间直接返回错误;对于临时故障,可以配置重试机制。

2.什么是Hystrix ?

Hystrix 是一个由 Netflix 开发的开源库,用于提高分布式系统的服务弹性和可靠性。它通过增加延迟容忍和容错逻辑来防止级联故障。

主要功能包括:

断路器:监测依赖服务的故障,当检测到故障时,阻止请求发送到有问题的服务上,避免级联故障。

资源隔离:使用线程池隔离或信号量隔离来限制服务调用的资源消耗,防止系统不稳定。

Fallback 回退机制:配置备用响应(Fallback),当依赖服务故障时返回备用结果,确保请求不会完全失败。

监控与仪表盘:提供实时监控数据,如延迟和错误率,并通过 Hystrix Dashboard 展示,帮助监控系统状态。

Hystrix 常与 Spring Cloud 集成,用于构建高可用和高弹性的微服务架构。尽管 Netflix 已停止维护 Hystrix,但它在许多现有项目中仍然广泛使用。

总结

每个微服务都需要独立部署,管理多个环境和配置,这无疑增加了部署的复杂性。

由于系统由众多微服务构成,一旦发生故障,定位问题的时间会相应增加,监控和故障排查的难度也随之增大。

此外,不同微服务对资源的需求各不相同,需要合理分配以避免资源浪费或不足。

到此这篇关于Spring Cloud Hystrix实现优雅的服务容错的文章就介绍到这了,更多相关Spring Cloud Hystrix服务容错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java结合redistemplate使用分布式锁案例讲解

    Java结合redistemplate使用分布式锁案例讲解

    在Java中使用RedisTemplate结合Redis来实现分布式锁是一种常见的做法,特别适用于微服务架构或多实例部署的应用程序中,以确保数据的一致性和避免竞态条件,下面给大家分享使用Spring Boot和RedisTemplate实现分布式锁的案例,感兴趣的朋友一起看看吧
    2024-08-08
  • 计算机二级考试java软件操作教程 教大家如何学习java

    计算机二级考试java软件操作教程 教大家如何学习java

    如何成为一名知识丰富的Java程序员,顺利通过计算机二级Java考试,这篇文章主要主要教大家如何学习java,java的学习路线是什么,从何学起,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java入门交换数组中两个元素的位置

    Java入门交换数组中两个元素的位置

    在Java中,交换数组中的两个元素是基本的数组操作,下面我们将详细介绍如何实现这一操作,以及在实际应用中这种技术的重要性,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Spring Boot中操作使用Redis实现详解

    Spring Boot中操作使用Redis实现详解

    Spring Boot与Redis结合使用,通过使用Spring Data Redis来实现对Redis的操作,实现数据缓存和高效存储,提高应用程序的性能和响应速度。可以利用Spring Boot自带的Redis Starter方便地集成和配置Redis
    2023-04-04
  • JavaWeb实现RSA+AES混合加密

    JavaWeb实现RSA+AES混合加密

    RSA+AES的混合加密时,AES用于给传输的数据加密,然后通过RSA给AES的秘钥加密,本文就来详细的介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 浅谈java实现redis的发布订阅(简单易懂)

    浅谈java实现redis的发布订阅(简单易懂)

    本篇文章主要介绍了浅谈java实现 redis的发布订阅(简单易懂),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 修改及反编译可运行Jar包实现过程详解

    修改及反编译可运行Jar包实现过程详解

    这篇文章主要介绍了如何修改及反编译可运行Jar包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java中MultipartFile类型转为File类型的4种方法

    java中MultipartFile类型转为File类型的4种方法

    Spring提供了一个MultipartFile接口来处理文件上传,但有时候我们需要将MultipartFile转换为File来进行一些特定的操作,比如保存文件到本地或者进行文件的处理等,这篇文章主要给大家介绍了关于java中MultipartFile类型转为File类型的4种方法,需要的朋友可以参考下
    2024-09-09
  • 关于HashMap源码解读

    关于HashMap源码解读

    HashMap是基于哈希表的Map接口实现,主要用于存储键值对,它通过数组、链表和红黑树来实现,解决了哈希冲突问题,Java 8中,HashMap对数据结构进行了优化,引入红黑树来提高查找效率,此外,HashMap是非线程安全的,适用于单线程环境
    2024-09-09
  • Go&java算法之最大数示例详解

    Go&java算法之最大数示例详解

    这篇文章主要为大家介绍了Go&java算法之最大数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论