Spring Cloud Gateway가 뭘까?

이수정·2024년 2월 1일
post-thumbnail

MSA 구조의 Aling 프로젝트의 인증을 구현하기 위해 API 게이트웨이에 대해 공부한 내용을 정리해 보았다.

❏ API 게이트웨이

마이크로서비스 기반의 애플리케이션의 모든 서버로의 요청을 단일 진입점을 거쳐 처리할 수 있는 기능을 제공한다. 클라이언트에서 들어오는 요청을 적절한 서버로 라우팅하고 다시 클라이언트로 반환하는 리버스 프록시 서버의 역할을 하며, 오픈소스 게이트웨이로 Kong Gateway, Zuul API Gateway, Spring Cloud Gateway 등이 있다.

  • 대표적인 기능
    • 인증/인가 및 토큰 : 각 서비스에 인증/인가를 구현하지 않고, 게이트웨이와 인증서버를 통해 효율적인 처리
    • 로직 처리 : 로깅, 메디에이션, 속도 제한 등 로직 처리
    • 부하 분산 (로드밸런싱) : 트래픽 분산 및 장애 발생 감지

❍ 리버스 프록시? (간단ver)

프록시 서버는 크게 포워드 프록시 서버와 리버스 프록시 서버로 나뉜다.

  • 포워드 프록시 서버는 클라이언트의 요청을 가로채 특정 웹사이트로의 직접적인 연결을 막는다. 또한 클라이언트의 요청을 직접 연결하지 않기 때문에 클라이언트의 IP를 가릴 수 있다.
  • 리버스 프록시 서버는 로드 밸런싱에 사용된다. 클라이언트들의 요청을 프록시 서버가 받아 대량의 트래픽을 분배해 API 서버의 부담을 줄인다.

❏ Spring Cloud Gateway

Spring Framework 및 Spring Boot 기반으로, Spring WebFlux 혹은 Spring WebMVC 위 구축된 API 게이트웨이를 제공한다.

  • API로 라우팅하는 간단 & 효과적인 방법 제공
  • 보안, 모니터링/메트릭 및 복원성과 같은 공통 관심사 처리

❍ 작동방식

https://cloud.spring.io/spring-cloud-gateway/reference/html/

  1. 클라이언트가 Spring Cloud Gateway에게 요청
  2. Gateway Handler Mapping에서 해당 요청과 경로가 일치한다고 판단하는 Handler로 요청 전달
  3. Gateway Web Handler는 요청과 관련된 Filter chain을 통해 요청 실행
    1. Filter는 요청 ‘전’과 ‘후’에 적용
    2. 포트 없는 요청은 각각 http, https에 따라 80, 443으로 처리

( + ) 기본 용어

  • Route : 게이트웨이 기본 빌딩 블록으로, ID, 대상 URI, Predicate 컬렉션 및 Filter 컬렉션으로 정의
  • Predicate
  • Filter : Spring의 Filter, 특정 팩토리로 구성된 Spring Framework GatewayFilter의 인스턴스, 요청과 응답의 전과 후 수정 가능

❍ Route Predicate Factories

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

  • ex) path
    .route(r -> r.path("/get")
    .uri("https://aling.kr")

❍ WebFilter Factories

  • AddRequestHeader, AddResponseHeader, CacheRequestBody, ModifyResponseBody, RedirectTo, SetStatus 등 다양한 Filter Factory ( + ) AbstractGatewayFilterFactory를 상속받아 커스텀 필터 생성 가능
  • ex) SetStatus
    .route(${Route Predicate})
    .filters(f -> f.setStatus(404).uri("https://aling.kr"))

❍ 사용법

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
    
<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
  </dependency>
</dependencies>
@Configuration
public class GatewayConfig {
	@Bean
  	public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
		return builder.routes()
				...
				.build();
	}
}
profile
쌓다 보면 탑이 될 거야 🗼

0개의 댓글