Hystrix简介
多个微服务之间调用的时候,微服务A调用微服务B,微服务B调用微服务C,如果微服务C出现问题或者响应时间过长,就会导致微服务A占用越来越多的系统资源,进而导致系统崩溃,称为服务雪崩,其是由于提供者不可用导致消费者不可用,并将不可用逐渐放大的过程
如何防止雪崩呢?
- 为网络请求设置超时
- 使用断路器模式
Hystrix是什么
Hystrix是由Netflix开源的一个用于处理分布式系统的延迟和容错的开源库,在分布式系统,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性,"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间等待或抛出调用方无法处理的异常,保证了调用方的线程不会被长时间的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩
Hystrix基于命令模式,Command是在Receiver和Invoker之间添加的中间层,Command实现了对Receiver的封装,通过继承HystrixCommand来封装
public abstract class HystrixCommand<R> extends AbstractCommand<R> implements HystrixExecutable<R>, HystrixInvokableInfo<R>, HystrixObservable<R>
// 重写run方法,用于执行业务逻辑
protected abstract R run() throws Exception;
// 一般还需要重写getFallback 用于降级
protected R getFallback() {
throw new UnsupportedOperationException("No fallback available.");
}
}
一个HystrixCommand实例只能调用一次
如何做到的容错?
- 包裹请求 使用HystrixCommand包裹对外部依赖的调用逻辑,每个命令在独立的线程/信号量中执行