From 1abf678ab0227e2fab22ea199986c2548b2eb696 Mon Sep 17 00:00:00 2001 From: jiangyuan Date: Sat, 9 Mar 2024 04:04:02 +0800 Subject: [PATCH] Fix ThrottleGatewayFilter in sample app to create TokenBucket only once (#2900) * Fix ThrottleGatewayFilter obtain TokenBucket problem --- .../gateway/sample/ThrottleGatewayFilter.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/ThrottleGatewayFilter.java b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/ThrottleGatewayFilter.java index 47487c8e..b44923c0 100644 --- a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/ThrottleGatewayFilter.java +++ b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/ThrottleGatewayFilter.java @@ -36,6 +36,8 @@ public class ThrottleGatewayFilter implements GatewayFilter { private static final Log log = LogFactory.getLog(ThrottleGatewayFilter.class); + private volatile TokenBucket tokenBucket; + int capacity; int refillTokens; @@ -44,6 +46,20 @@ public class ThrottleGatewayFilter implements GatewayFilter { TimeUnit refillUnit; + + private TokenBucket getTokenBucket() { + if (tokenBucket != null) { + return tokenBucket; + } + synchronized (this) { + if (tokenBucket == null) { + tokenBucket = TokenBuckets.builder().withCapacity(capacity) + .withFixedIntervalRefillStrategy(refillTokens, refillPeriod, refillUnit).build(); + } + } + return tokenBucket; + } + public int getCapacity() { return capacity; } @@ -82,9 +98,7 @@ public class ThrottleGatewayFilter implements GatewayFilter { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - - TokenBucket tokenBucket = TokenBuckets.builder().withCapacity(capacity) - .withFixedIntervalRefillStrategy(refillTokens, refillPeriod, refillUnit).build(); + TokenBucket tokenBucket = getTokenBucket(); // TODO: get a token bucket for a key log.debug("TokenBucket capacity: " + tokenBucket.getCapacity());