更多Spring与微服务相关的教程请戳这里 Spring与微服务教程合集
1、 Hystrix概述
1.1、Hystrix是什么?
hystrix是spring cloud netflix项目中的一个熔断器(circuit breaker),hystrix实现了熔断器模式,可以理解为熔断器是抽象的,而hystrix是具体的实现。
Hystrix是一个延迟和容错库,旨在隔离远程系统、服务和第三方库,阻止级联故障,在复杂的分布式系统中实现恢复能力
Hystrix单词意为豪猪,表示浑身有刺来保护自己
1.2、为什么要用Hystrix
- 当正常流量情况下,系统稳定运行;当进行促销、秒杀等活动,流量暴增,可能会影响某个服务A,导致CPU、内存占用过高等问题,结果导致服务A延迟,响应过慢;随着压力持续增加,服务A承受不住压力导致机器内部资源耗尽,这时会导致大量请求堆积彻底使服务A不可用。更糟糕的是,其它服务依赖了服务A,导致其它服务也出现请求堆积、资源占用等问题,这时会导致整个系统出现大面积的延迟和瘫痪,直到整个系统不可用。
- 在微服务体系中,多层调用是很常见的,较低级别的服务出现故障,会导致级联故障,直到传到用户那里。
- 当由10秒定义的滚动窗口中,假如请求过多或请求超时,导致服务不堪重负时,需要一种机制来处理延迟和故障,并保护整个系统处于稳定的状态。断路器就是这样一种机制,当出现错误或断路情况下,断路器就会打开,并且开发人员可以提供备用(fallback)方法。
1.3、Hystrix的设计目标
- 通过客户端库对延迟和故障进行保护和控制
- 在一个复杂的分布式系统中停止级联故障
- 快速失败和迅速恢复
- 在合理的情况下回退和优雅地降级
- 开启实时监控、告警和操作控制
1.4、Hystrix现状
Hystrix 当前已经进入为维护阶段,Netflix 认为Hystrix的定位和使命在功能上,当前已经完全满足了既有的内部系统,所以后期不再有新的开发和新的特性出现。
团队由于精力的原因,在Github上,不再review issue,不再接受Merge request,也不再发布新的版本,版本定格在1.5.18
。hystrix github
Hystrix虽然官方社区不再维护,但是其客户端熔断保护,断路器设计理念,有非常高的学习价值,为我们在服务保护的设计上,提供了非常好的设计思路;
除了官方不再维护之外,hystrix目前对于一般的分布式服务调度,甚至本地服务保护上,完全可以胜任,在短期内可以正常使用。
2、Hystrix入门
2.1、pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
这里分别介绍一下三个依赖的作用:
- 第一个是hystrix的依赖,这个是必须的
- 第二个是因为hystrix需要暴露端点以支持hystrix仪表盘,关于仪表盘后面会讲到
- 第三个是hystrix仪表盘的依赖
2.2、application.yml
management:
security:
enabled: false
endpoints:
web:
exposure:
# 暴露端点:/actuator/hystrix.stream
include: hystrix.stream
#include: '*'
2.3、具体使用方式
启动类需要打上这几个注解:
- @EnableHystrix或@EnableCircuitBreaker,这两个打一个就行,@EnableHystrix是@EnableCircuitBreaker的子类
- @EnableHystrixDashboard,用于开启仪表盘
将@HystrixCommand注解打在需要熔断的方法上
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/common")
public class CommonController {
/**
* 定义降级方法
* 如果原方法有参数,则降级方法也必须要有参数,否则报错,且位置在Throwable之前
*/
public String fallback(Integer type,Throwable t){
return "调用降级方法:"+t.getMessage();
}
@GetMapping("/hystrix")
//fallbackMethod指定降级方法,commandProperties用于配置@HystrixCommand
@HystrixCommand(fallbackMethod = "fallback",commandProperties = {})
public String hystrix(Integer type){
if(type == 0){
return "ok";
}else{
throw new NullPointerException("空指针异常");
}
}
}
2.4、仪表盘
hystrix仪表盘用于监控hystrix的各项指标,具体使用方式如下:
访问http://ip:port/上下文/hystrix
输入要监控的URL,比如:http://ip:port/上下文/actuator/hystrix.stream,再输入延迟和标题,最后点Monitor Stream即可