API Gateway에 대해서 먼저 알아보자
API Gateway란, API 생성, 유지 관리, 모니터링, 보호 등을 할 수 있게 해주는 서비스이다.
즉, 클라이언트는 서버로 API 요청을 하게되는데 이때 사이에서 대문(게이트웨이)과 같은 역할을 한다.
API가 어떤 역할이 있길래 API Gateway를 사용하는 것인가?
그렇다면 많은 API Gateway 오픈 소스들이 있는데 왜 SCG을 선택할까?
1. Spring과의 통합성
Spring Cloud Gateway(SCG)란, MSA 환경에서 사용되는 API Gateway중 하나로 Spring 환경의 API Gateway를 뜻한다.
서비스 레지스트리로, 마이크로서비스들이 서로를 찾고 통신할 수 있도록 도와줍니다. 서비스가 시작할 때 자신을 Eureka 서버에 등록하고, 클라이언
트는 이 정보를 통해 서비스를 찾을 수 있습니다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
server:
port: 8000
spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: {route의 고유 식별자} // first-service
uri: {해당 route의 주소} // http://localhost:8081/ (이동될 주소)
predicates: // 해당 라우터의 조건 (사용자가 입력한 주소) (/first-service/**로 들어오는 요청은 모두 first-service route로 보낸다.
- Path=/first-service/**
*/
- id: {route의 고유 식별자} // second-service
uri: {해당 route의 주소} // http://localhost:8082/
predicates: // 해당 라우터의 조건 (/second-service/**로 들어오는 요청은 모두 first-service route로 보낸다.
- Path=/second-service/**
package com.example.apigatewayservice.config;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/first-service/**")
.uri("http://localhost:8081"))
.route(r -> r.path("/second-service/**")
.uri("http://localhost:8082"))
.build();
}
}
현재 서비스를 배포해서 운영중에 있다고 생각해보자.
애플리케이션이 구동을 시작할때 application.properties는 한 번 읽혀지고 초기화된다.
즉, 새로운 마이크로서비스가 추가가되고 application.properties을 수정해도 현재 운영중인 서비스에는 적용되지 않는다는 것이다.
이러한 동적인 설정 부분에서는 Java Code 부분으로 작성된 Cofiguration 부분을 수정해주면 동적인 설정과정에서도 유연하게 라우팅을 적용시킬 수 있다.
① 서비스 등록 (Eureka Server)
② 요청 처리 (Spring Cloud Gateway)
③ 로드밸런싱 (LoadBalancer)
구성 요소 | 역할 |
---|---|
Eureka Server | 서비스 인스턴스 상태 관리 |
Spring Cloud Gateway | 클라이언트 요청 수신, 인스턴스 조회, 로드밸런싱 수행 |
LoadBalancer | 인스턴스 선택 및 분산 처리 (기본 Round Robin) |
방식 | 설명 |
---|---|
Round Robin | 순서대로 인스턴스에 요청 분배 (기본값) |
Random | 무작위로 인스턴스에 요청 분배 (설정 가능) |
커스텀 | 사용자 정의 로직으로 분배 (직접 구현 필요) |
Round Robin과 Random 방식외에도 Least Connections 와 Source IP Hash 방법 등과 같은 효과적인 방식이 존재한다.
Least Connections : 적은 연결을 보유하고 있는 서버에게 할당
Source IP Hash : 특정 IP에 해당하는 서버로 할당
하지만, Spring Cloud Gateway에서 기보적으로 제공하는 방식은 Round Robin과 Random 방식이기에 각각의 방식은 커스텀 구현해야한다.