Skip to content

API 사용량을 제한하기 위한 API Rate Limiter 적용 #64

Description

@hoon7566

Microservices 💻

  • discovery-service
  • apigateway-service
  • notification-service
  • order-service
  • store-service
  • user-service

#적용하는 이유

API GATEWAY에서는 마이크로 서비스 그룹의 외부 경계에 위치하며 네트워크 외부의 트래픽을 수락하고 내부적으로 배포하는 역할을 수행합니다.

네트워크 외부의 트래픽을 수락할 때에, 특정 클라이언트의 과도한 요청으로 부터 서비스를 보호하기 위해서 Rate Limiter를 적용하기로 결정하였습니다.

#Rate Limiter

Just-Pickup!의 API Gateway는 Spring Cloud Gateway를 이용하여 구현되어 있습니다.

그래서 Rate Limiter를 적용하기 위해 Spring Cloud Gateway에서 제공하는 RedisRateLimter를 이용하였습니다.

#코드

  • application.yml
 ...
  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}"
 ...
  • Key Resolver
@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를 구현하였습니다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions