Hystrix熔断降级组件学习

2024-08-29 21:44

本文主要是介绍Hystrix熔断降级组件学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hystrix熔断降级组件学习

    • 一、Hystrix是什么?
    • 二、Hystrix的作用
    • 三、Spring Cloud整合Hystrix代码示例
      • 3.1. 添加依赖
      • 3.2. 启用Hystrix
      • 3.3. 定义服务调用
    • 四、熔断器仪表盘
      • 4.1. 添加依赖
      • 4.2. 启用Hystrix Dashboard
      • 4.3. 访问Dashboard(仪表盘)
    • 五、Spring Cloud整合Hystrix原理
      • 5.1. 整合入口
      • 5.2 HystrixCommandAspect
      • 5.3 Hystrix的断路器配置
      • 5.4 Hystrix隔离机制原理

一、Hystrix是什么?

Hystrix是由Netflix开源的一个容错框架,主要用于处理分布式系统中的故障和延迟,以提高系统的弹性和稳定性。它通过服务降级、服务熔断、依赖隔离和实时监控等功能,在复杂的分布式系统中提供断路器模式来阻止级联失败,并提供回退机制来增强系统的弹性。

在微服务架构中,服务间的调用变得非常频繁和复杂。当某个服务出现故障时,如果不加以控制,很容易引发级联故障,导致整个系统崩溃。Hystrix通过服务降级、熔断和依赖隔离等机制,有效防止了这种情况的发生,提高了系统的稳定性和可靠性。

二、Hystrix的作用

Hystrix是Netflix开源的一个服务隔离组件,主要用于处理分布式系统的延迟和容错。它具备以下主要功能:

  1. 熔断器模式:当某个服务的失败率达到一定阈值时,Hystrix会自动触发熔断,阻止对该服务的进一步请求,从而避免系统资源的无谓消耗。
  2. 服务降级:在熔断器开启后,Hystrix会执行服务降级逻辑,返回预设的默认值或缓存数据,以保证服务的部分可用性。
  3. 资源隔离:通过线程池或信号量对服务调用进行隔离,限制任何一个依赖的影响范围,防止单个服务故障耗尽整个系统的资源。
  4. 实时监控与告警:提供近实时的监控和告警功能,帮助开发者及时发现并解决问题。

三、Spring Cloud整合Hystrix代码示例

3.1. 添加依赖

首先,需要在项目的构建文件(如Maven或Gradle)中添加Hystrix的依赖项。以Maven为例:

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

3.2. 启用Hystrix

在Spring Boot的主类或配置类上添加@EnableHystrix注解来启用Hystrix。

3.3. 定义服务调用

在服务调用时,使用@HystrixCommand注解来标记需要容错处理的方法,并指定一个回退方法(fallback method)。

@RestController  
@RequestMapping("/api")  
public class MyController {  @Autowired  private MyService myService;  @GetMapping("/user/test")  @HystrixCommand(fallbackMethod = "sayHelloFallBack")public String testUser(@RequestParam Integer userId) {  return myService.getUserInfo(userId);  }  public String sayHelloFallBack(Integer userId) {  return "Service is down, please try again later.";  }  
}  @Service  
public class MyService {  @Autowired  private RestTemplate restTemplate;  public String getUserInfo(Integer userId) {  // 假设这里调用远程服务  String url = "http://example.com/api/users/{userId}";  return restTemplate.getForObject(url, String.class, userId);  }  
}

四、熔断器仪表盘

在Spring Cloud中整合Hystrix Dashboard来监控微服务中的Hystrix熔断器状态是一个常见的做法。以下是一个简单的示例,展示如何将Hystrix Dashboard与Spring Cloud应用整合起来。

4.1. 添加依赖

首先,确保你的Spring Boot项目中已经添加了Spring Cloud Starter Hystrix和Spring Cloud Starter Hystrix Dashboard的依赖。以下是一个Maven示例:

  
<!-- Spring Cloud Hystrix Dashboard -->  
<dependency>  <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>  <version>2.2.5.RELEASE</version>  
</dependency>

注意:替换你的Spring Cloud版本为你项目中实际使用的Spring Cloud版本。

4.2. 启用Hystrix Dashboard

在你的Spring Boot应用的主类或配置类上添加@EnableHystrixDashboard注解来启用Hystrix Dashboard。
在这里插入图片描述

4.3. 访问Dashboard(仪表盘)

在Spring Cloud中,Hystrix会自动注册一个/hystrix.stream端点,启动你的Spring Boot应用,并访问Hystrix Dashboard的URL(通常是http://ip:port/hystrix

在这里插入图片描述

在Dashboard页面上,输入你的Metrics Stream的URL(例如,http://ip:port/hystrix.stream),然后点击“Monitor Stream”按钮。

比如我的应用是127.0.0.1:8801/hystrix.stream
在这里插入图片描述

上述请求报错,是因为hystrix整合springBoot 2.0以及之后的版本需要额外配置一些东西(Hystrix 目前处于停更维护阶段,springCloud 整合限流组件更常见的是Sentinel

配置yaml

指定哪些主机地址的Hystrix.stream可以被Hystrix Dashboard访问。这是出于安全考虑,防止未授权的访问尝试,从而保护系统的敏感信息和运行数据。

hystrix:dashboard:proxyStreamAllowList: localhost,127.0.0.1

注册Metric servlet

如果我们的SpringBoot是2.0以后版本,然后需要添加 ServletRegistrationBean 因为springboot的默认路径不是 “/hystrix.stream”。

  @Beanpublic ServletRegistrationBean getServlet() {HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);registrationBean.setLoadOnStartup(1);registrationBean.addUrlMappings("/hystrix.stream");registrationBean.setName("HystrixMetricsStreamServlet");return registrationBean;}

接着请求业务接口,该stream就可以查看请求监控信息了。

在这里插入图片描述

五、Spring Cloud整合Hystrix原理

本篇博文是在使用Hystrix的版本为2.2.5.RELEASE + springCloud 版本Hoxton.SR8下分析得出,不同版本可能有所差异,请读者谨慎辨别

springCloud整合Hystrix的步骤有三个

  1. 引入依赖(分析原理方式:其引入的依赖的自动装配类)
  2. 启动类使用**@EnableHystrix**(分析原理的方式:@EnableHystrix做了哪些操作)
  3. 需要配置熔断、降级的方式添加**@HystrixCommand** (分析原理的方式:@HystrixCommand做了哪些操作)

5.1. 整合入口

  • @EnableHystrix

@EnableHystrix注解来启用Hystrix。这个注解会触发Spring Cloud的自动配置机制,加载与Hystrix相关的配置和Bean。

  • 自动装配类
自动装配类实例化的bean作用
HystrixAutoConfigurationHystrixHealthIndicator用于监控Hystrix的健康状态,比如断路器状态,请求的成功率
HystrixWebfluxEndpoint为基于响应式编程模型的Spring Boot应用提供了Hystrix的端点,Hystrix主要设计用于同步的阻塞式调用,而WebFlux是基于响应式的非阻塞模型,使用过程中可能会有限制
HystrixStreamEndpoint这是一个用于暴露Hystrix实时指标的端点,实时监控Hystrix的状态和指标
HystrixMetricsBinder用于将Hystrix的度量指标(如请求成功率、失败率、响应时间等)绑定到Spring Boot的Micrometer度量系统中
HystrixCircuitBreakerAutoConfigurationHystrixCircuitBreakerFactory创建断路器实例
管理断路器状态
关闭(close)、打开(open)、半开(half-open)
ReactiveHystrixCircuitBreakerAutoConfigurationReactiveHystrixCircuitBreakerFactory这个自动装配类专门为响应式编程环境(如使用Spring WebFlux的应用)配置Hystrix的断路器。它允许在响应式流中利用Hystrix的断路器模式来保护远程服务调用。
HystrixSecurityAutoConfiguration与Hystrix和安全性相关的自动装配类
HystrixCircuitBreakerConfigurationHystrixCommandAspect这个切面(Aspect)负责处理带有@HystrixCommand注解的方法,从而在方法执行时自动应用断路器的逻辑。
HystrixShutdownHook应用程序关闭时执行特定清理任务的组件
  • @HystrixCommand

在 Spring Cloud 中,Hystrix 通常与 Spring Cloud Netflix 的 spring-cloud-starter-netflix-hystrix 依赖一起使用。整合的关键在于通过 Spring 的 AOP(面向切面编程)特性来包装服务调用,以便在调用失败时能够执行回退逻辑。

当 Spring 容器启动时,它会扫描所有带有 @HystrixCommand 注解的方法,并使用 AOP 技术创建一个代理。这个代理会在实际方法调用之前和之后插入逻辑,以处理断路器的逻辑(如是否允许调用、记录调用结果、触发回退等)。

5.2 HystrixCommandAspect

Hystrix整合的关键是AOP,HystrixCommandAspect就是Hystrix为我们生成AOP的入口类,见名知意,该类是处理 @HystrixCommand 的一个切面类。

  @Around("hystrixCommandAnnotationPointcut() || hystrixCollapserAnnotationPointcut()")public Object methodsAnnotatedWithHystrixCommand(ProceedingJoinPoint joinPoint) throws Throwable {//获取被代理的目标方法(原始方法),AOP代理可能会改变方法的签名或行为。Method method = AopUtils.getMethodFromTarget(joinPoint);Validate.notNull(method, "failed to get method from joinPoint: %s", new Object[]{joinPoint});//方法不能同时被@HystrixCommand和@HystrixCollapser修饰if (method.isAnnotationPresent(HystrixCommand.class) && method.isAnnotationPresent(HystrixCollapser.class)) {throw new IllegalStateException("method cannot be annotated with HystrixCommand and HystrixCollapser annotations at the same time");} else {//根据方法的注解类型(@HystrixCommand或@HystrixCollapser),从META_HOLDER_FACTORY_MAP中获取相应的//MetaHolderFactory,并创建MetaHolder实例。MetaHolder用于封装与Hystrix命令执行相关的元数据。MetaHolderFactory metaHolderFactory = (MetaHolderFactory)META_HOLDER_FACTORY_MAP.get(HystrixCommandAspect.HystrixPointcutType.of(method));MetaHolder metaHolder = metaHolderFactory.create(joinPoint);//创建HystrixInvokable:这个实例封装了实际要执行的方法调用。HystrixInvokable invokable = HystrixCommandFactory.getInstance().create(metaHolder);ExecutionType executionType = metaHolder.isCollapserAnnotationPresent() ? metaHolder.getCollapserExecutionType() : metaHolder.getExecutionType();try {Object result;if (!metaHolder.isObservable()) {//@HystrixCommand 默认非观察着模式处理CommandExecutor.execute() 我们的常用模式result = CommandExecutor.execute(invokable, executionType, metaHolder);} else {//@HystrixCollapser 注解使用的是观察模式处理//可观察的(响应式编程中的概念,表示数据流的源,允许观察者订阅以接收数据更新)result = this.executeObservable(invokable, executionType, metaHolder);}//返回执行结果return result;} catch (HystrixBadRequestException var9) {//省略异常处理}}}

5.3 Hystrix的断路器配置

隔离:Hystrix 通过线程池信号量将远程服务调用隔离开来,防止一个服务的失败影响到其他服务的调用。
快速失败:当检测到服务故障时,Hystrix 会迅速让请求失败,并调用回退逻辑,而不是让请求长时间等待或导致系统资源耗尽。
资源控制:通过限制并发请求的数量,Hystrix 可以防止某个服务消耗过多资源,影响系统的整体性能。

隔离策略:线程池配置

配置项描述默认值
hystrix.command.default.execution.isolation.strategy设置默认的隔离策略,THREAD 表示线程池隔离THREAD
hystrix.command.default.execution.isolation.thread
.timeoutInMilliseconds
线程池隔离下,命令执行的超时时间(毫秒)默认值取决于具体实现,通常为1秒或更长
hystrix.command.default.execution.isolation.thread.coreSize线程池的核心线程数,即线程池始终维持的活跃线程数10(但可能因版本或配置而异,需根据实际情况调整)
hystrix.command.default.execution.isolation.thread.maximumSize线程池允许的最大线程数,用于应对高并发情况10(但可能因版本或配置而异,需根据实际情况调整)
hystrix.command.default.execution.isolation.thread
.queueSizeRejectionThreshold
线程池队列拒绝阈值,当队列中的等待任务数超过此值时,即使没有达到maximumSize,也会拒绝新的命令5(但需注意,当maxQueueSize小于等于0时,此配置无效)
hystrix.command.default.execution.isolation.thread.maxQueueSize线程池阻塞队列的最大长度,用于控制队列中可等待的任务数-1(使用SynchronousQueue,不存储排队数据;大于0时使用LinkedBlockingQueue
hystrix.command.default.execution.isolation.thread.
keepAliveTimeMinutes
线程池中非核心线程的空闲存活时间(分钟),超过此时间后非核心线程将被终止

隔离策略:信号量配置

配置项描述默认值
hystrix.command.default.execution.isolation.strategy设置默认的隔离策略,SEMAPHORE 表示信号量隔离THREAD(因为默认是线程池隔离,所以信号量隔离需显式指定)
hystrix.command.default.execution.isolation.semaphore.
maxConcurrentRequests
信号量隔离下,同时执行的最大命令数(即信号量的最大值)无固定默认值,需根据业务场景和服务器资源来配置

断路器开关配置

配置项描述默认值
hystrix.command.default.circuitBreaker.enabled是否启用断路器功能。设置为true时启用,false时禁用。true
hystrix.command.default.circuitBreaker.requestVolumeThreshold触发断路器打开之前,必须达到的最小请求量。默认值可能因版本而异,但通常是一个较低的值(如20)
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds断路器打开后,等待多久尝试恢复服务(半开状态测试周期)。默认值可能因版本而异,但通常是一个合理的等待时间(如5000毫秒)
hystrix.command.default.circuitBreaker.errorThresholdPercentagerequestVolumeThreshold指定的请求量中,允许失败的百分比。超过此百分比将触发断路器打开。默认值可能因版本而异,但通常设置为50%左右。

5.4 Hystrix隔离机制原理

在Hystrix的源码中,隔离机制的实现主要依赖于HystrixThreadPoolHystrixSemaphore等类。

  1. 线程池隔离的源码实现

    • 线程池的创建与管理:Hystrix通过HystrixThreadPoolFactory类创建和管理线程池。每个服务(或命令)的线程池通过HystrixThreadPoolKey来标识,并存储在ConcurrentHashMap中以便复用。
    • 命令的执行:当命令(HystrixCommandHystrixObservableCommand)执行时,会首先检查对应的线程池是否有足够的资源来执行该命令。如果有,则将命令提交到线程池中异步执行;如果没有,则根据配置执行降级逻辑。(HystrixObservableCommand响应式编程实现类)。
  2. 信号量隔离的源码实现

    • 信号量的创建与管理:Hystrix使用HystrixSemaphore类来实现信号量隔离。每个服务(或命令)的信号量数量通过配置指定,并在命令执行时进行检查。
    • 命令的执行:在信号量隔离模式下,命令执行前会尝试获取信号量。如果成功获取,则执行命令;如果失败,则直接执行降级逻辑。

这篇关于Hystrix熔断降级组件学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言