ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • API 게이트 웨이에 대해 파헤치기
    프로그래밍 언어/Spring 2024. 8. 6. 23:00

    이 글은 API 게이트웨이에 대한 공부를 제가 이해할 수 있는 내용으로 정리한 글입니다. 부정확한 서술이나 기술에 대한 정보가 틀릴 가능성이 있습니다.

     

    API 게이트웨이 개요

    API 게이트웨이는 MSA를 구현하는데 필요한 Spring Cloud에서 지원하는 확장 기능 중 하나이다.

     

    API 게이트웨이가 하는 일을 간략적으로 보자면

    • 클라이언트의 요청을 받아 백엔드 서비스로 라우팅하고, 다양한 부가기능을 제공하는 중간 서버의 역할을 한다.
    • 클라이언트와 서비스간의 단일 진입점 역할을 한다.

    위의 역할을 수행하기 위해 API 게이트웨이는 아래와 같은 핵심 기능들을 가지고 있다.

    • 라우팅 정책 : 클라이언트 요청을 적절한 서비스로 전달 (예: 라우팅, 속도 제한, 요청/응답 조작 등등)
    • 보안 정책 : 인증, 권한 부여, 엑세스 제어 및 암호화
    • 로드밸런싱 : 여러 서비스 인스턴스간의 부하 분산
    • 모니터링 및 로깅 : 요청 및 응답을 로깅하고 모니터링

    Spring Cloud Gateway를 사용하여 구성요소들을 관리하려면 다음과 같은 절차가 필요하다.

    • Gateway로 사용할 새로운 프로젝트를 구성하고 아래와 같은 의존성을 포함시킨다.
    더보기

    build.gradle 의존성

    // build.gradle
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
    	  implementation 'org.springframework.boot:spring-boot-starter-actuator'
    	  implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    	  implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    }
    • application.yml 파일에서 라우팅을 설정해 준다. (아래의 코드는 예시이므로 자기가 만든 서비스에 맞춰 설정해야할 것이다.)
    • 더보기
      spring:
        cloud:
          gateway:
            discovery:
              locator:
                enabled: true  # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정
            routes:
              - id: users-service  # 라우트 식별자
                uri: lb://users-service # 'users-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
                predicates:
                  - Path=/users/** # /users/** 경로로 들어오는 요청을 이 라우트로 처리
              - id: orders-service  # 라우트 식별자
                uri: lb://orders-service  # 'orders-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
                predicates:
                  - Path=/orders/** #/orders/** 경로로 들어오는 요청을 이 라우트로 처리
      
      eureka:
        client:
          service-url:
            defaultZone: http://localhost:8761/eureka/


    스프링에서 제공하는 API Gateway 기술인 Spring Cloud Gateway는 다음과 같은 필터 종류를 제공한다.

    • Global Filter : 모든 요청에 대해 작동하는 필터
    • Gateway Filter : 특정 라우트에만 적용되는 필터

    위 필터 적용을 위해서는 GlobalFilter 또는 GatewayFilter 인터페이스를 구현하고, Filter메서드를 오버라이드 해야한다.

     

    필터를 입맛대로 설정하기 위해 꼭 알아둬야하는 객체가 3가지가 있다.

    1. Mono : 리액티브 프로그래밍에서 0 또는 1개의 데이터를 비동기적으로 처리한다. Mono<Void>는 아무 데이터도 반환하지 않는다.
    2. ServerWebExchange : Http 요청과 응답을 캡슐화한 객체이다. getRequest()로 Http요청을, getResponse()로 Http 응답을 가져온다.
    3. GatewayFilterChain : 여러 필터를 체인처럼 연결한다. chain.filter(exchange)로 다음 필터로 요청을 전달한다.

    필터의 동작 순서에 의해 2가지 종류(Pre 필터, Post 필터)로 나눠진다.

    • Pre 필터 : Pre 필터는 요청이 처리되기전에 실행된다. 추가적인 비동기 작업을 수행할 필요가 없으므로 then 메서드를 사용하지 않는다.
    • Post 필터 : Post 필터는 요청이 처리된후, 응답이 반환되기 전에 실행된다. 따라서, chain.filter(exchange)를 호출하여 다음 필터를 실행한 후, then 메서드를 사용하여 응답이 완료된후에 실행할 작업을 정의한다.

    2024.08.06일자 작성

Designed by Tistory.