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 { } }
下面先看一下該接口的抽象方法:java
allowRequest(): 每一個Hystrix命令的請求都經過它判斷是否被執行(已經再也不使用,使用attemptExecution()方法進行判斷)
attemptExecution(): 每一個Hystrix命令的請求都經過它判斷是否被執行
isOpen(): 返回當前斷路器是否打開
markSuccess(): 用來關閉斷路器
markNonSuccess: 用來打開斷路器ide
下面看一下該接口中的類:ui
Factory: 維護了一個Hystrix命令和HystrixCircuitBreaker的關係的集合ConcurrentHashMap<String, HystrixCircuitBreaker> circuitBreakersByCommand。其中key經過HystrixCommandKey來定義,每個Hystrix命令都須要有一個Key來標識,同時根據這個Key能夠找到對應的斷路器實例。
NoOpCircuitBreaker: 一個啥都不作的斷路器,它容許全部請求經過,而且斷路器始終處於閉合狀態
HystrixCircuitBreakerImpl:斷路器的另外一個實現類。atom
在該類中定義了斷路器的五個核心對象:.net
HystrixCommandProperties properties:斷路器對應實例的屬性集合對象/斷路器對應HystrixCommand實例的屬性對象
HystrixCommandMetrics metrics:用來讓HystrixCommand記錄各種度量指標的對象
AtomicReference<Status> status: 用來記錄斷路器的狀態,默認是關閉狀態
AtomicLong circuitOpened:斷路器打開的時間戳,默認-1,表示斷路器未打開
AtomicReference<Subscription> activeSubscription: 記錄HystrixCommandcode
對接口的實現以下:對象
@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, 不然返回falseip