Skip to content

Commit 61b7ccb

Browse files
committed
1 parent f10c69f commit 61b7ccb

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

spring-boot-demo-ratelimit-guava/README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public @interface RateLimiter {
135135
@Aspect
136136
@Component
137137
public class RateLimiterAspect {
138-
private static final com.google.common.util.concurrent.RateLimiter RATE_LIMITER = com.google.common.util.concurrent.RateLimiter.create(Double.MAX_VALUE);
138+
private static final ConcurrentMap<String, com.google.common.util.concurrent.RateLimiter> RATE_LIMITER_CACHE = new ConcurrentHashMap<>();
139139

140140
@Pointcut("@annotation(com.xkcoding.ratelimit.guava.annotation.RateLimiter)")
141141
public void rateLimit() {
@@ -150,11 +150,14 @@ public class RateLimiterAspect {
150150
RateLimiter rateLimiter = AnnotationUtils.findAnnotation(method, RateLimiter.class);
151151
if (rateLimiter != null && rateLimiter.qps() > RateLimiter.NOT_LIMITED) {
152152
double qps = rateLimiter.qps();
153-
log.debug("【{}】的QPS设置为: {}", method.getName(), qps);
154-
// 重新设置 QPS
155-
RATE_LIMITER.setRate(qps);
153+
if (RATE_LIMITER_CACHE.get(method.getName()) == null) {
154+
// 初始化 QPS
155+
RATE_LIMITER_CACHE.put(method.getName(), com.google.common.util.concurrent.RateLimiter.create(qps));
156+
}
157+
158+
log.debug("【{}】的QPS设置为: {}", method.getName(), RATE_LIMITER_CACHE.get(method.getName()).getRate());
156159
// 尝试获取令牌
157-
if (!RATE_LIMITER.tryAcquire(rateLimiter.timeout(), rateLimiter.timeUnit())) {
160+
if (RATE_LIMITER_CACHE.get(method.getName()) != null && !RATE_LIMITER_CACHE.get(method.getName()).tryAcquire(rateLimiter.timeout(), rateLimiter.timeUnit())) {
158161
throw new RuntimeException("手速太快了,慢点儿吧~");
159162
}
160163
}

spring-boot-demo-ratelimit-guava/src/main/java/com/xkcoding/ratelimit/guava/aspect/RateLimiterAspect.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.springframework.stereotype.Component;
1212

1313
import java.lang.reflect.Method;
14+
import java.util.concurrent.ConcurrentHashMap;
15+
import java.util.concurrent.ConcurrentMap;
1416

1517
/**
1618
* <p>
@@ -24,7 +26,7 @@
2426
@Aspect
2527
@Component
2628
public class RateLimiterAspect {
27-
private static final com.google.common.util.concurrent.RateLimiter RATE_LIMITER = com.google.common.util.concurrent.RateLimiter.create(Double.MAX_VALUE);
29+
private static final ConcurrentMap<String, com.google.common.util.concurrent.RateLimiter> RATE_LIMITER_CACHE = new ConcurrentHashMap<>();
2830

2931
@Pointcut("@annotation(com.xkcoding.ratelimit.guava.annotation.RateLimiter)")
3032
public void rateLimit() {
@@ -39,11 +41,14 @@ public Object pointcut(ProceedingJoinPoint point) throws Throwable {
3941
RateLimiter rateLimiter = AnnotationUtils.findAnnotation(method, RateLimiter.class);
4042
if (rateLimiter != null && rateLimiter.qps() > RateLimiter.NOT_LIMITED) {
4143
double qps = rateLimiter.qps();
42-
log.debug("【{}】的QPS设置为: {}", method.getName(), qps);
43-
// 重新设置 QPS
44-
RATE_LIMITER.setRate(qps);
44+
if (RATE_LIMITER_CACHE.get(method.getName()) == null) {
45+
// 初始化 QPS
46+
RATE_LIMITER_CACHE.put(method.getName(), com.google.common.util.concurrent.RateLimiter.create(qps));
47+
}
48+
49+
log.debug("【{}】的QPS设置为: {}", method.getName(), RATE_LIMITER_CACHE.get(method.getName()).getRate());
4550
// 尝试获取令牌
46-
if (!RATE_LIMITER.tryAcquire(rateLimiter.timeout(), rateLimiter.timeUnit())) {
51+
if (RATE_LIMITER_CACHE.get(method.getName()) != null && !RATE_LIMITER_CACHE.get(method.getName()).tryAcquire(rateLimiter.timeout(), rateLimiter.timeUnit())) {
4752
throw new RuntimeException("手速太快了,慢点儿吧~");
4853
}
4954
}

0 commit comments

Comments
 (0)