一、Hystrix介绍
1、Hystrix是什么?
在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很正常的。
Hystrix可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制.
Hystrix通过将依赖服务进行资源隔离,进而组织某个依赖服务出现故障的时候,这种故障在整个系统所有的依赖服务调用中进行蔓延,同时Hystrix还提供故障时的fallback降级机制
总而言之,Hystrix通过这些方法帮助我们提升分布式系统的可用性和稳定性
2、Hystrix的设计理念
- Give protection from and control over latency and failure from dependencies accessed (typically over the network) via third-party client libraries.
给依赖于第三方库的应用程序提供给保护 - Stop cascading failures in a complex distributed system.
在复杂的分布式系统当中避免级联失败 - Fail fast and rapidly recover.
快速失败并且快速恢复 - Fallback and gracefully degrade when possible.
在可能的情况下提供回退和优雅降级的能力 - Enable near real-time monitoring, alerting, and operational control.
通过近乎实时的指标,监控和警报来优化发现故障的时间
3、Hystrix提供的能力
Hystrix的出现即为解决雪崩效应,它通过四个方面的机制来解决这个问题
- 隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
- 优雅的降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
- 熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
- 缓存:提供了请求缓存、请求合并实现。
- 支持实时监控、报警、控制
4、什么是雪崩效应?
微服务之间进行rpc或者http调用时,我们一般都会设置调用超时,失败重试等机制来确保服务的成功执行,看上去很美,如果不考虑服务的熔断和限流,就是雪崩的源头。
-
假设我们有两个访问量比较大的服务A和B,这两个服务分别依赖C和D,C和D服务都依赖E服务
-
A和B不断的调用C,D处理客户请求和返回需要的数据。当E服务不能供服务的时候,C和D的超时和重试机制会被执行
-
由于新的调用不断的产生,会导致C和D对E服务的调用大量的积压,产生大量的调用等待和重试调用,慢慢会耗尽C和D的资源比如内存或CPU,然后也down掉。
-
A和B服务会重复C和D的操作,资源耗尽,然后down掉,最终整个服务都不可访问。
常见的导致雪崩的情况有以下几种:
- 程序bug导致服务不可用,或者运行缓慢
- 缓存击穿,导致调用全部访问某服务,导致down掉
- 访问量的突然激增。
二、整合Hystrix
1、创建项目 为eureka-client-consumer-hystrix,在Eureka篇中有eureka-client-consumer-ribbon项目,在此基础上添加新的POM依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、为main类添加@EnableHystrix注解
package com.eurekaclientconsumer.eurekaclientconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer