目录
一、用途
Hystrix(https://github.com/Netflix/Hystrix)是Netflix(https://www.netflix.com/global)的一个开源
项目,主要作用是通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容
错能力。(复制过来的)
二、实现策略
2.1、线程隔离
上图当前service1异常时候,此时service1来了大量的请求,请求一直继续过来,
一直消耗CPU资源,当CPU资源消耗完了之后,会导致整个项目宕机,不仅使得service1
不能提供正常服务,而且还影响了service2和service3服务。
为了解除此种场景,Hystrix提供了线程隔离。其原理是为每个服务创建一个线程池,
每次请求过来请线程池获取请求资源,线程池中封装了service提供的服务。
2.2、单个依赖超时控制
单个依赖可以配置超时时间,当前规定时间未获取结果,可直接走callback逻辑。对于不同的处理结果,自定义化处理结果内容和逻辑。
返回结果分别为:成功,失败(抛出异常),超时,线程拒绝,短路。
2.3、熔断器控制
时间控制:withCircuitBreakerSleepWindowInMilliseconds 超过阈值走getFallback 接口
成功率控制:withCircuitBreakerErrorThresholdPercentage 超过阈值走getFallback 接口
三、code 示例
Hystrix三种执行方式:
(1)同步模式
HelloWorldCommand tb=new HelloWorldCommand(newOrderId);
result = tb.execute();
(2)异步模式
HelloWorldCommand yb = new HelloWorldCommand(newOrderId);
Future<OrderDTO> future = yb.queue();
result = future.get(1, TimeUnit.SECONDS);
(3)观察者模式
//观察者模式调用
Observable<OrderDTO> gc = new HelloWorldCommand(newOrderId).observe();
//注册完整执行生命周期事件
gc.subscribe(new rx.Observer<OrderDTO>() {
@Override
public void onCompleted() {
// onNext/onError完成之后最后回调
System.out.println("执行完成回调逻辑");
}
@Override
public void onError(Throwable e) {
// 当产生异常时回调
System.out.println("onError " + e.getMessage());
e.printStackTrace();
}
@Override
public void onNext(OrderDTO v) {
// 获取结果后回调
System.out.println("获取结果回调函数: " + JSON.toJSONString(v));
}
});