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