부트캠프/단기심화2기 TIL

[TIL] - Spring Cloud Gateway 적용하기

byungmin 2024. 11. 25. 20:41
Ch2 - MSA 학습 (Spring Cloud Gateway 적용 및 내부 구조 정리)

 

배운 것

각 도메인 별로 서비스 어플리케이션을 만들어서 Eureka Server에 등록하여 사용하는 방법을 배웠다. 하지만 클라이언트가 서비스별 API를 요청하려면 각 서비스의 URL을 직접 입력해서 들어가야 한다. 이는 클라이언트 측에서 여러 서비스의 엔드포인트를 관리해야 하는 번거로움을 초래하고, 서비스의 위치가 변경될 때마다 클라이언트 코드를 수정해야 하는 유지보수 문제를 야기한다.

API Gateway를 통해 클라이언트에게 단일 진입점을 제공함으로써 요청을 적절한 서비스로 라우팅하고, 공통 기능을 중앙에서 처리할 수 있게 된다. 또한, 보안, 로깅, 모니터링, 요청 필터링 등을 처리한다.

 

이해한 흐름은 다음과 같다.

1. 클라이언트가 특정 경로로 요청을 보내면 API Gateway가 이를 받아서 먼저 Eureka Server에 등록된 서비스를 찾는다.

2. Eureka Server에서 해당 이름의 서비스를 확인한다.

3. 해당 서비스로 라우팅해 준다.

 

서비스를 분리하는 과정에서 얻는 이점들이 정말 많은 것 같다. 하지만, 분리된 서비스를 연결하고 관리하는 데는 더 많은 기술들과 설정등이 필요한 것 같다. 

 

정리

API Gateway 주요 기능
  • 라우팅: 클라이언트 요청을 적절한 서비스로 전달
  • 인증 및 권한 부여: API 호출에 대한 인증 및 권한 부여를 중앙에서 처리한다.
  • 캐싱: 자주 요청되는 데이터를 캐시하여 백엔드 서비스의 부하를 줄이고 응답 시간을 개선한다.
  • 로드 밸런싱: 여러 서비스 인스턴스 간의 부하 분산
  • 모니터링 및 로깅: 요청 및 응답을 로깅하고 모니터링
  • 요청 및 응답 변환: 요청과 응답을 변환하거나 필터링

 

Spring Cloud Gateway

 

Spring Cloud Gateway는 API Gateway의 구현체 중 하나로, Spring 생태계에서 마이크로서비스 아키텍처를 위한 도구이다. 강의에서는 Reactive Gateway를 dependncy로 추가했는데, Netty 서버를 기반으로 하여 비동기 및 논블로킹 방식으로 동작하게 된다. API Gateway의 주요 기능과 마찬가지로 모든 클라이언트 요청의 단일 진입점으로 작동하게 된다. 요청을 적절한 마이크로서비스로 라우팅하고, 필터를 통해 요청과 응답을 수정할 수 있다.

 

Spring Cloud architecture highlights

 

Spring Cloud Gateway 구성 요소
  • Gateway Handler Mapping: 들어오는 요청을 적절한 라우트에 매핑
  • Gateway Web Handler: 요청을 처리하고 필터 체인을 통해 전달
  • Route: ID, 목적지 URI, 조건자(Predicate), 필터로 구성
  • Predicate: 요청이 특정 조건을 만족하는지 확인
  • Filter: 요청과 응답을 수정할 수 있는 필터

 

라우팅 설정 방법

  • JavaCode로 설정
@Configuration
public class FilterConfig {

    // application.yml에서 하는 동작을 자바 코드로 적용 가능
    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/first/**")
                        .filters(filter -> filter
                                .addRequestHeader("first-request", "first-request-header")
                                .addResponseHeader("first-response", "first-response-header"))
                        .uri("http://localhost:8081"))
                .route(r -> r.path("/second/**")
                        .filters(filter -> filter
                                .addRequestHeader("second-request", "second-request-header")
                                .addResponseHeader("second-response", "second-response-header"))
                        .uri("http://localhost:8082")
                )
                .build();
    }
}

 

  • application.yml에서 설정
spring:
  main:
    web-application-type: reactive
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes: # Spring Cloud Gateway의 라우팅 설정
        - id: first-service
          uri: lb://first-service  # 'first-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
          predicates:
            - Path=/first/**
        - id: second-service
          uri: lb://second-service
          predicates:
            - Path=/second/**
      discovery:
        locator:
          enabled: true # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정