resilience4j(二):核心模塊CircuitBreaker源碼之CircuitBreaker基於註解實現原理

@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返回類型的邏輯會在後續章節講解。

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