Microservices 💻
#적용하는 이유
API GATEWAY에서는 마이크로 서비스 그룹의 외부 경계에 위치하며 네트워크 외부의 트래픽을 수락하고 내부적으로 배포하는 역할을 수행합니다.
네트워크 외부의 트래픽을 수락할 때에, 특정 클라이언트의 과도한 요청으로 부터 서비스를 보호하기 위해서 Rate Limiter를 적용하기로 결정하였습니다.
#Rate Limiter
Just-Pickup!의 API Gateway는 Spring Cloud Gateway를 이용하여 구현되어 있습니다.
그래서 Rate Limiter를 적용하기 위해 Spring Cloud Gateway에서 제공하는 RedisRateLimter를 이용하였습니다.
#코드
...
routes:
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/order-service/**
filters:
- AuthorizationHeaderFilter
- RewritePath=/order-service/(?<segment>.*),/$\{segment}
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 3
redis-rate-limiter.burstCapacity: 3
key-resolver: "#{@tokenKeyResolver}"
...
@Bean
public KeyResolver tokenKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getHeaders().get(HttpHeaders.AUTHORIZATION).get(0));
}
Spring에서 기본적으로 제공하는 Key Resolver는 각 요청의 사용자를 구별하기 위해서 Spring Security에 의해서 설정되는 Principal을 Key로 사용합니다.
현재 Spring Security를 적용하고 있지 않으므로 새로 CustomKeyResolver를 구현하였습니다.
Microservices 💻
#적용하는 이유
API GATEWAY에서는 마이크로 서비스 그룹의 외부 경계에 위치하며 네트워크 외부의 트래픽을 수락하고 내부적으로 배포하는 역할을 수행합니다.
네트워크 외부의 트래픽을 수락할 때에, 특정 클라이언트의 과도한 요청으로 부터 서비스를 보호하기 위해서 Rate Limiter를 적용하기로 결정하였습니다.
#Rate Limiter
Just-Pickup!의 API Gateway는 Spring Cloud Gateway를 이용하여 구현되어 있습니다.
그래서 Rate Limiter를 적용하기 위해 Spring Cloud Gateway에서 제공하는 RedisRateLimter를 이용하였습니다.
#코드
Spring에서 기본적으로 제공하는 Key Resolver는 각 요청의 사용자를 구별하기 위해서 Spring Security에 의해서 설정되는 Principal을 Key로 사용합니다.
현재 Spring Security를 적용하고 있지 않으므로 새로 CustomKeyResolver를 구현하였습니다.