Hystrix定义
Hystrix是SpringCloud的一个核心组件,提供了容错机制和故障保护功能,以增加系统的稳定性和弹性。
Hystrix作用
以下是Hystrix的几个主要作用:
1.故障隔离
Hystrix通过实现断路器模式来隔离故障的服务。
当依赖的服务出现故障或延迟时,Hystrix能够快速失败并返回一个备选的响应,而不会导致整个系统的崩溃。
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.断路器模式
首先,我们需要了解为什么需要熔断器这种模式。
比如:在分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个别的服务。
如下图所示:
如果各个服务正常运行,那大家齐乐融融,但是如果其中一个服务Service C崩坏掉会出现什么样的情况呢?
很有可能就会出现,下图的拖挂别的服务场景:
ServiceB依赖于ServiceC,由于ServiceC访问量比较大,由于ServiceC挂了,很可能ServiceB也会被拖累挂。
同理,上游的ServiceA还依赖于ServiceB,同样也会被涉及。
最终一个服务失败,导致整条链路的服务都失败的情形,为造成大面积的服务雪崩效应。
这就给之前我们的大A股熔断是一个道理,所以针对这种情况需要考虑引入Hystrix 熔断机制,避免大面积雪崩等场景。
Hystrix 断路器是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(FallBack)。
而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方不会长时间、不必要占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
2.线程池隔离
其实,这就类似资源隔离,比如:货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个。
如下图所示:
这种资源隔离减少风险,Hystrix将同样的模式运用到了服务调用者上。
Hystrix使用线程池来对服务进行隔离,以提供资源隔离和控制。
每个Hystrix命令(即使用@HystrixCommand
注解标记的方法)都会分配一个线程池来执行。
通过使用线程池隔离,可以确保某个服务的执行不会影响到其他服务的执行。
如果某个服务的线程池饱和或发生故障,不会影响其他服务的可用性。
以上就是Hystrix详解,更多Spring Cloud微服务请查看:Spring Cloud微服务架构(万字图文详解)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》