Hystrix从原理到使用
文章目录
一、什么是Hystrix
- 源自Martin Fowler的Circuit Breaker,即断路器。“断路器”本身是一种开关装置,用于线路上的过载保护,当线路发生短路时,会及时切断故障电路,防止一系列问题。
- 在分布式架构中,断路器模式也是类似,当某个单元发生故障,及时切断联系,防止线程因调用故障服务而长时间等待而不被释放,最终导致故障在分布式系统中的蔓延。
- Hystrix实现的功能有:服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并、以及服务监控等功能。(对于请求缓存功能,个人建议不要使用,除非该实例是单机运行,否则会出现数据不一致的问题)
二、Hystrix的原理
在讲解Hystrix的原理之前,先介绍两种设计模式,分别是:命令模式、观察者模式。
1、命令模式
以上就是命令模式的图示:Invoker为行为请求者、Receiver为行为实现者。以下列出这种模式的伪代码:
public class InvokerAndReceiver {
/**
* 命令的抽象
*/
interface Command {
void execute();
}
/**
* 调用者
*/
static class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
}
/**
* 业务的具体实现
*/
static class Receiver {
public void action() {
//do some task.
System.out.println("doing...");
}
}
/**
* 命令的封装
*/
static class CommandImpl implements Command {
private Receiver receiver;
public CommandImpl(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
}
}
public static void main(String[] args) {
Receiver receiver=new Receiver();
Command command=new CommandImpl(receiver);
Invoker invoker=new Invoker();
invoker.setCommand(command);
invoker.execute();
}
}
2、观察者模式
观察者模式的实现模型与订阅模式类似,这里以Hystrix底层使用的RxJava作为介绍。
public static void main(String[] args) {
//被观察者,也是事件源
Observable<String> source=Observable.create(subscriber -> {
subscriber.onNext("Hello !");
subscriber.onNext("welcome to subscribe it.");
//事件源通知异常。
subscriber.onError(new NullPointerException("error"));
//结束
subscriber.onCompleted();
});
//观察者
Subscriber<String> subscriber=new Subscriber<String>() {
@Override
public void onCompleted() {
//完成后的工作
}
@Override
public void onError(Throwable throwable) {
//观察者在这处理异常的事务
}
@Override
public void onNext(String s) {
//获取事件源的持续信息,如果事件源持续发布事件。
System.err.println(s);
}
};
source.subscribe(subscriber);
}
以下是观察者模式的两种分类:
- 热观察
- 每个观察者都可以在事件源的中途加入,这会造成看到的是加入后的局部信息。
- 冷观察
- 事件源需要等待观察者加入后,才发布事件,这样,看到的是全部过程。
好了,介绍完这两种模式,我们才能够分析Hystrix的底层原理。
3、原理分析
首先,我们从@HystrixCommand注解入手。
@HystrixCommand(fallbackMethod = "fallBack")
public String hiService() {
return restTemplate.getForObject("http://provider/zone?",String.class);
}
@HystrixCommand注解会为当前方法创建一个HystrixCommand对象,这个类的主要作用是命令模式中对于Command的封装,执行命令有如下两个方法:
//用于异步请求,返回的是Future对象,包含服务执行结束时会返回的结果对象。
public Future<R> queue() {
/*
* The Future returned by Observable.toBlocking().toFuture() does not implement the
* interruption of the execution thread when the "mayInterrupt" flag of Future.cancel(boolean) is set to true;
* thus, to comply with the contract of Future, we must wrap around it.
*/
final Future<R> delegate = toObservable