Skip to content

Commit

Permalink
perf($api-gateway): pass rate limiter configuration dynamically
Browse files Browse the repository at this point in the history
  • Loading branch information
johnnymillergh committed Mar 1, 2021
1 parent 45c528b commit 0bd97b0
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,12 @@
@Configuration
@RequiredArgsConstructor
public class DiscoveryRouteConfiguration {
public final String FILTER_NAME = "RequestRateLimiter";
public final String REPLENISH_RATE_KEY = "redis-rate-limiter.replenishRate";
public final String BURST_CAPACITY_KEY = "redis-rate-limiter.burstCapacity";
public final String REQUESTED_TOKENS_KEY = "redis-rate-limiter.requestedTokens";
private final DiscoveryLocatorProperties discoveryLocatorProperties;
private final RedisRateLimiterConfiguration redisRateLimiterConfiguration;

/**
* Post construct.
Expand All @@ -34,14 +39,13 @@ public class DiscoveryRouteConfiguration {
@PostConstruct
void postConstruct() {
val filter = new FilterDefinition();
filter.setName("RequestRateLimiter");
// TODO: arguments should be passed from configuration dynamically
// setting replenishRate=1, requestedTokens=1 and burstCapacity=1
filter.setName(FILTER_NAME);
// Setting replenishRate=1, requestedTokens=1 and burstCapacity=1
// will result in a limit of 1 request per 1 second.
// setting replenishRate=1, requestedTokens=60 and burstCapacity=60 will result in a limit of 1 request/min.
filter.addArg("redis-rate-limiter.replenishRate", "1");
filter.addArg("redis-rate-limiter.burstCapacity", "1");
filter.addArg("redis-rate-limiter.requestedTokens", "1");
filter.addArg(REPLENISH_RATE_KEY, redisRateLimiterConfiguration.getReplenishRate());
filter.addArg(BURST_CAPACITY_KEY, redisRateLimiterConfiguration.getBurstCapacity());
filter.addArg(REQUESTED_TOKENS_KEY, redisRateLimiterConfiguration.getRequestedTokens());
discoveryLocatorProperties.getFilters().add(filter);
log.info("Added filter[{}] for discovery services, filters: {}", RedisRateLimiter.class.getSimpleName(),
discoveryLocatorProperties.getFilters());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.jmsoftware.maf.apigateway.universal.configuration;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;

/**
* <h1>RedisRateLimiterConfiguration</h1>
*
* @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 3/1/2021 9:59 AM
*/
@Data
@Validated
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = RedisRateLimiterConfiguration.PREFIX)
public class RedisRateLimiterConfiguration {
/**
* The constant PREFIX.
*/
public static final String PREFIX = "maf.configuration.redis-rate-limiter";
/**
* The Replenish rate.
*/
@NotBlank
private String replenishRate;
/**
* The Burst capacity.
*/
@NotBlank
private String burstCapacity;
/**
* The Requested tokens.
*/
@NotBlank
private String requestedTokens;
}
4 changes: 4 additions & 0 deletions docker/config/api-gateway/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,7 @@ maf:
- "consul"
- "api-gateway"
- "spring-boot-admin"
redis-rate-limiter:
replenish-rate: 1
burst-capacity: 1
requested-tokens: 1

0 comments on commit 0bd97b0

Please sign in to comment.