目錄
一、用途
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));
}
});