[댕댕어디가] MSA 아키텍처 전환기(3) - API Gateway 구현

2025. 1. 7. 16:29·댕댕어디가 프로젝트/MSA

1. API Gateway란 ?

마이크로서비스 아키텍처에서 클라이언트와 백엔드 서비스 간의 중간 계층 역할을 하는 서버입니다. API Gateway는 클라이언트 요청을 받아 여러 마이크로서비스로 라우팅하고, 요청에 대한 인증, 로깅, 트래픽 관리 등의 작업을 수행합니다.

출처 : https://wildeveloperetrain.tistory.com/205

 

2. API Gateway 라이브러리

API Gateway 를 구현할 수 있는 라이브러리에는 Netflix Zuul과 Spring Cloud Gateway가 있습니다.

 

아래와 같이 두 라이브러리의 각 장단점이 있습니다. 

특징 Netflix Zuul Spring Cloud Gateway
프로세싱 모델 블로킹 방식 비동기 및 논블로킹 방식
성능 고부하 환경에서 병목 가능성 있음 고성능 및 확장성 제공
설치 및 설정 복잡할 수 있음 간단하고 직관적
지원 상태 유지보수 중단 (Zuul 1) 적극적인 유지보수 및 개발 중
Spring 통합 제한적 강력한 통합
사용 사례 기존 시스템 및 레거시 프로젝트 최신 프로젝트 및 리액티브 환경

 

 

큰 차이점으로, Spring Cloud 연동 여부, 블로킹 VS 논 블로킹 방식이 있겠지만, 가장 중요한 요인으로는 Netflix Zuul은 더 이상 유지보수가 되지 않는 라이브러리이기 때문에, Spring Cloud Gateway 라이브러리를 이용하여 API Gateway를 구성하였습니다.

 

3.  Spring Cloud Gateway 구성

Spring Cloud Gateway는 Route, Predicate, Filter 3가지로 구성되어 있습니다.

 

Route

  • Route는 클라이언트 요청이 어느 마이크로서비스로 전달될지를 정의하는 규칙입니다.
  • 기본적으로 URL 패턴과 일치하는 요청을 특정 서비스로 라우팅하는 역할을 합니다.
  • 서비스의 고유한 id, 요청할 URI, predicate, filter로 구성되어 있습니다.

 

Predicate

  • Predicate는 특정 조건에 따라 요청이 라우트에 매칭될지를 결정합니다.
  • Path, Host, Method,Header,Query 등이 구성되어 있습니다.
  • 만약 Predicate 조건에 맞지 않다면 404 에러를 반환합니다.

 

Filter

  • Filter는 요청이 라우트에 매칭된 후, 요청과 응답에 추가적인 변형을 가하거나 처리할 수 있는 구성 요소입니다.
  • 필터는 요청 전(pre)과 요청 후(post) 단계에서 실행될 수 있습니다.
  • 로깅, 보안, 리라이팅 등의 기능이 있습니다.

 

4.  Spring Cloud Gateway 원리

 

1) 클라이언트로 요청이 Gateway로 전달된다.

2) Gateway Handler Mapping에서Predicate로 요청을 매칭하고, Gateway Web Mapping으로 요청을 전달한다.

3) Gateway Web Mapping에서 요청에 대한 Pre Filter가 실행된다.

4) 프록시 서비스로 전달된다.

5) 프로시 서비스가 실행되고 요청에 대한 응답값을 전달한다.

6) Post request 요청에 대한 Post Filter가 실행된다.

7) 클라이언트에 전달한다.

 

5.  Spring Cloud Gateway 구현

Spring Cloud Gateway 애플리케이션을 새로 만들어, 각 요청에 대한 라우팅을 설정해줘야 합니다.

 

 [ 더보기 + 확인 ] Spring Cloud Gateway 구현 방법 🔽

더보기

# gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.0'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'daengdaeng-where'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

ext {
	set('springCloudVersion', "2024.0.0")
}

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
	implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

 

# application.yml

region-service와 project-service에 대한 라우팅 정보를 추가한다.

각 서비스의 predicate를 정의해서 맞는 요청을 라우팅할 수 있게 설정하고, 요청을 전달할 uri를 설정한다.

uri 작성 시, lb 프로토콜로 입력하게 되면 Eureka server에서 호스트에 해당하는 서비스를 찾고 로드밸런싱을 수행합니다.

server:
    port: 8082

spring:
    application:
        name: apigateway
    cloud:
        gateway:
            routes:
                - id: region-service
                  uri: lb://region-service
                  predicates:
                      - Path=/api/v2/region/**
                - id: project-service
                  uri: lb://project-service
                  predicates:
                      - Path=/api/**


eureka:
    instance:
        prefer-ip-address: true
    client:
        register-with-eureka: true
        fetch-registry: true
        serviceUrl:
            defaultZone: http://localhost:8761/eureka

management:
    endpoints:
        web:
            exposure:
                include: "*"

 

# application.java

@SpringBootApplication
@EnableDiscoveryClient
public class ApigatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(ApigatewayApplication.class, args);
	}

}

6.  Spring Cloud Gateway 연결 확인

API Gateway으로 Region-Service에 대한 요청을 한다면 제대로 응답값을 받을 수 있는지 확인해 보려합니다.

 

API Gateway는 8082 포트로 실행 중,  Region-Service는 8081 포트로 실행 중입니다.

 

포스트맨 요청 실행 결과, API Gateway에 요청했음에도 제대로 Region-Service에 대한 응답값을 받은 것을 확인할 수 있습니다.

 

'댕댕어디가 프로젝트 > MSA' 카테고리의 다른 글

[댕댕어디가] MSA 아키텍처 전환기(6) - 서비스간 동기 통신(Spring Cloud Open Feign)  (0) 2025.01.12
[댕댕어디가] MSA 아키텍처 전환기(5) - 서비스간 비동기 통신 (kafka 연결)  (0) 2025.01.11
[댕댕어디가] MSA 아키텍처 전환기(4) - 서비스간 비동기 통신하기  (0) 2025.01.08
[댕댕어디가] MSA 아키텍처 전환기(2) - Service Discovery 패턴/ 서비스 분리  (0) 2025.01.07
[댕댕어디가] MSA 아키텍처 전환기(1) - MSA 전환 이유  (0) 2024.12.29
'댕댕어디가 프로젝트/MSA' 카테고리의 다른 글
  • [댕댕어디가] MSA 아키텍처 전환기(5) - 서비스간 비동기 통신 (kafka 연결)
  • [댕댕어디가] MSA 아키텍처 전환기(4) - 서비스간 비동기 통신하기
  • [댕댕어디가] MSA 아키텍처 전환기(2) - Service Discovery 패턴/ 서비스 분리
  • [댕댕어디가] MSA 아키텍처 전환기(1) - MSA 전환 이유
gani+
gani+
꾸준히 기록할 수 있는 사람이 되자 !
  • gani+
    Gani_Dev :)
    gani+
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • 당장 프로젝트 (2)
        • 트러블슈팅 (0)
      • 댕댕어디가 프로젝트 (11)
        • 트러블슈팅 (3)
        • MSA (8)
      • 개발일지 (2)
      • BOOK (12)
        • SQL 레벨업 (10)
      • 프로젝트 (0)
      • ELK (5)
      • 알고리즘 (9)
      • CS (2)
        • 디자인패턴 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다이나믹프로그래밍
    이것이 코딩 테스트다
    해쉬
    순차탐색
    4673
    다익스트라
    14기
    이것이코딩테스트다
    SW마에스트로
    최단경로
    DP
    소마
    dfs
    SWMaestro14
    후기
    이진탐색
    알고리즘
    백준
    완전탐색
    4963
    정렬
    플로이드워셔
    백준4963
    섬의개수
    9095
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gani+
[댕댕어디가] MSA 아키텍처 전환기(3) - API Gateway 구현
상단으로

티스토리툴바