Spring Cloud与微服务之Hystrix

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZZY1078689276/article/details/84986604

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
            }
        }
    ]
}

猜你喜欢

转载自blog.csdn.net/ZZY1078689276/article/details/84986604