斷路器HystrixCircuitBreaker

package com.netflix.hystrix;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;

import com.netflix.hystrix.HystrixCommandMetrics.HealthCounts;
import rx.Subscriber;
import rx.Subscription;

public interface HystrixCircuitBreaker {

    boolean allowRequest();
    
    boolean isOpen();

    void markSuccess();

    void markNonSuccess();

    boolean attemptExecution();

    class Factory {
        // String is HystrixCommandKey.name() (we can't use HystrixCommandKey directly as we can't guarantee it implements hashcode/equals correctly)
        private static ConcurrentHashMap<String, HystrixCircuitBreaker> circuitBreakersByCommand = new ConcurrentHashMap<String, HystrixCircuitBreaker>();
    }


    class HystrixCircuitBreakerImpl implements HystrixCircuitBreaker {
    }

    static class NoOpCircuitBreaker implements HystrixCircuitBreaker {
    }

}

下面先看一下該接口的抽象方法:

allowRequest(): 每個Hystrix命令的請求都通過它判斷是否被執行(已經不再使用,使用attemptExecution()方法進行判斷)
attemptExecution(): 每個Hystrix命令的請求都通過它判斷是否被執行
isOpen(): 返回當前斷路器是否打開
markSuccess(): 用來關閉斷路器
markNonSuccess: 用來打開斷路器

下面看一下該接口中的類:

Factory: 維護了一個Hystrix命令和HystrixCircuitBreaker的關係的集合ConcurrentHashMap<String, HystrixCircuitBreaker> circuitBreakersByCommand。其中key通過HystrixCommandKey來定義,每一個Hystrix命令都需要有一個Key來標識,同時根據這個Key可以找到對應的斷路器實例。
NoOpCircuitBreaker: 一個啥都不做的斷路器,它允許所有請求通過,並且斷路器始終處於閉合狀態
HystrixCircuitBreakerImpl:斷路器的另一個實現類。

HystrixCircuitBreakerImpl介紹

在該類中定義了斷路器的五個核心對象:

HystrixCommandProperties properties:斷路器對應實例的屬性集合對象/斷路器對應HystrixCommand實例的屬性對象
HystrixCommandMetrics metrics:用來讓HystrixCommand記錄各類度量指標的對象
AtomicReference<Status> status: 用來記錄斷路器的狀態,默認是關閉狀態
AtomicLong circuitOpened:斷路器打開的時間戳,默認-1,表示斷路器未打開
AtomicReference<Subscription> activeSubscription: 記錄HystrixCommand

對接口的實現如下:

        @Override
        public boolean isOpen() {
            if (properties.circuitBreakerForceOpen().get()) {
                return true;
            }
            if (properties.circuitBreakerForceClosed().get()) {
                return false;
            }
            return circuitOpened.get() >= 0;
        }

用來判斷斷路器是否打開或關閉。主要步驟有:

如果斷路器強制打開,返回true
如果斷路器強制關閉,返回false
判斷circuitOpened的值,如果大於等於0,返回true, 否則返回false

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