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