章节索引 :

Hystrix 服务快速失败概念讲解与实操(一)

1. 前言

在之前的小节中,我们对服务容错与服务降级的定义做了详尽的介绍,同时,也在 Spring Cloud 中实现了 Hystrix 的服务容错与服务降级,这只是 Hystrix 最主要的一个特性,接下来让我们来看一下 Hystrix 的其他特性 - 服务快速失败。

服务快速失败分为普通版本和断路器版本,在本节中,我将对 Hystrix 中提供的普通版本的服务快速失败的定义做详细的介绍,在介绍完定义之后,我们会通过一段代码示例,来在 Spring Cloud 中实现普通版本的 Hystrix 的服务快速失败。

本节主要内容:

  • 什么是服务快速失败;

  • Hystrix 服务快速失败实操。

2. 什么是服务快速失败

在介绍服务快速失败之前,我们需要首先了解一个概念,那就是雪崩效应,那么什么是雪崩效应呢?

雪崩效应,是一种微服务项目间出现的一种不良现象,一般是指:由一个微服务发生故障之后,影响到了其他微服务的正常运行,或者说,当一个微服务发生故障不能正常运行时,所导致的其他微服务也跟着受影响,导致其他的微服务也不能正常运行。

假设现在有 4 个微服务,分别用服务 A 、服务 B 、服务 C 、服务 D 表示,并且,服务 B 的运行依赖于服务 A ,服务 C 的运行依赖于服务 B ,服务 D 的运行也依赖于服务 B , 这 4 个微服务之间的正常运行关系如下图所示:

假想微服务架构

为了验证雪崩效应,现在,我们假设服务 B 由于外界因素发生了宕机现象,那么此时的服务 B 由于没有任何保护措施,所以服务 B 无法正常运行。

由于服务 B 不能正常运行,所以,导致依赖于服务 B 的服务 C 和服务 D 都不能继续正常运行了,如下图所示:

雪崩效应产生原理

Tips:
1. 在实际工作中,在正式开发项目之前,应该就可能会出现雪崩现象的因素展开集中讨论,并将讨论结果以书面文件形式进行存储,这样一来,在真正发生雪崩现象时,可以及时启用应急方案;
2. 在开发微服务项目时,我们应该尽最大可能的去避免雪崩现象的发生,因为雪崩现象除了会影响业务的正常开展之外,也会影响我们的资源消耗。

在了解了什么是雪崩效应之后,接下来我们来看一下什么是服务快速失败。

服务快速失败,就微服务而言,是指:当微服务之间发生雪崩现象时,在程序中通过采用某种技术方法或手段,来将引起雪崩效应的微服务快速处理,其处理的最终目的是要保证该微服务不会导致其他后续的微服务出现故障。

说白了,服务快速失败就是当微服务发生故障时,所采取的一个兜底的方案,该方案的执行会迅速终止发生故障的微服务的继续运行,且可以保证后续微服务的正常运行,具体如下图所示:

服务快速失败的作用

在上图中,我们可以看到,发生故障的服务 B,由于采用了服务快速失败机制,导致在发生故障时采取了快速失败措施,且同时也保证了服务 C 和服务 D 的正常运行(至于如何保证的服务 C 和服务 D 的正常运行,就涉及到了源码层面,由于该知识不符合本套课程的初衷,所以这里不予介绍)。

Tips:
1. 服务快速失败几乎称为了每个微服务项目中必不可少的措施,所以,我们在开发微服务项目时,一定要采用服务快速失败机制,来保证我们项目的正常运行;
2. 理解什么是雪崩效应是理解什么是服务快速失败的前提概念,同学们一定要对这两个概念有所了解才行。

3. Hystrix 实现服务快速失败

在了解了什么是服务快速失败之后,让我们来看看,在 Spring Cloud 中如何使用 Hystrix 来实现服务快速失败吧。

这里我们还以之前的 hello 方法来做讲解,首先需要我们在项目中开启 Hystrix :

@SpringBootApplication
@EnableHystrix
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

此段代码已经在之前做过介绍,这里不再赘述。

在开启 Hystrix 之后,我们来看我们的 hello 方法:

@RequestMapping(value = "hello", method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "helloFail")
@ResponseBody
public String hello() throws InterruptedException {
    Thread.sleep(1000);
    return "helloWorld";
}

public String helloFail() {
    return "helloFailed";
}

在此段代码中,我们同样使用了 HystrixCommand 注解,并声明了 fallbackMethod 属性。

假设该段代码就位于我们上述的服务 B 中,且此时服务 B 发生了故障,导致访问服务 B 的 hello 方法,无法返回正常的影响。

由于服务 B 配置了服务快速失败,那么,我们在访问服务 B 的 hello 方法时,会返回由 fallbackMethod 属性所返回的兜底的响应,在实际业务中,helloFail 返回的则是兜底的业务数据,以保证后续的微服务可以正常运行。

4. 视频演示

5. 小结

本节内容概览

本小节通过图文并茂的方式,从什么是雪崩效应,到什么是 Hystrix 的服务快速失败,最后再到我们在 Spring Cloud 中服务快速失败的实现,详细介绍了雪崩效应的产生原因、产生现象,以及服务快速失败的通用实现手段,旨在帮助同学们可以很清晰的理解什么是雪崩效应,以及由雪崩效应所引起的服务快速失败现象。