spring cloud Hystrix工作流程和原理

概述

本篇文章讲的是Hystrix的工作流程和原理实现。其他的配置信息等到下一篇文章再讲。

Hystrix的工作流程

话不多说,先上图:

spring cloud Hystrix工作流程和原理_第1张图片

我也不是很懂,先放着,等到有机会再来写。

现在是时候展现一波真正的技术了

创建对象
我们从上图可以看到,首先构建一个HystrixCommand或者是HystrixObservableCommand对象,用来表示对依赖服务的操
作请求,同时传递所有需要的参数。这两个command对象分别针对不同的应用场景。
	. HystrixCommand:用在依赖的服务返回单个操作结果的时候。
	. HystrixObservableCommand:用在依赖的服务返回多个操作结果的时候。

简单介绍一下命令模式: 给你一个很简单的解释。命令模式中包含四个对象:Receiver,接受者,处理业务逻辑,Command:抽象命令,就是简简单单的接口,比如你要实现什么样的命令。ConcreteCommand:具体的命令实现类,在类中有一个属性是接受者。Invoker:调用者,这个类中有一个属性是command接口。是不是炒鸡简单。接下来可以写一个小的例子:

package com.bobo;
/**
 * @author [email protected]
 * @create 2018-10-24 20:39
 **/
public class Test {


}

class Receiver {
    public void execute () {
        System.out.println("Hello World");
    }
}

interface Command {
    public void sayHello();
}

class ConcreteCommand implements Command {

    private Receiver receiver;

    public ConcreteCommand (Receiver receiver) {
        this.receiver = receiver;
    }
    @Override
    public void sayHello() {
        receiver.execute();
    }
}

class Invoker {
    private Command command;

    public Invoker(Command command) {
        this.command = command;
    }

    public void  sayHello () {
        command.sayHello();
    }
}

上面的这个例子就是最简单的命令模式啦,上面 提到的那两个类就是对command的进一步封装了。
命令执行
从图中我们可以看到一共存在4种命令的执行方式,而Hystrix在执行时会根据创建的Command对象以及具体的情况来选择一
个执行。其中HystrixCommand实现了下面两个执行方式。
	. execute ():同步执行,从依赖的服务返回一个单一的结果对象,或是在发生错误的时候抛出异常。
	. queue ():异步执行,直接返回一个Future对象,其中包含了服务执行结束时要返回的单一结果对象。
而HystrixObservableCommand实现了另外两种执行方式。
	. observe ():返回Observable对象,它代表了操作的多个结果,它是一个HotObservable.
	. toObservable ():同样会返回Observable对象,也代表了操作的多个结果,但它返回的是一个Cold Observable。

在Hystrix的底层实现中大量使用了RxJava,这里来介绍一下Rxjava
Observable用来向订阅者Subscriber对象发布事件, Subscriber对象则在接收到事件后对其进行处理,而在这里所指的事件通常就是对依赖服务的调用。·一个observable可以发出多个事件,直到结束或是发生异常。
Observable对象每发出一个事件,就会调用对应观察者Subscriber对象的onNext ()方法。
每一个Observable的执行,最后一定会通过调用Subscriber. onCompleted ()或者Subscriber.onError()来结束该事件的操作流。

在这里我们对于事件源observable提到了两个不同的概念: Hot Observable和ColdObservable,分别对应
了上面command. observe ()和command.toObservable ()的返回对象。其中Hot Observable,它不论“事件
源”是否有“订阅者”,都会在创建后对事件进行发布,所以对于Hot Observable的每一个“订阅者”都有可能
是从“事件源”的中途开始的,并可能只是看到了整个操作的局部过程。而Cold Observable在没有  “订阅
者”的时候并不会发布事件,而是进行等待,直到有“订阅者”之后才发布事件,所以对于ColdObservable的订
阅者,它可以保证从一开始看到整个操作的全部过程。
结果是否被缓存
若当前命令的请求缓存功能是被启用的 ,如果该命令缓存命中,那么缓存的结果就会立即以Observable对象的形式返回。
断路器是否被打开
在命令结果没有缓存命中的时候,Hystrix在执行命令前需要检查断路器是否是打开状态:
	如果断路器是打开的,那么Hystrix不会执行命令,然后是转接到fallback处理逻辑。
	如果断路器是关闭的,那么Hystrix跳转到 第五步,检查是否有可用资源来执行命令。
线程池/请求对列/信号量是否占满
定义服务降级

未完,待续…

你可能感兴趣的:(spring,cloud,spring,cloud)