Merge branch '2.2.x'

This commit is contained in:
Spencer Gibb
2020-04-08 22:49:20 -04:00
3 changed files with 42 additions and 17 deletions

View File

@@ -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)

View File

@@ -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 }

View File

@@ -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(