什么是Hystrix?
在分布式系统中,服务与服务之间的依赖错综复杂,一种不可避免的情况是某些服务会出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞。Hystrix是Netflix公司开源的一个项目,它提供了熔断器功能,能够阻止分布式系统中出现的联动故障。Hystrix是通过隔离服务的访问点阻止联动故障的,并提供故障的解决方案,从而提高了整个分布式系统的弹性。
Hystrix解决了什么问题?
在复杂的分布式系统中,可能有几十个服务相互依赖,这些服务由于某些原因,导致某个服务不可用。如果系统不隔离该不可用的服务,可能导致整个系统不可用,也是为了防止雪崩效应。
Hystrix设计原则
总的设计原则:
1、为了防止单个服务的故障耗尽整个服务的Servlet容器(如tomcat)的线程资源。
2、快速失败机制,如果某个服务出现故障,则调用该服务的请求快速失败,而不是线程等待。
3、提供快速回退fallback方案,在请求发生故障时,提供设定好的回退方案。
4、使用熔断机制,防止故障扩散到其他服务。
5、提供熔断器的监控组件Hystrix Dashboard,可以实时监控熔断器的状态。
Hystrix的工作机制
首先,当服务的某个api接口的失败次数在一定时间内小于设定的阈值时,熔断器处于关闭状态,该api接口正常提供服务。当该API接口处理请求的失败次数大于设定的阈值时,Hystrix判定该api接口出现故障,打开熔断器,这时请求该api接口会执行快速失败的逻辑即Fallback回退逻辑,不执行业务逻辑,请求的线程不会处于阻塞状态。处于打开状态的熔断器,一段时间后会处于半打开状态,并将一定数量的请求执行正常逻辑。剩下的请求会执行快速失败,若执行正常逻辑的请求失败了,则熔断器继续打开,若成功了,则熔断器关闭,这样熔断器就有了自我修复的功能。
这里介绍两种使用熔断器的实例
1、在RestTemplate和Ribbon上使用熔断器
maven引入hystrix依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
如果这里http://service-one/getUser的服务不可用,那么将会执行反馈方法hiError,进而调用service-hi/login服务。当然如果我们不想让它继续访问service-hi/login服务,也可以直接返回字符串或者失败状态码给客户端。
2、在Feign上的使用熔断器Hystrix Dashboard
同样引入maven依赖
application.yml
Application启动类
service
controller
访问http://localhost:8765/hystrix.stream,浏览器会显示熔断器的数据指标。
访问http://localhost:8765/hystrix,显示Hystrix Dashboard主页。
首页,出现Unable to connect to Command Metric Stream.
在application.yml中,加入management.context-path:/,重新启动
启动类添加bean
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
启动正常