Microservices Architecture / / 2024. 12. 16. 10:38

Spring Cloud Gateway

Spring Cloud Gateway는 마이크로서비스 아키텍처(MSA) 환경에서 사용되는 API Gateway 솔루션입니다. 스프링 팀이 공식적으로 제공하며 Spring WebFlux 기반으로 만들어졌습니다.


Spring Cloud Gateway란?

  • API Gateway 역할을 수행하는 프레임워크입니다.
  • 클라이언트와 여러 마이크로서비스 사이의 단일 진입점 역할을 합니다.
  • 비동기 리액티브 프로그래밍(Non-blocking) 기반으로 구현되어 성능이 뛰어납니다.
  • 요청 라우팅, 필터링, 보안, 로드 밸런싱 등의 기능을 제공합니다.

Spring Cloud Gateway의 주요 기능

  1. 라우팅 (Routing)

    • 요청을 적절한 서비스로 전달합니다.
    • URL 패턴이나 조건에 따라 라우팅 규칙을 설정할 수 있습니다.
  2. 필터 (Filters)

    • 요청과 응답을 전/후 처리할 수 있습니다.
    • 예:
      • 인증/인가 검사
      • 로그 추가
      • 헤더 추가/변경
  3. 로드 밸런싱 (Load Balancing)

    • Spring Cloud LoadBalancer와 통합되어 여러 서비스 인스턴스에 요청을 분산할 수 있습니다.
  4. 보안 (Security)

    • JWT 인증, CORS 설정, SSL/TLS를 통해 보안 기능을 제공합니다.
  5. 속도 제한 (Rate Limiting)

    • 요청 수를 제한하여 과부하를 방지할 수 있습니다.
  6. Fallback 및 재시도 (Retry)

    • 실패 시 Fallback 처리를 하거나 요청을 재시도할 수 있습니다.
  7. 경로 변환 (Path Rewrite)

    • 요청 경로를 동적으로 변경하거나 재정의할 수 있습니다.

Spring Cloud Gateway 설정 방법

1. 의존성 추가

pom.xmlSpring Cloud Gateway 의존성을 추가합니다.

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

2. application.yml 설정

라우팅 규칙필터를 설정합니다.

spring:
  cloud:
    gateway:
      routes:
        - id: user-service          # 라우팅 규칙 ID
          uri: http://localhost:8081 # 대상 서비스 URI
          predicates:               # 조건
            - Path=/api/users/**    # 경로 조건
          filters:
            - AddRequestHeader=example-header, example-value   # 요청 헤더 추가
            - RewritePath=/api/(?<segment>.*), /$\{segment}    # 경로 재작성
        - id: order-service
          uri: http://localhost:8082
          predicates:
            - Path=/api/orders/**
          filters:
            - CircuitBreaker=name=orderServiceFallback

3. 라우팅 및 필터 처리 예시

Custom Filter (필터 커스터마이징 예시):

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

@Component
public class CustomHeaderFilter extends AbstractGatewayFilterFactory<CustomHeaderFilter.Config> {

    public CustomHeaderFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            exchange.getRequest()
                    .mutate()
                    .header("X-Custom-Header", "CustomHeaderValue");
            return chain.filter(exchange);
        };
    }

    public static class Config {
        // 설정 클래스 (필요시 설정값 추가)
    }
}

application.yml에 필터 적용:

filters:
  - name: CustomHeaderFilter

Spring Cloud Gateway 주요 장점

  1. 리액티브 기반

    • Spring WebFlux를 기반으로 비동기/Non-blocking 방식을 사용하여 높은 성능을 제공합니다.
  2. 유연한 라우팅

    • 다양한 조건(Predicate)과 필터를 통해 정교한 라우팅이 가능합니다.
  3. 확장성

    • 사용자 정의 필터를 통해 기능을 확장할 수 있습니다.
  4. Spring Cloud 통합

    • Eureka, Spring Cloud LoadBalancer, Config Server와 쉽게 연동됩니다.

Spring Cloud Gateway vs Netflix Zuul

기능 Spring Cloud Gateway Netflix Zuul
프로그래밍 모델 리액티브 기반 (WebFlux) Servlet 기반 (블로킹 I/O)
성능 비동기 처리로 성능이 더 뛰어남 상대적으로 성능이 낮음
확장성 커스텀 필터와 유연한 확장 제공 기본 필터 제공, 확장성이 낮음
로드 밸런싱 Spring Cloud LoadBalancer와 통합 Ribbon과 통합
지원 여부 최신 버전에서 지속적으로 지원 Zuul 1은 더 이상 유지보수 안됨

정리

Spring Cloud Gateway는 마이크로서비스 아키텍처에서 API Gateway 역할을 하며,

  • 라우팅, 필터링, 보안, 로드 밸런싱 등 다양한 기능을 제공하고
  • 리액티브 프로그래밍 기반으로 높은 성능과 확장성을 보장합니다.

Netflix Zuul의 한계를 개선하고 더 현대적인 기술 스택을 지원하므로,
최신 MSA 프로젝트에서는 Spring Cloud Gateway가 더 많이 사용됩니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유