Hystrix服務隔離

目錄

 

一、用途

二、實現策略

2.1、線程隔離

2.2、單個依賴超時控制

2.3、熔斷器控制

三、code 示例


一、用途

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));
            }
        });

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章