Fix ThrottleGatewayFilter in sample app to create TokenBucket only once (#2900)

* Fix ThrottleGatewayFilter obtain TokenBucket problem
This commit is contained in:
jiangyuan
2024-03-09 04:04:02 +08:00
committed by GitHub
parent 674e2a886e
commit 1abf678ab0

View File

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