斷路器HystrixCircuitBreaker

dsf小童鞋發表於2019-01-19
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

相關文章