【学习背景】
隔了很长一段时间,没有更新Spring Cloud系列博客了,最近一直在看《重新定义Spring Cloud实战》一书,发现书中写了一些深层次的东西,对于之前自己有学习的一些组件,如Eureka、Feign、Ribbon等,在看书的过程中,又有了很多新的收获。所以,还是想继续把其他的一些组件学习下,本篇博客学习的组件是Hystrix。
【学习内容】
一. 什么是Hystrix?
Hystrix是由Netflix开源的一个针对分布式系统容错处理的开源组件,旨在隔离远程系统、服务和第三方库,阻止级联故障,在复杂的分布式系统中实现恢复能力。
二. Hystrix解决哪些问题?
在说明Hystrix可以解决哪些问题之前,先回想一下什么是服务雪崩效应?举个简单的例子,在某系统上线初期,可能没有很大的用户量,在一段时间后,客户量增加,高并发情况下,系统无法访问,所有服务瘫痪不可用。
为了避免上述服务雪崩效应的发生,Spring Cloud体系中提供了Hystrix这样一个组件,支持采用断路器、服务降级、服务熔断、服务隔离等方式,保证服务可用。
- 服务降级:在高并发情况下,防止用户一直等待,使用服务降级方式,即返回一个友好提示给客户端,不会去处理请求,调用fallback本地方法,目的是为了用户体验。
- 服务熔断:目的是为了保护服务,在高并发情况下,如果请求达到了一定极限(可以自己设置阈值),如果流量超出了自己设置的阈值,自动开启服务保护功能,使用服务降级方式返回一个友好的提示。
- 服务隔离:线程池隔离。每个服务接口都有自己独立的线程池,每个线程池互不影响。缺点是CPU占用率高,所以不是所有的接口都需要去采用线程池隔离,关键核心接口采用即可。
三. Hystrix使用方法
- 在服务中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 在启动类上添加启用断路器模式
@SpringBootApplication
@EnableHystrix
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
- 在接口方法上添加@HystrixCommand注解和降级fallback
//默认开启了服务隔离、熔断、降级
@HystrixCommand(fallbackMethod="defaultUser")
public String getUser(String username) throws Exception {
if(username.equals("spring")) {
return "this is real user";
}else {
throw new Exception();
}
}
/**
* 出错则调用该方法返回预设友好错误
* @param username
* @return
*/
public String defaultUser(String username) {
return "The user does not exist in this system";
}
- 效果:在用户为“spring”的情况下访问,返回结果“this is real user”,否则返回“The user does not exist in this system”
【学习总结】
本篇博客的内容只是对Hystrix的一个初步认识与了解,在书中有更多详细的知识,可以进一步学习了解下。