From 1c91f599fd8b293657b120d1f7ab022e08348288 Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Thu, 24 Mar 2022 15:41:12 +0900 Subject: [PATCH] =?UTF-8?q?fix(owner-apigateway-service,=20customer-apigat?= =?UTF-8?q?eway-service):=20redis=20request=20rate=20limiter=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - redis rate limiter 적용 --- customer-apigateway-service/build.gradle | 2 +- .../CustomerApigatewayServiceApplication.java | 7 +++++++ .../src/main/resources/application.yml | 11 ++++++++++- owner-apigateway-service/build.gradle | 3 ++- .../OwnerApigatewayServiceApplication.java | 8 ++++++++ .../src/main/resources/application.yml | 12 ++++++++++-- 6 files changed, 38 insertions(+), 5 deletions(-) diff --git a/customer-apigateway-service/build.gradle b/customer-apigateway-service/build.gradle index f1ac986..0370ccb 100644 --- a/customer-apigateway-service/build.gradle +++ b/customer-apigateway-service/build.gradle @@ -23,7 +23,7 @@ ext { } dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j' + implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt diff --git a/customer-apigateway-service/src/main/java/com/justpickup/customerapigatewayservice/CustomerApigatewayServiceApplication.java b/customer-apigateway-service/src/main/java/com/justpickup/customerapigatewayservice/CustomerApigatewayServiceApplication.java index a0a5eff..f1e2591 100644 --- a/customer-apigateway-service/src/main/java/com/justpickup/customerapigatewayservice/CustomerApigatewayServiceApplication.java +++ b/customer-apigateway-service/src/main/java/com/justpickup/customerapigatewayservice/CustomerApigatewayServiceApplication.java @@ -4,8 +4,11 @@ import com.justpickup.customerapigatewayservice.handler.GlobalExceptionHandler; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpHeaders; +import reactor.core.publisher.Mono; @SpringBootApplication @EnableEurekaClient @@ -20,4 +23,8 @@ public class CustomerApigatewayServiceApplication { return new GlobalExceptionHandler(); } + @Bean + public KeyResolver tokenKeyResolver() { + return exchange -> Mono.just(exchange.getRequest().getHeaders().get(HttpHeaders.AUTHORIZATION).get(0)); + } } diff --git a/customer-apigateway-service/src/main/resources/application.yml b/customer-apigateway-service/src/main/resources/application.yml index c5c4966..7a17fa4 100644 --- a/customer-apigateway-service/src/main/resources/application.yml +++ b/customer-apigateway-service/src/main/resources/application.yml @@ -61,7 +61,11 @@ spring: filters: - AuthorizationHeaderFilter - RewritePath=/order-service/(?.*),/$\{segment} - + - name: RequestRateLimiter + args: + redis-rate-limiter.replenishRate: 3 + redis-rate-limiter.burstCapacity: 3 + key-resolver: "#{@tokenKeyResolver}" - id: store-service uri: lb://STORE-SERVICE predicates: @@ -69,6 +73,11 @@ spring: filters: - AuthorizationHeaderFilter - RewritePath=/store-service/(?.*),/$\{segment} + - name: RequestRateLimiter + args: + redis-rate-limiter.replenishRate: 3 + redis-rate-limiter.burstCapacity: 3 + key-resolver: "#{@tokenKeyResolver}" - id: notification-service uri: lb://NOTIFICATION-SERVICE diff --git a/owner-apigateway-service/build.gradle b/owner-apigateway-service/build.gradle index 1ee08e5..a9d7647 100644 --- a/owner-apigateway-service/build.gradle +++ b/owner-apigateway-service/build.gradle @@ -23,7 +23,8 @@ ext { } dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j' + implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive' + implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt diff --git a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/OwnerApigatewayServiceApplication.java b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/OwnerApigatewayServiceApplication.java index 2bc155f..f9e656b 100644 --- a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/OwnerApigatewayServiceApplication.java +++ b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/OwnerApigatewayServiceApplication.java @@ -4,8 +4,11 @@ import com.justpickup.ownerapigatewayservice.handler.GlobalExceptionHandler; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpHeaders; +import reactor.core.publisher.Mono; @SpringBootApplication @EnableEurekaClient @@ -20,4 +23,9 @@ public class OwnerApigatewayServiceApplication { return new GlobalExceptionHandler(); } + @Bean + public KeyResolver tokenKeyResolver() { + return exchange -> Mono.just(exchange.getRequest().getHeaders().get(HttpHeaders.AUTHORIZATION).get(0)); + } + } diff --git a/owner-apigateway-service/src/main/resources/application.yml b/owner-apigateway-service/src/main/resources/application.yml index f15b064..82fb6de 100644 --- a/owner-apigateway-service/src/main/resources/application.yml +++ b/owner-apigateway-service/src/main/resources/application.yml @@ -55,7 +55,11 @@ spring: filters: - AuthorizationHeaderFilter - RewritePath=/order-service/(?.*),/$\{segment} - + - name: RequestRateLimiter + args: + redis-rate-limiter.replenishRate: 3 + redis-rate-limiter.burstCapacity: 3 + key-resolver: "#{@tokenKeyResolver}" - id: store-service uri: lb://STORE-SERVICE predicates: @@ -63,7 +67,11 @@ spring: filters: - AuthorizationHeaderFilter - RewritePath=/store-service/(?.*),/$\{segment} - + - name: RequestRateLimiter + args: + redis-rate-limiter.replenishRate: 3 + redis-rate-limiter.burstCapacity: 3 + key-resolver: "#{@tokenKeyResolver}" - id: notification-service uri: lb://NOTIFICATION-SERVICE predicates: