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());