728x90
Spring WebFlux 또는 Spring WebMVC 위에 API Gateway를 구축하기 위한 라이브러리를 제공 Spring Cloud Gateway는 API로 라우팅하고 security, monitoring/metrics, resiliency 등과 같은 공통 관심사 처리
📌 동작 순서
- Client → Spring Cloud Gateway 서버 요청
- Gateway Handler Mapping에서 요청이 매핑된다고 판단하면 Gateway Web Handler로 요청보냄
- 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를 가져야 함)
- 로깅, 디버깅 및 모니터링에서 사용될 수 있음
- id: 라우트의 고유 식별자 (각 라우트는 고유한 ID를 가져야 함)
- uri: <http://example.org>
- uri: 요청이 매칭되었을 때 라우팅할 대상 URI
- URI는 HTTP, HTTPS, 또는 로컬 네트워크의 다른 프로토콜을 사용할 수 있습니다.
- uri: 요청이 매칭되었을 때 라우팅할 대상 URI
- predicates
- predicates: 요청이 라우트와 매칭되는 조건
- 여러 가지 조건을 조합하여 사용할 수 있으며, 각 조건은 요청의 특정 속성을 기반으로 매칭을 결정함
- Path=/example/: 경로 기반 조건
- 요청 경로가 /example/로 시작하면 이 라우트가 매칭됨
- Method: HTTP 메소드 기반 매칭 (예: Method=GET)
- Header: HTTP 헤더 기반 매칭 (예: Header=X-Request-Id)
- Query: 쿼리 파라미터 기반 매칭 (예: Query=foo, bar)
- Path=/example/: 경로 기반 조건
- filters
- filters: 요청이 라우트와 매칭될 때 적용할 필터 목록
- 필터는 요청이나 응답을 수정하거나 추가 기능을 제공할 수 있음
- 다양한 필터가 있으며, 이 예제에서는 StripPrefix 필터를 사용하고 있음
- StripPrefix=1: 요청 경로에서 지정된 접두사를 제거
- 여기서 1은 /example/ 부분을 제거하여 /example/foo 요청이 실제로는 /foo로 전달되도록 함
- 필터는 요청이나 응답을 수정하거나 추가 기능을 제공할 수 있음
- filters: 요청이 라우트와 매칭될 때 적용할 필터 목록
자바 코드 작성 예시
장점:
- 복잡한 라우팅 로직을 구현할 수 있음
- 동적 라우팅이나 조건부 라우팅 등의 고급 기능을 사용할 수 있음
- 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 빈을 생성
- @Bean: 이 메서드가 스프링 컨테이너에 의해 관리되는 빈을 생성함을 나타냄
- RouteLocator customRouteLocator(RouteLocatorBuilder builder)
- RouteLocator: 라우트를 정의하는 인터페이스
- RouteLocatorBuilder를 사용하여 라우트를 구성하고, RouteLocator 객체를 반환
- builder.routes()
- routes(): 라우트 빌더를 초기화
- 여러 라우트를 정의할 수 있도록 라우트 정의 빌더를 반환
- route("path_route", r -> r.path("/get")...)
- route: 개별 라우트를 정의
- 첫 번째 매개변수는 라우트의 ID이고, 두 번째 매개변수는 라우트 빌더
- r.path("/get"): 경로 기반 프레디케이트를 설정
- 요청 경로가 /get일 때 이 라우트가 매칭됨
- route: 개별 라우트를 정의
- filters(f -> f.addRequestHeader("Hello", "World"))
- filters: 필터를 정의
- 여기서는 addRequestHeader 필터를 사용하여 요청 헤더에 "Hello": "World"를 추가
- filters: 필터를 정의
- uri("<http://httpbin.org>")
- uri: 요청이 매칭되었을 때 라우팅할 대상 URI를 설정
- 여기서는 http://httpbin.org로 라우팅
- uri: 요청이 매칭되었을 때 라우팅할 대상 URI를 설정
reference
[Spring] Spring Cloud Gateway(스프링 클라우드 게이트웨이) 공식 문서 간단히 살펴보기 및 리서치 후기
728x90
'Backend 🧦' 카테고리의 다른 글
HTTP X- 헤더 (0) | 2024.08.19 |
---|---|
AWS S3에 파일 올리기 (Presigned URL) (0) | 2024.08.14 |
[AWS/Lambda] aws console에서 lambda 함수 다운받기 (0) | 2024.05.24 |
[Java] Boolean vs boolean (0) | 2024.05.11 |
[Spring] 스프링 스케줄러(Spring Scheduler) (0) | 2023.11.14 |
댓글