Hystrix最全详解(万字图文总结)

Hystrix最全详解(万字图文总结)-mikechen

Hystrix定义

Hystrix是SpringCloud的一个核心组件,提供了容错机制和故障保护功能,以增加系统的稳定性和弹性。

Hystrix最全详解(万字图文总结)-mikechen

 

Hystrix作用

以下是Hystrix的几个主要作用:

1.故障隔离

Hystrix通过实现断路器模式来隔离故障的服务。

当依赖的服务出现故障或延迟时,Hystrix能够快速失败并返回一个备选的响应,而不会导致整个系统的崩溃。

Hystrix最全详解(万字图文总结)-mikechen

 

2.服务降级

Hystrix支持服务降级功能,即当某个服务出现问题时,可以提供备用的响应数据,避免用户直接面对错误或超时。

开发人员可以定义降级逻辑,例如返回默认值、从缓存中获取数据等,确保系统的可用性。

 

3.超时控制

Hystrix可以设置调用的超时时间,这样可以防止长时间的等待,避免资源的浪费和系统的阻塞。

 

4.熔断机制

Hystrix通过熔断机制来限制故障服务的访问。当失败的请求达到一定的阈值时,Hystrix将自动打开断路器,并且在一段时间内拒绝对该服务的请求。

这样可以快速失败并迅速恢复服务,减少对不稳定服务的压力。

 

Hystrix使用

1.添加Hystrix依赖

如果是使用Maven,可以在pom.xml文件中添加以下依赖:

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

 

2.添加Hystrix注解

接下来,你可以在需要使用Hystrix的方法上加上@HystrixCommand注解,该注解标识了一个使用Hystrix的方法。

如下所示:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.cloud.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@RestController
public class ExampleController {

    @GetMapping("/hello")
    @HystrixCommand(fallbackMethod = "fallbackHello")
    public String hello() {
        // 调用依赖的服务或执行其他操作
        // 返回结果
        return "Hello World!";
    }

    // 容错逻辑,用于处理服务调用失败时的情况
    public String fallbackHello() {
        return "Fallback Hello";
    }
}

在上述示例中,hello()方法使用了@HystrixCommand注解,并指定了fallbackMethod参数,指定了容错逻辑方法fallbackHello()。当hello()方法调用失败或超时时,Hystrix会自动执行fallbackHello()方法,并返回容错逻辑的结果。

 

3.Hystrix配置

还需要设置相关属性:

hystrix:
  command:
    default:
      execution.isolation.thread.timeoutInMilliseconds: 5000
      circuitBreaker.requestVolumeThreshold: 10
      circuitBreaker.sleepWindowInMilliseconds: 10000

在上述配置中,设置了默认的超时时间为5秒,当请求达到10个时,熔断器打开,并在10秒的时间窗口后尝试恢复服务。

通过以上步骤,你就可以在Spring Boot应用中使用Hystrix来实现容错和故障保护的功能。

 

Hystrix原理

Hystrix的原理主要基于断路器模式(Circuit Breaker Pattern)和线程池隔离(Thread Pool Isolation)。

1.断路器模式

首先,我们需要了解为什么需要熔断器这种模式。

比如:在分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个别的服务。

如下图所示:

Hystrix最全详解(万字图文总结)-mikechen

如果各个服务正常运行,那大家齐乐融融,但是如果其中一个服务Service C崩坏掉会出现什么样的情况呢?

很有可能就会出现,下图的拖挂别的服务场景:

Hystrix最全详解(万字图文总结)-mikechen

ServiceB依赖于ServiceC,由于ServiceC访问量比较大,由于ServiceC挂了,很可能ServiceB也会被拖累挂。

同理,上游的ServiceA还依赖于ServiceB,同样也会被涉及。

最终一个服务失败,导致整条链路的服务都失败的情形,为造成大面积的服务雪崩效应。

这就给之前我们的大A股熔断是一个道理,所以针对这种情况需要考虑引入Hystrix 熔断机制,避免大面积雪崩等场景。

Hystrix 断路器是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(FallBack)。

而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方不会长时间、不必要占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

 

2.线程池隔离

其实,这就类似资源隔离,比如:货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个。

如下图所示:

Hystrix最全详解(万字图文总结)-mikechen

这种资源隔离减少风险,Hystrix将同样的模式运用到了服务调用者上。

Hystrix使用线程池来对服务进行隔离,以提供资源隔离和控制。

每个Hystrix命令(即使用@HystrixCommand注解标记的方法)都会分配一个线程池来执行。

通过使用线程池隔离,可以确保某个服务的执行不会影响到其他服务的执行。

如果某个服务的线程池饱和或发生故障,不会影响其他服务的可用性。

以上就是Hystrix详解,更多Spring Cloud微服务请查看:Spring Cloud微服务架构(万字图文详解)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法