本篇文章讲的是Hystrix的工作流程和原理实现。其他的配置信息等到下一篇文章再讲。
话不多说,先上图:
我也不是很懂,先放着,等到有机会再来写。
我们从上图可以看到,首先构建一个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跳转到 第五步,检查是否有可用资源来执行命令。