From 8d151d8e97496b7ca75aa8b357bceaf48dde574d Mon Sep 17 00:00:00 2001 From: liaozan <378024053@qq.com> Date: Mon, 17 Jul 2023 01:48:35 +0800 Subject: [PATCH] Remove RateLimiter --- starters/cache-spring-boot-starter/pom.xml | 8 -- .../cache/CacheAutoConfiguration.java | 20 ---- .../cache/concurrent/ExpressionParser.java | 44 --------- ...RateLimitCacheKeyVariablesContributor.java | 20 ---- .../cache/concurrent/RateLimitAspect.java | 97 ------------------- ...RateLimitCacheKeyVariablesContributor.java | 16 --- .../cache/concurrent/RateLimiter.java | 40 -------- support/schbrain-spring-support/pom.xml | 4 + 8 files changed, 4 insertions(+), 245 deletions(-) delete mode 100644 starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/ExpressionParser.java delete mode 100644 starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/NoOpRateLimitCacheKeyVariablesContributor.java delete mode 100644 starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimitAspect.java delete mode 100644 starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimitCacheKeyVariablesContributor.java delete mode 100644 starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimiter.java diff --git a/starters/cache-spring-boot-starter/pom.xml b/starters/cache-spring-boot-starter/pom.xml index 75e466d..cb35ee5 100644 --- a/starters/cache-spring-boot-starter/pom.xml +++ b/starters/cache-spring-boot-starter/pom.xml @@ -26,14 +26,6 @@ org.apache.commons commons-pool2 - - org.springframework.boot - spring-boot-starter-aop - - - org.redisson - redisson-spring-boot-starter - diff --git a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/CacheAutoConfiguration.java b/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/CacheAutoConfiguration.java index bf6d068..c7df7c4 100644 --- a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/CacheAutoConfiguration.java +++ b/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/CacheAutoConfiguration.java @@ -1,18 +1,11 @@ package com.schbrain.framework.autoconfigure.cache; -import com.schbrain.common.util.JacksonUtils; -import com.schbrain.framework.autoconfigure.cache.concurrent.RateLimitAspect; import com.schbrain.framework.autoconfigure.cache.properties.CacheProperties; import com.schbrain.framework.autoconfigure.cache.provider.CacheProvider; import com.schbrain.framework.autoconfigure.cache.provider.CacheProviderDelegate; import com.schbrain.framework.autoconfigure.cache.provider.redis.RedisCacheConfiguration; -import org.redisson.api.RedissonClient; -import org.redisson.codec.JsonJacksonCodec; -import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -37,17 +30,4 @@ public class CacheAutoConfiguration { return provider; } - @Bean - @ConditionalOnMissingBean - @ConditionalOnBean(RedissonClient.class) - public RateLimitAspect rateLimitAspect(ConfigurableListableBeanFactory beanFactory, RedissonClient redissonClient) { - return new RateLimitAspect(beanFactory, redissonClient); - } - - @Bean - @ConditionalOnBean(RedissonClient.class) - public RedissonAutoConfigurationCustomizer redissonConfigurationCodecCustomizer() { - return config -> config.setCodec(new JsonJacksonCodec(JacksonUtils.getObjectMapper())); - } - } diff --git a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/ExpressionParser.java b/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/ExpressionParser.java deleted file mode 100644 index d191ee1..0000000 --- a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/ExpressionParser.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.schbrain.framework.autoconfigure.cache.concurrent; - -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.context.expression.BeanFactoryResolver; -import org.springframework.expression.Expression; -import org.springframework.expression.ParserContext; -import org.springframework.expression.common.TemplateParserContext; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author liaozan - * @since 2023-07-15 - */ -public class ExpressionParser { - - private final Map expressionCache = new ConcurrentHashMap<>(256); - - private final SpelExpressionParser parser = new SpelExpressionParser(); - private final ParserContext parserContext = new TemplateParserContext(); - - private final ConfigurableListableBeanFactory beanFactory; - - public ExpressionParser(ConfigurableListableBeanFactory beanFactory) { - this.beanFactory = beanFactory; - } - - public String parse(String value, Map variables) { - String resolved = beanFactory.resolveEmbeddedValue(value); - Expression expression = expressionCache.computeIfAbsent(resolved, this::parseExpression); - StandardEvaluationContext context = new StandardEvaluationContext(); - context.setBeanResolver(new BeanFactoryResolver(beanFactory)); - context.setVariables(variables); - return expression.getValue(context, String.class); - } - - private Expression parseExpression(String value) { - return parser.parseExpression(value, parserContext); - } - -} diff --git a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/NoOpRateLimitCacheKeyVariablesContributor.java b/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/NoOpRateLimitCacheKeyVariablesContributor.java deleted file mode 100644 index a728680..0000000 --- a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/NoOpRateLimitCacheKeyVariablesContributor.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.schbrain.framework.autoconfigure.cache.concurrent; - -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.reflect.MethodSignature; - -import java.util.Collections; -import java.util.Map; - -/** - * @author liaozan - * @since 2022/5/5 - */ -public class NoOpRateLimitCacheKeyVariablesContributor implements RateLimitCacheKeyVariablesContributor { - - @Override - public Map contribute(RateLimiter rateLimiter, JoinPoint joinPoint, MethodSignature signature) { - return Collections.emptyMap(); - } - -} diff --git a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimitAspect.java b/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimitAspect.java deleted file mode 100644 index 3e6b6a2..0000000 --- a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimitAspect.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.schbrain.framework.autoconfigure.cache.concurrent; - -import com.schbrain.common.exception.BaseException; -import com.schbrain.common.util.ApplicationName; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.MapUtils; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.aspectj.lang.reflect.MethodSignature; -import org.redisson.api.RRateLimiter; -import org.redisson.api.RateIntervalUnit; -import org.redisson.api.RateType; -import org.redisson.api.RedissonClient; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import static com.schbrain.common.util.ParameterDiscoverUtils.getMethodArgsMap; - -/** - * @author liaozan - * @see RateLimiter - * @since 2022/5/5 - */ -@Slf4j -@Aspect -public class RateLimitAspect { - - private final Map rateLimiterMap = new ConcurrentHashMap<>(); - private final Map, RateLimitCacheKeyVariablesContributor> contributorMap = new ConcurrentHashMap<>(); - - private final String keyPrefix; - private final RedissonClient redissonClient; - private final ExpressionParser expressionParser; - - public RateLimitAspect(ConfigurableListableBeanFactory beanFactory, RedissonClient redissonClient) { - this.keyPrefix = ApplicationName.get(); - this.redissonClient = redissonClient; - this.expressionParser = new ExpressionParser(beanFactory); - } - - @Before("@annotation(annotation)") - public void beforeExecute(JoinPoint joinPoint, RateLimiter annotation) { - MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); - doRateLimit(annotation, joinPoint, methodSignature); - } - - protected void doRateLimit(RateLimiter annotation, JoinPoint joinPoint, MethodSignature signature) { - Map variables = prepareVariables(annotation, joinPoint, signature); - - String cacheKey = expressionParser.parse(annotation.cacheKey(), variables); - if (cacheKey == null) { - throw new BaseException("cacheKey should not be null"); - } - - String formattedCacheKey = formatCacheKey(cacheKey); - RRateLimiter rateLimiter = rateLimiterMap.computeIfAbsent(formattedCacheKey, key -> createRateLimiter(key, annotation)); - - if (rateLimiter.tryAcquire()) { - return; - } - throw new BaseException("The access frequency is too fast, please try again later"); - } - - protected String formatCacheKey(String cacheKey) { - return "rateLimit:" + keyPrefix + ":" + cacheKey; - } - - protected RRateLimiter createRateLimiter(String cacheKey, RateLimiter annotation) { - RRateLimiter rateLimiter = redissonClient.getRateLimiter(cacheKey); - rateLimiter.setRate(RateType.PER_CLIENT, annotation.permits(), annotation.expireTime(), RateIntervalUnit.valueOf(annotation.unit().name())); - return rateLimiter; - } - - private Map prepareVariables(RateLimiter annotation, JoinPoint joinPoint, MethodSignature signature) { - Map variables = getMethodArgsMap(signature.getMethod(), joinPoint.getArgs()); - Class contributorClass = annotation.contributor(); - if (contributorClass == null || contributorClass == NoOpRateLimitCacheKeyVariablesContributor.class) { - return variables; - } - - RateLimitCacheKeyVariablesContributor contributor = contributorMap.get(contributorClass); - if (contributor == null) { - contributor = BeanUtils.instantiateClass(contributorClass); - contributorMap.put(contributorClass, contributor); - } - Map contributeVariables = contributor.contribute(annotation, joinPoint, signature); - if (MapUtils.isNotEmpty(contributeVariables)) { - variables.putAll(contributeVariables); - } - return variables; - } - -} diff --git a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimitCacheKeyVariablesContributor.java b/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimitCacheKeyVariablesContributor.java deleted file mode 100644 index 41d0b7d..0000000 --- a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimitCacheKeyVariablesContributor.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.schbrain.framework.autoconfigure.cache.concurrent; - -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.reflect.MethodSignature; - -import java.util.Map; - -/** - * @author liaozan - * @since 2022/5/5 - */ -public interface RateLimitCacheKeyVariablesContributor { - - Map contribute(RateLimiter rateLimiter, JoinPoint joinPoint, MethodSignature signature); - -} diff --git a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimiter.java b/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimiter.java deleted file mode 100644 index ac04a76..0000000 --- a/starters/cache-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/cache/concurrent/RateLimiter.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.schbrain.framework.autoconfigure.cache.concurrent; - -import java.lang.annotation.*; -import java.util.concurrent.TimeUnit; - -/** - * @author liaozan - * @since 2022/5/5 - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface RateLimiter { - - /** - * 过期时间 - */ - long expireTime() default 10; - - /** - * 过期时间单位 - */ - TimeUnit unit() default TimeUnit.SECONDS; - - /** - * 过期时间内允许的许可数 - */ - int permits() default 3; - - /** - * 缓存的 key,使用 spring el 进行解析 - */ - String cacheKey(); - - /** - * evaluation variables contributor - */ - Class contributor() default NoOpRateLimitCacheKeyVariablesContributor.class; - -} diff --git a/support/schbrain-spring-support/pom.xml b/support/schbrain-spring-support/pom.xml index 2a5e146..c093c2a 100644 --- a/support/schbrain-spring-support/pom.xml +++ b/support/schbrain-spring-support/pom.xml @@ -22,6 +22,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.boot + spring-boot-starter-aop + org.springframework.boot spring-boot-configuration-processor -- GitLab