개발 무지렁이

[Arch.] 요청에 대한 단일 진입점 API Gateway 본문

Backend/Architecture

[Arch.] 요청에 대한 단일 진입점 API Gateway

Gaejirang-e 2023. 10. 10. 14:03

𐂂 API Gateway Service
요청에 대한 단일 진입점이자, 실제 백엔드 서비스와 접속하고,
API 호출에 대한 정책, 인증 및 Access 제어를 적용하여 중요한 데이터를 보호하는 트래픽 관리자를 말한다.

사용자가 설정한 라우팅 설정에 따라
각각 엔드포인트클라이언트 대신 요청하고,
응답을 받으면 다시 클라이언트응답을 전달하는 프록시 역할을 수행한다.

🎯 목표:
시스템 내부구조는 숨기고, 외부 요청에 대해 적절한 형태로 가공해서 응답할 수 있다.

🍩 API 관리 및 제어
: 다양한 마이크로서비스통합하고, 클라이언트에 필요한 API를 제공
(API 버전관리, 엔드포인트 관리 및 API문서화 기능 제공)

🍩 보안 및 인증 및 권한부여
: API 호출인증하고, 권한부여할 수 있으며, API 요청 or 응답보호하는 보안 기능 제공
(OAuth, JWT, API 키 및 사용자 인증과 같은 다양한 보안 메커니즘을 지원)

🍩 로드밸런싱(부하분산)
: 여러 마이크로서비스 사이에 트래픽을 균형적으로 분산하는 기능 제공

🍩 모니터링 분석(로깅, 추적, 상관관계)
: API호출모니터링하고 분석하는 기능 제공
(API 성능을 추적, 문제를 식별, 트래픽 패턴을 분석하여 최적화할 수 있다.)

🍩 응답 캐싱
: 반복적인 API호출최적화하기 위해 응답데이터캐싱할 수 있다.

🍩 라우팅
: API 엔드포인트를 해당하는 마이크로서비스정확한 라우팅할 수 있다.

🍩 변환 및 어댑터
: 요청응답데이터변환하거나, 다른 프로토콜변환하는데 사용될 수 있다.

🍩 서비스 디스커버리와 통합
: 동적으로 서비스 인스턴스를 검색하고 호출할 수 있다. 대표적으로 Netflix Eureka와 함께 사용하여 마이크로서비스의 동적확장을 지원한다.

🍩 필터링
: 요청응답에 대한 필터(filter)를 지원

𐁍 Netflix Zuul
MSA 사용되는 API Gateway Server이다.
(주로 Spring Cloud통합하여 사용된다.)
(클라이언트각각의 마이크로서비스직접 호출하지 않고, Zuul을 통해 통일된 엔드포인트를 사용할 수 있다.)

𖠃 Spring Cloud Gateway
Netflix가 제공하는 API Gateway와 🌱 Spring Application호환성 문제때문에
일반적으로 사용하는 API Gateway이다.
(🌱 Spring Application과 호환이 잘된다.)
(비동기 처리 지원)


🍟 Route
: API Gateway에서 가장 기본이 되는 요소로, id, uri, predicate, filter로 구성되어 있다.

🍟 Predicate
: API Gateway로 들어온 요청주어진 조건을 만족하는지 확인하는 구성요소를 말한다.
(하나 이상의 조건을 정의할 수 있으며, 조건에 맞지 않는 경우 HTTP 404 Not Found 에러를 반환)

🍟 Filter
: API Gateway로 들어오는 요청에 대해 Filter를 적용하여 전처리 및 후처리를 할 수 있는 구성요소를 말한다.

요청된 uri의 조건이 predicate와 일치하는지 확인 후, 일치하는 경우
해당 uri 경로요청을 매핑시켜준다.(Gateway Handler Mapping)
Gateway Web Handler가 요청과 관련된 FilterChain을 통해 요청을 전송한다.



⚙ API Gateway Setting

🔧 application.yml

  server:
      port: 8000

  spring:
      application:
          name: apigateway-service
      cloud:
          gateway:
              routes:
                  -id: first-service # 실제 마이크로서비스 엔드포인트 지정
                   uri: http://localhost:8081/
                   predicates:
                      - Path=/first-service/**
                  -id: second-service
                   uri: http://localhost:8082/
                   predicates:
                      - Path=/second-service/**
                   filters:
                      - AddRequestHeader=second-request, second-request-header
                      - AddResponseHeader=second-response, second-response-header

  eureka:
      client:
          register-with-eureka: true
          fetch-registry: true
          service-url:
              defaultZone: http://localhost:8761/eureka
Comments