08、核心模块RateLimiter源码之RateLimiter基于注解实现原理

文章目录

  • @RateLimiter
  • RateLimiterConfiguration
  • RateLimiterAspect
    • 构造方法
  • 定义切入点
  • 限流处理@Around
  • 流程图

@RateLimiter

原理是利用Spring Aop进行增强,@RateLimiter声明在Class上,该Class所有public method会做限流处理,声明在特定method上,只有该特定method才会做限流处理。

RateLimiterConfiguration

RateLimiter AOP相关bean初始化定义。

实例化了RateLimiterRegistry、RateLimiterAspect、RxJava2RateLimterAspectExt、ReactorRateLimiterAspectExt、EventConsumerRegistry。
相关配置信息在RateLimiterConfigurationProperties中。

RateLimiterAspect

RateLimiter利用RateLimiterAspect作为切面容器进行限流处理,实现org.springframework.core.Ordered,保证Pointcut优先切入。

TheResilience4j Aspects order is following:
Retry > CircuitBreaker > RateLimiter > Bulkhead

构造方法

	/*RateLimiter注册容器,只能管理被Spring管理的bean创建的RateLimiter实例*/
	private final RateLimiterRegistry rateLimiterRegistry;
	//RateLimiter基于SpringBoot的自动配置
	private final RateLimiterConfigurationProperties properties;
   //RateLimiter切面扩展默认支持(RxJava2RateLimterAspectExt、ReactorRateLimiterAspectExt)
	private final List<RateLimiterAspectExt> rateLimiterAspectExtList;
	
	public RateLimiterAspect(RateLimiterRegistry rateLimiterRegistry, RateLimiterConfigurationProperties properties, @Autowired(required = false) List<RateLimiterAspectExt> rateLimiterAspectExtList) {
		this.rateLimiterRegistry = rateLimiterRegistry;
		this.properties = properties;
		this.rateLimiterAspectExtList = rateLimiterAspectExtList;
	}

定义切入点

定义了rateLimiter类或rateLimiter注解的类或方法。

	@Pointcut(value = "@within(rateLimiter) || @annotation(rateLimiter)", argNames = "rateLimiter")
	public void matchAnnotatedClassOrMethod(RateLimiter rateLimiter) {
		// Method used as pointcut
	}

限流处理@Around

RateLimiterAspect -> rateLimiterAroundAdvice 方法是resilience4j利用Spring Aop做限流处理逻辑处。

*
*
注意点:
(1)RateLimiter可走官方推荐默认Spring Boot自动配置方式配置,或被Spring管理的注册容器RateLimiterRegistry 创建,否则会创建默认配置的RateLimiter实例。
(2)注意@RateLimiterRegistry 声明在Class和Method上的作用域。
(3)基于AOP实现的RateLimiterRegistry 相关bean在RateLimiterConfiguration中配置。
(4)RateLimiterAspect会根据切入点method.returnType选择合适的处理策略。

流程图

下图为RateLimiter切面容器RateLimiterAspect处理限流的大体流程图

*
看过CircuitBreaker注解实现 会发现两者大体类似,所以有部分省略介绍了。
RateLimiterAspect::handleJoinPoint -> rateLimiter.executeCheckedSupplier 其实现及RateLimiter配置介绍等会在后续章节介绍。