Hystrix简介
Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。
应用场景
在微服务架构中,存在着众多的服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较于较传统的架构更加不稳定。为了解决这样的问题,产生了断路器等一系列的服务保护机制。
比如当对特定的呼叫达到一定阈值时(Hystrix中的默认值为5秒内的20次故障),电路打开,不进行通讯,并且是在一个隔离的线程中进行的。
雪崩效应
在微服务架构中通常会有多个服务层调用的情况。而基础服务的故障可能会导致级联故障,进而造成整个系统不可用,这种现象被称之为服务雪崩效应。
服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐级放大的过程。
特点
Hystrix主要有如下特点:
-
包裹请求:使用HystrixCommand(或HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在独立线程中执行。这是用到了设计模式中的“命令模式”。
-
跳闸机制:当某服务的错误率超过一定阈值时(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,从而不是排队等候,从而加速失败判定。
-
监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。
-
回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。
-
自我修复:断路器打开一段时间后,会自动进入“半开”状态。断路器打开、关闭、半开的逻辑转换。
Hystrix的使用
在springcloud-goods-order中添加Hystrix依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
在OrderApplication中启用Hystrix
@EnableHystrix
在ItemService中添加容错处理方法:
/**
* 调用商品的务提供的接口进行查询数据
* @param id
* @return
*/
@HystrixCommand(fallbackMethod = "queryItemByIdFallbackMethod") //进行容错处理
public Item queryItemById(Long id){
return this.itemFeignClient.queryItemById(id);
}
public Item queryItemByIdFallbackMethod(Long id){ //请求失败执行的方法
return new Item(id,"查询商品信息出错!",null,null,null);
}
当请求的商品微服务挂掉时,会触发Hystrix中自定义的回调函数queryItemByIdFallbackMethod
,自己通过返回一个新的空Item对象,来保证订单微服务不会因为商品微服务挂掉后,自己也被连带挂掉的情况。
这里需要注意的是,queryItemByIdFallbackMethod()方法的名称,必须与fallbackMethod中的值相一致,同时其返回类型还必须得相同。
比如说当我们手动停掉所有的商品微服务后,再次访问订单微服务的接口时
http://127.0.0.1:8082/order/13135351635
其响应的结果如下,从这里,我们可以看出,尽管说我们请求不到商品微服务中的商品条目信息了,但是我们对于订单微服务的请求仍然是正常执行的,这说明我们的Hystrix现在已经能够正常的使用了。
{
"orderId": "13135351635",
"userId": 1,
"createDate": 1544677668861,
"updateDate": 1544677668861,
"orderDetails": [
{
"orderId": "13135351635",
"item": {
"id": 1,
"title": "查询商品信息出错!",
"pic": null,
"desc": null,
"price": null
}
},
{
"orderId": "13135351635",
"item": {
"id": 2,
"title": "查询商品信息出错!",
"pic": null,
"desc": null,
"price": null
}
}
]
}