Merge branch '2.2.x'
This commit is contained in:
@@ -260,22 +260,26 @@ public class RedisRateLimiter extends AbstractRateLimiter<RedisRateLimiter.Confi
|
|||||||
Flux<List<Long>> flux = this.redisTemplate.execute(this.script, keys,
|
Flux<List<Long>> flux = this.redisTemplate.execute(this.script, keys,
|
||||||
scriptArgs);
|
scriptArgs);
|
||||||
// .log("redisratelimiter", Level.FINER);
|
// .log("redisratelimiter", Level.FINER);
|
||||||
return flux.onErrorResume(throwable -> Flux.just(Arrays.asList(1L, -1L)))
|
return flux.onErrorResume(throwable -> {
|
||||||
.reduce(new ArrayList<Long>(), (longs, l) -> {
|
if (log.isDebugEnabled()) {
|
||||||
longs.addAll(l);
|
log.debug("Error calling rate limiter lua", throwable);
|
||||||
return longs;
|
}
|
||||||
}).map(results -> {
|
return Flux.just(Arrays.asList(1L, -1L));
|
||||||
boolean allowed = results.get(0) == 1L;
|
}).reduce(new ArrayList<Long>(), (longs, l) -> {
|
||||||
Long tokensLeft = results.get(1);
|
longs.addAll(l);
|
||||||
|
return longs;
|
||||||
|
}).map(results -> {
|
||||||
|
boolean allowed = results.get(0) == 1L;
|
||||||
|
Long tokensLeft = results.get(1);
|
||||||
|
|
||||||
Response response = new Response(allowed,
|
Response response = new Response(allowed,
|
||||||
getHeaders(routeConfig, tokensLeft));
|
getHeaders(routeConfig, tokensLeft));
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("response: " + response);
|
log.debug("response: " + response);
|
||||||
}
|
}
|
||||||
return response;
|
return response;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
/*
|
/*
|
||||||
@@ -323,7 +327,7 @@ public class RedisRateLimiter extends AbstractRateLimiter<RedisRateLimiter.Confi
|
|||||||
@Min(1)
|
@Min(1)
|
||||||
private int replenishRate;
|
private int replenishRate;
|
||||||
|
|
||||||
@Min(1)
|
@Min(0)
|
||||||
private int burstCapacity = 1;
|
private int burstCapacity = 1;
|
||||||
|
|
||||||
@Min(1)
|
@Min(1)
|
||||||
|
|||||||
@@ -44,7 +44,10 @@ end
|
|||||||
--redis.log(redis.LOG_WARNING, "allowed_num " .. allowed_num)
|
--redis.log(redis.LOG_WARNING, "allowed_num " .. allowed_num)
|
||||||
--redis.log(redis.LOG_WARNING, "new_tokens " .. new_tokens)
|
--redis.log(redis.LOG_WARNING, "new_tokens " .. new_tokens)
|
||||||
|
|
||||||
redis.call("setex", tokens_key, ttl, new_tokens)
|
if ttl > 0 then
|
||||||
redis.call("setex", timestamp_key, ttl, now)
|
redis.call("setex", tokens_key, ttl, new_tokens)
|
||||||
|
redis.call("setex", timestamp_key, ttl, now)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- return { allowed_num, new_tokens, capacity, filled_tokens, requested, new_tokens }
|
||||||
return { allowed_num, new_tokens }
|
return { allowed_num, new_tokens }
|
||||||
|
|||||||
@@ -104,6 +104,24 @@ public class RedisRateLimiterTests extends BaseWebClientTests {
|
|||||||
checkLimitEnforced(id, replenishRate, burstCapacity, requestedTokens, routeId);
|
checkLimitEnforced(id, replenishRate, burstCapacity, requestedTokens, routeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void redisRateLimiterWorksForZeroBurstCapacity() throws Exception {
|
||||||
|
String id = UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
int replenishRate = 1;
|
||||||
|
int burstCapacity = 0;
|
||||||
|
int requestedTokens = 1;
|
||||||
|
|
||||||
|
String routeId = "zero_burst_capacity_route";
|
||||||
|
rateLimiter.getConfig().put(routeId,
|
||||||
|
new RedisRateLimiter.Config().setBurstCapacity(burstCapacity)
|
||||||
|
.setReplenishRate(replenishRate)
|
||||||
|
.setRequestedTokens(requestedTokens));
|
||||||
|
|
||||||
|
Response response = rateLimiter.isAllowed(routeId, id).block();
|
||||||
|
assertThat(response.isAllowed()).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void keysUseRedisKeyHashTags() {
|
public void keysUseRedisKeyHashTags() {
|
||||||
assertThat(RedisRateLimiter.getKeys("1")).containsExactly(
|
assertThat(RedisRateLimiter.getKeys("1")).containsExactly(
|
||||||
|
|||||||
Reference in New Issue
Block a user