Hystrix概念
Hystrix 服务容错保护 的概念和说明
这就是大名鼎鼎的:豪猪
豪猪的英文就是:Hystrix,国外一些大牛的程序员在给自己的架构起名字的时候,往往就这么特别。哪天咱们中国人自己也能写出些架构,咱们就按照中国人的习惯给自己的框架命名,要我就命名为:熊猫、神龙、白蛇、神雕。嘿嘿!有点不正经了,下面回到今天的正题,Hystrix 。
在微服务架构中,服务与服务之间通过远程调用的方式进行通信,一旦某个被调用的服务发生了故障,其依赖服务也会发生故障,此时就会发生故障的蔓延,最终导致系统瘫痪。Hystrix实现了断路器模式,当某个服务发生故障时,通过断路器的监控,给调用方返回一个错误响应,而不是长时间的等待,这样就不会使得调用方由于长时间得不到响应而占用线程,从而防止故障的蔓延。Hystrix具备服务降级、服务熔断、线程隔离、请求缓存、请求合并及服务监控等强大功能。
Spring Cloud Hystrix 是Spring Cloud Netflix 子项目的核心组件之一,具有服务容错及线程隔离等一系列服务保护功能,从今天开始,咱们介绍springcloud 中比较重要的一部分内容: Hystrix 服务容错保护机制。
一、 哪服务框架中为什么需要服务容错保护呢?
在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式互相众依赖。由于每个单元都在不同的进程中进行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的服务也出现延迟,如果调用方的请求不断增加,最后就会因等待出现故障的依赖方响应形成任务积压,最终导致自身服务的瘫痪。
上面这些文字比如抽象,咱们通过一个词和一张图就可以说明【雪崩效应】。哪什么是雪崩效应呢?请看下图,一边看图一边说明
在微服务架构中通常会有多个服务层调用,大量的微服务通过网络进行通信,从而支撑起整个系统。各个微服务之间也难免存在大量的依赖关系。然而任何服务都不是100%可用的,网络往往也是脆弱的,所以难免有些请求会失败。基础服务的故障导致级联故障,进而造成了整个系统的不可用,这种现象被称为服务雪崩效应。服务雪崩效应描述的是一种因服务提供者的不可用导致服务消费者的不可用,并将不可用逐渐放大的过程。
正如上面的图表示的一样: A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
二、要解决雪崩效应带来的系统瘫痪影响,我们程序员和架构人员应该要怎么做呢?
两种解决方案和思路:超时机制 、断路器模式
超时机制
通过网络请求其他服务时,都必须设置超时。正常情况下,一个远程调用一般在几十毫秒内就返回了。当依赖的服务不可用,或者因为网络问题,响应时间将会变得很长(几十秒)。而通常情况下,一次远程调用对应了一个线程/进程,如果响应太慢,那这个线程/进程就会得不到释放。而线程/进程都对应了系统资源,如果大量的线程/进程得不到释放,并且越积越多,服务资源就会被耗尽,从而导致资深服务不可用。所以必须为每个请求设置超时。
但超时机制不能彻底解决雪崩的出现。
断路器模式
上面就是一个“断路器”原理图。
“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线咱中有电器 发生短路时,“断路器”能及时切断故障电路和,防止发生过载、发热甚至起火等严重后果。
试想一下,家庭里如果没有断路器,电流过载了(例如功率过大、短路等),电路不断开,电路就会升温,甚至是烧断电路、起火。有了断路器之后,当电流过载时,会自动切断电路(跳闸),从而保护了整条电路与家庭的安全。当电流过载的问题被解决后,只要将关闭断路器,电路就又可以工作了。
所以有了这个“断路器”,家里就安全多了。
三、分布式架构中 “断路器”模式的作用
当某个服务单元发生故障(类似电器发生短路)后,通过断路器的故障监控(类似熔断保险丝),向调用 方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用而不释放,避免了故障在分布式系统中的蔓延(雪崩效应就不会发生,家里就不会发生电器过热导致火灾)。
同样的道理,当依赖的服务有大量超时时,再让新的请求去访问已经没有太大意义,只会无谓的消耗现有资源。譬如我们设置了超时时间为1秒,如果短时间内有大量的请求(譬如50个)在1秒内都得不到响应,就往往意味着异常。此时就没有必要让更多的请求去访问这个依赖了,我们应该使用断路器避免资源浪费。
断路器可以实现快速失败,如果它在一段时间内侦测到许多类似的错误(譬如超时),就会强迫其以后的多个调用快速失败,不再请求所依赖的服务,从而防止应用程序不断地尝试执行可能会失败的操作,这样应用程序可以继续执行而不用等待修正错误,或者浪费CPU时间去等待长时间的超时。断路器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。
断路器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。
四、Spring cloud Hystrix 服务容错保护机制
下面这段代码中直接使用Hystrix介绍中的一张原图:
spring cloud Hystrix 实现了断路器、线程隔离等一系列服务保护功能。该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力 ,Hystrix 具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等功能。
Hystrix 是 Netflix 开源的一个用于处理分布式系统的延迟和容错的库,可以防止系统间的级联故障,提高系统的弹性。
以下是一个简单的使用 Hystrix 的 Java 示例代码,使用了 Hystrix 的命令模式来包装对依赖服务的调用:
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;public class HelloWorldCommand extends HystrixCommand<String> {private final String name;public HelloWorldCommand(String name) {// 设置命令组的键,Hystrix会根据这个键对命令进行分组监控和报告super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));this.name = name;}@Overrideprotected String run() {// 这里可以执行实际的业务逻辑,如调用远程服务return "Hello " + name + "!";}@Overrideprotected String getFallback() {// 当执行业务逻辑失败时,会执行这里的逻辑return "Hello Failure " + name + "!";}
}// 使用示例
public class HystrixTest {public static void main(String[] args) {HelloWorldCommand command = new HelloWorldCommand("World");String result = command.execute(); // 同步执行// 或者使用// String result = command.queue().get(); // 异步执行System.out.println(result);}
}
在这个例子中,HelloWorldCommand
继承自 HystrixCommand
类,并实现了 run()
方法来执行业务逻辑,如果执行失败或者超时,则执行 getFallback()
方法返回备用响应。在 main
方法中,我们创建了 HelloWorldCommand
的实例并调用 execute()
方法同步执行命令。
这个例子展示了如何使用 Hystrix 来包装和执行对依赖服务的调用,并提供了失败回退的机制,增加了系统的健壮性。
1.1、熔断机制
原理:
- 在正常状态下,电路处于关闭状态
- 如果调用服务持续出错或者超时达到一个阀值,则断路器会直接切断请求链,电路被打开进入熔断状态,以避免发送大量无效请求而影响系统吞吐量,后续一段时间内所有调用都会被拒绝
- 一段时间以后,保护器会尝试进入半熔断状态,允许少量请求进行尝试。如果调用仍然失败,则回到熔断状态;如果调用成功,则回到电路关闭状态
1.2、隔离机制
1.2.1、线程池隔离模式
在Hystrix的线程池隔离模式下,会为每一个依赖建立一个线程池,以存储对当前依赖的请求。每个依赖可以根据权重分配资源(线程),一部分依赖出现问题不会影响其它依赖使用资源。
1.2.2、信号量隔离模式
原理:
2.jpg
- 记录当前运行的信号量
- 判断信号量的值,如果大于设置的最大线程值,则丢弃该类型请求;如果小于设置的值,则执行计数操作,信号量+1
信号量隔离模式无法应对突发流量。
1.2.3、降级机制
服务降级是指:如果整体资源快不够用了,则将某些服务先关掉,等到资源足够时再重新开启这些服务。和熔断的目的一样,该机制也是用来保证上游服务的稳定性。
降级一般采用两种模式:
- fallback模式:如果服务失败,则通过fallback返回静态值进行降级
- 服务级联的模式:如果服务失败,则调用备用服务。服务级联模式的目的是尽可能返回数据。但是如果考虑不充分,则有可能导致级联的服务崩溃
1.2.4、缓存机制
缓存机制是将请求结果缓存起来,如果相同"key"的请求发送过来,则将直接从缓存中取出结果,以减少请求开销。采用这种机制会对排查故障造成一定的困扰。
六、总结
Hystrix 提供一系列服务保护功能,是服务治理框架必不可少的一部分内容。
Hystrix实战(springcloud工程引入Hystrix)
参考:Spring Cloud Hystrix:服务容错保护_springcloud alibaba hystrix 的服务保护机制-CSDN博客
一、如何添加并整合Hystrix
这段英文中主要提到添加整合Hystrix,需要引入spring-cloud-starter-hystrix这个资源,在pom.xml配置中就需要引入这个资源路径了。
二、怎么使用Hystrix呢?
如何使用Hystrix呢,主要是在启动类中添加@EnableCircuitBreaker注解。
在要访问的接口中,配置 @HystrixCommand,并配置fallbackMethod的方法;
注意:
- 回退方法的名称可随意定,但出、入参必须和所注解的方法一致,否则报fallbackMethod未定义错误。
- 远程方法执行时间大于断路器的时限(例如timeoutInMilliseconds=5s,而远程方法执行10s),hystrix中的MethodExecutionAction.execute捕获异常,HystrixCommand检查是否有配置回退方法,如果有,则回退方法执行,调用方按回退方法返回的内容继续执行,直到业务处理结束。如果没有,则抛HystrixRuntimeException
三、定义服务降级
fallback是hystrix 命令执行失败时使用的后备方法,用来实现服务的降级处理逻辑。在HystrixCommand 中可以通过重载getFallback()方法来实现服务降级逻辑,Hystrix 会在run()执行过程中出现错误,超时,线程池拒绝、断路器熔断等情况时,执行getFallback()方法内的逻辑。