@CircuitBreaker
原理是利用Spring Aop進行增強,@CircuitBreaker 聲明在Class上,該Class所有public method會做熔斷處理,聲明在特定method上,只有該特定method纔會做熔斷處理。
CircuitBreakerAspect
CircuitBreaker利用CircuitBreakerAspect作爲切面容器進行熔斷處理,實現org.springframework.core.Ordered,保證Pointcut優先切入。
The Resilience4j Aspects order is following:
Retry > CircuitBreaker > RateLimiter > Bulkhead
構造方法
//CircuitBreaker基於SpringBoot的自動配置
private final CircuitBreakerConfigurationProperties circuitBreakerProperties;
/*CircuitBreaker註冊容器,只能管理被Spring管理的bean創建的CircuitBreaker 實例*/
private final CircuitBreakerRegistry circuitBreakerRegistry;
//CircuitBreaker切面擴展默認支持(RxJava2CircuitBreakerAspectExt、ReactorCircuitBreakerAspectExt)
private final List<CircuitBreakerAspectExt> circuitBreakerAspectExtList;
public CircuitBreakerAspect(CircuitBreakerConfigurationProperties backendMonitorPropertiesRegistry, CircuitBreakerRegistry circuitBreakerRegistry, @Autowired(required = false) List<CircuitBreakerAspectExt> circuitBreakerAspectExtList) {
this.circuitBreakerProperties = backendMonitorPropertiesRegistry;
this.circuitBreakerRegistry = circuitBreakerRegistry;
this.circuitBreakerAspectExtList = circuitBreakerAspectExtList;
}
定義切入點
只能有circuitBreaker class或 circuitBreaker註解
@Pointcut(value = "@within(circuitBreaker) || @annotation(circuitBreaker)", argNames = "circuitBreaker")
public void matchAnnotatedClassOrMethod(CircuitBreaker circuitBreaker) {
}
熔斷處理@Around
CircuitBreakerAspect -> circuitBreakerAroundAdvice() 方法是resilience4j利用Spring Aop做熔斷處理邏輯處。
getBackendMonitoredAnnotation(proceedingJoinPoint)
根據切入目標Class,獲取其@CircuitBreaker註解配置,主要爲了circuitBreakerName
getOrCreateCircuitBreaker(methodName, backend)
CircuitBreakerRegistry註冊容器會根據circuitBreakerName從容器中取出circuitBreaker實例,顧名思義有則get,無則以circuitBreakerName及默認配置(前面章節講到)創建circuitBreaker實例。
circuitBreakerAspectExt.handle是RxJava2、Reactor切面處理。
handleJoinPointCompletableFuture(proceedingJoinPoint, circuitBreaker);
處理返回類型爲異步調用的熔斷切入
defaultHandling(proceedingJoinPoint, circuitBreaker, methodName)
該方法默認處理返回類型爲Java 類型的熔斷切入點
/**
* the default Java types handling for the circuit breaker AOP
*/
private Object defaultHandling(ProceedingJoinPoint proceedingJoinPoint, io.github.resilience4j.circuitbreaker.CircuitBreaker circuitBreaker, String methodName) throws Throwable {
//該方法會在後續章節着重介紹,java開發場景主要使用該段代碼
return circuitBreaker.executeCheckedSupplier(proceedingJoinPoint::proceed);
}
注意點:
(1)若不採用官方推薦默認Spring Boot自動配置方式配置CircuitBreaker,注意CircuitBreaker 實例必須被Spring 管理bean創建,否則會創建默認配置的CircuitBreaker 實例。
(2)注意@CircuitBreaker聲明在Class和Method上的作用域。
(3)基於AOP實現的CircuitBreaker相關bean在CircuitBreakerConfiguration中配置。
(4)CircuitBreakerAspect會根據切入點method.returnType選擇合適的處理策略。
下圖爲CircuitBreaker切面容器CircuitBreakerAspect處理熔斷的大體流程圖
CircuitBreakerAspect -> defaultHandling 默認處理Java返回類型的邏輯會在後續章節講解。