Skip to content

Commit

Permalink
feat($api-gateway): support request rate limit
Browse files Browse the repository at this point in the history
support request rate limit

BREAKING CHANGE: support request rate limit
  • Loading branch information
johnnymillergh committed Feb 7, 2021
1 parent d74797a commit c0dc896
Show file tree
Hide file tree
Showing 11 changed files with 137 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.jmsoftware.maf.apigateway.universal.configuration;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.cloud.gateway.discovery.DiscoveryLocatorProperties;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
* Description: DiscoveryRouteConfiguration, change description here.
*
* @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 2/7/2021 1:15 PM
**/
@Slf4j
@Configuration
@RequiredArgsConstructor
public class DiscoveryRouteConfiguration {
private final DiscoveryLocatorProperties discoveryLocatorProperties;

@PostConstruct
void postConstruct() {
val filter = new FilterDefinition();
filter.setName("RequestRateLimiter");
// TODO: arguments should be passed from configuration dynamically
filter.addArg("redis-rate-limiter.replenishRate", "1");
filter.addArg("redis-rate-limiter.burstCapacity", "1");
filter.addArg("redis-rate-limiter.requestedTokens", "1");
discoveryLocatorProperties.getFilters().add(filter);
log.info("Added filter[{}] for discovery services, filters: {}", RedisRateLimiter.class.getSimpleName(),
discoveryLocatorProperties.getFilters());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@ spring:
base-url: http://maf.zipkin.development-docker:9411
devtools:
add-properties: true
redis:
host: maf.redis.development-docker
port: 6379
password: 123456
12 changes: 2 additions & 10 deletions api-gateway/src/main/resources/application-development-local.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
spring:
zipkin:
base-url: http://localhost:9411
devtools:
add-properties: true
zipkin:
base-url: http://localhost:9411
redis:
database: 0
host: localhost
port: 6379
password: 123456
timeout: 10000ms
lettuce:
pool:
max-active: 20
max-idle: 10
max-wait: -1ms
min-idle: 0
8 changes: 6 additions & 2 deletions api-gateway/src/main/resources/application-production.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
spring:
zipkin:
base-url: http://maf.zipkin.production:9411
devtools:
add-properties: false
zipkin:
base-url: http://maf.zipkin.production:9411
redis:
host: maf.redis.production
port: 6379
password: 123456
8 changes: 6 additions & 2 deletions api-gateway/src/main/resources/application-stage.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
spring:
zipkin:
base-url: http://maf.zipkin.stage:9411
devtools:
add-properties: false
zipkin:
base-url: http://maf.zipkin.stage:9411
redis:
host: maf.redis.stage
port: 6379
password: 123456
8 changes: 6 additions & 2 deletions api-gateway/src/main/resources/application-test.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
spring:
zipkin:
base-url: http://maf.zipkin.test:9411
devtools:
add-properties: false
zipkin:
base-url: http://maf.zipkin.test:9411
redis:
host: maf.redis.test
port: 6379
password: 123456
10 changes: 10 additions & 0 deletions api-gateway/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ spring:
'[/**]':
allowedOrigins: "*"
allowedMethods: "*"
redis:
database: 0
timeout: 10000ms
client-type: LETTUCE
lettuce:
pool:
max-active: 20
max-idle: 10
max-wait: -1ms
min-idle: 0

management:
endpoints:
Expand Down
9 changes: 9 additions & 0 deletions reactive-spring-cloud-starter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
Expand Down Expand Up @@ -86,5 +90,10 @@
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafConfiguration;
import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafProjectProperty;
import com.jmsoftware.maf.reactivespringcloudstarter.configuration.RedisConfiguration;
import com.jmsoftware.maf.reactivespringcloudstarter.configuration.WebFluxConfiguration;
import com.jmsoftware.maf.reactivespringcloudstarter.controller.CommonController;
import com.jmsoftware.maf.reactivespringcloudstarter.filter.AccessLogFilter;
Expand All @@ -16,6 +17,7 @@
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.reactive.function.client.WebClient;

import javax.annotation.PostConstruct;
Expand All @@ -30,6 +32,9 @@
@RequiredArgsConstructor
@AutoConfigureOrder(Integer.MIN_VALUE)
@EnableConfigurationProperties(MafConfiguration.class)
@Import({
RedisConfiguration.class
})
public class MafReactiveAutoConfiguration {
@PostConstruct
public void postConstruct() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.jmsoftware.maf.reactivespringcloudstarter.configuration;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import javax.annotation.PostConstruct;

/**
* Description: RedisConfiguration, change description here.
*
* @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/30/2020 1:08 PM
**/
@Slf4j
@Configuration
@RequiredArgsConstructor
public class RedisConfiguration {
@PostConstruct
private void postConstruct() {
log.warn("Initial bean: '{}'", RedisConfiguration.class.getSimpleName());
}

/**
* Reactive redis template factory.
*
* @param connectionFactory the reactive redis connection factory
* @return the reactive redis template
* @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/30/2020 1:43 PM
*/
@Bean
ReactiveRedisTemplate<Object, Object> reactiveRedisTemplate(ReactiveRedisConnectionFactory connectionFactory) {
log.warn("Initial bean: '{}'", ReactiveRedisTemplate.class.getSimpleName());
Jackson2JsonRedisSerializer<Object> valueSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
RedisSerializationContext<Object, Object> serializationContext = RedisSerializationContext
.newSerializationContext(
RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
.value(valueSerializer)
.hashValue(valueSerializer)
.build();
return new ReactiveRedisTemplate<>(connectionFactory, serializationContext);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
@Configuration
@IntegrationComponentScan
@ConditionalOnWebApplication
//@AutoConfigureOrder(Integer.MIN_VALUE)
@EnableConfigurationProperties(MafConfiguration.class)
@Import({
MyBatisPlusConfiguration.class,
Expand Down

0 comments on commit c0dc896

Please sign in to comment.