본문 바로가기
Backend 🧦

Spring Cloud(Gateway)

by 서니서닝 2024. 8. 14.
728x90
Spring WebFlux 또는 Spring WebMVC 위에 API Gateway를 구축하기 위한 라이브러리를 제공 Spring Cloud Gateway는 API로 라우팅하고 security, monitoring/metrics, resiliency 등과 같은 공통 관심사 처리

 

📌 동작 순서

  1. Client → Spring Cloud Gateway 서버 요청
  2. Gateway Handler Mapping에서 요청이 매핑된다고 판단하면 Gateway Web Handler로 요청보냄
  3. Gateway Web Handler는 매핑되는 요청을 위한 필터 체인을 거쳐 요청을 실행

📌 특징

  • Spring Framework 및 Spring boot 기반으로 구축됨
  • 모든 요청 속성에 대한 경로를 일치시킬 수 있음
  • Predicate와 Filter는 경로에만 적용됨
  • 회로 차단기(Circuit Breaker) 통합
    • 서비스 장애 시 시스템의 안정성을 유지
    • 회로 차단기: 특정 서비스가 일정 시간 동안 실패하면, 해당 서비스로의 요청을 차단하여 전체 시스템이 장애로부터 보호되도록 함 일정 시간이 지나면 다시 시도하여 회로를 복구
    • +) Resilience4j와 같은 라이브러리를 사용하여 회로 차단기를 구현할 수 있음
  • Spring Cloud DiscoveryClient 통합
    • 서비스 디스커버리: Eureka, Consul, Zookeeper와 같은 서비스 레지스트리와 통합하여 서비스 인스턴스들을 동적으로 발견하고 라우팅할 수 있음
    • 자동 라우팅: DiscoveryClient를 통해 등록된 서비스들에 대해 자동으로 라우팅 설정을 할 수 있음
  • Predicate와 Filter 쉽게 작성 가능
  • Request Rate Limiting
  • Path 재작성

 

📌 코드 작성 예시

라우트는 URI 패턴, HTTP 메소드, 헤더, 파라미터 등 다양한 조건에 따라 정의될 수 있음 이를 통해 요청을 적절한 마이크로서비스로 전달

YAML 파일 작성 예시

장점:

  • 설정이 명확하게 구분되며, 쉽게 읽고 수정할 수 있음
  • 코드와 설정이 분리되어 있어 관리가 용이
  • 빠른 설정 변경이 가능

단점:

  • 복잡한 로직을 구현하기 어려울 수 있음
  • 동적 라우팅 등의 복잡한 요구사항을 처리하기 어려울 수 있음
spring:
  cloud:
    gateway:
      routes:
      - id: example_route
        uri: <http://example.org>
        predicates:
        - Path=/example/**
        filters:
        - StripPrefix=1
  • spring.cloud.gateway.routes
    • routes: 게이트웨이에서 정의하는 라우트 목록
    • 각 라우트는 클라이언트 요청을 적절한 마이크로서비스로 라우팅하는 규칙을 정의
  • id: example_route
    • id: 라우트의 고유 식별자 (각 라우트는 고유한 ID를 가져야 함)
      • 로깅, 디버깅 및 모니터링에서 사용될 수 있음
  • uri: <http://example.org>
    • uri: 요청이 매칭되었을 때 라우팅할 대상 URI
      • URI는 HTTP, HTTPS, 또는 로컬 네트워크의 다른 프로토콜을 사용할 수 있습니다.
  • predicates
    • predicates: 요청이 라우트와 매칭되는 조건
    • 여러 가지 조건을 조합하여 사용할 수 있으며, 각 조건은 요청의 특정 속성을 기반으로 매칭을 결정함
      • Path=/example/: 경로 기반 조건
        • 요청 경로가 /example/로 시작하면 이 라우트가 매칭됨
      • Method: HTTP 메소드 기반 매칭 (예: Method=GET)
      • Header: HTTP 헤더 기반 매칭 (예: Header=X-Request-Id)
      • Query: 쿼리 파라미터 기반 매칭 (예: Query=foo, bar)
  • filters
    • filters: 요청이 라우트와 매칭될 때 적용할 필터 목록
      • 필터는 요청이나 응답을 수정하거나 추가 기능을 제공할 수 있음
        • 다양한 필터가 있으며, 이 예제에서는 StripPrefix 필터를 사용하고 있음
      • StripPrefix=1: 요청 경로에서 지정된 접두사를 제거
        • 여기서 1은 /example/ 부분을 제거하여 /example/foo 요청이 실제로는 /foo로 전달되도록 함

자바 코드 작성 예시

장점:

  • 복잡한 라우팅 로직을 구현할 수 있음
  • 동적 라우팅이나 조건부 라우팅 등의 고급 기능을 사용할 수 있음
  • IDE의 자동 완성 및 검사를 통해 코드 작성이 편리

단점:

  • 설정이 코드에 포함되므로 변경 시 코드 배포가 필요
  • 설정을 직관적으로 파악하기 어려울 수 있음
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("path_route", r -> r.path("/get")
                        .filters(f -> f.addRequestHeader("Hello", "World"))
                        .uri("<http://httpbin.org>"))
                .build();
    }
}
  • @Configuration
    • @Configuration: 이 클래스가 스프링 컨테이너에 의해 관리되는 구성 클래스임을 나타냄, 주로 빈(bean) 정의를 포함
  • @Bean
    • @Bean: 이 메서드가 스프링 컨테이너에 의해 관리되는 빈을 생성함을 나타냄
      • 여기서는 RouteLocator 빈을 생성
  • RouteLocator customRouteLocator(RouteLocatorBuilder builder)
    • RouteLocator: 라우트를 정의하는 인터페이스
    • RouteLocatorBuilder를 사용하여 라우트를 구성하고, RouteLocator 객체를 반환
  • builder.routes()
    • routes(): 라우트 빌더를 초기화
    • 여러 라우트를 정의할 수 있도록 라우트 정의 빌더를 반환
  • route("path_route", r -> r.path("/get")...)
    • route: 개별 라우트를 정의
      • 첫 번째 매개변수는 라우트의 ID이고, 두 번째 매개변수는 라우트 빌더
    • r.path("/get"): 경로 기반 프레디케이트를 설정
      • 요청 경로가 /get일 때 이 라우트가 매칭됨
  • filters(f -> f.addRequestHeader("Hello", "World"))
    • filters: 필터를 정의
      • 여기서는 addRequestHeader 필터를 사용하여 요청 헤더에 "Hello": "World"를 추가
  • uri("<http://httpbin.org>")
    • uri: 요청이 매칭되었을 때 라우팅할 대상 URI를 설정

 

reference

Spring Cloud Gateway

 

Spring Cloud Gateway

This project provides a libraries for building an API Gateway on top of Spring WebFlux or Spring WebMVC. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitor

spring.io

[Spring] Spring Cloud Gateway(스프링 클라우드 게이트웨이) 공식 문서 간단히 살펴보기 및 리서치 후기

 

[Spring] Spring Cloud Gateway(스프링 클라우드 게이트웨이) 공식 문서 간단히 살펴보기 및 리서치 후기

아래의 내용은 Spring Cloud Gateway의 공식 문서를 보고 요약 정리한 내용입니다. 1. Spring Cloud Gateway 공식 문서 간단히 살펴보기 [ Spring Cloud Gateway란? ] Spring 생테계를 기반으로 하는 API Gateway를 제공해

mangkyu.tistory.com

 

728x90

댓글