Spring Cloud를 사용하여 마이크로서비스 네트워크 내에서 엣지 서버를 구현하는 방법을 살펴보겠습니다.
Spring Cloud에는 Spring Cloud Gateway
라는 프로젝트가 있으며, 이를 통해 프로덕션 수준의 엣지 서비스를 매우 쉽게 구축할 수 있습니다. Spring Cloud Gateway는 Spring의 리액티브(reactive) 프레임워크를 기반으로 구축되었기 때문에, 적은 메모리와 적은 스레드로도 많은 트래픽을 효율적으로 처리할 수 있습니다.
Spring Cloud Gateway는 클라이언트 애플리케이션과 실제 마이크로서비스 간의 중개 역할을 수행하며, 모든 외부 트래픽은 이 게이트웨이를 통해 들어옵니다. 게이트웨이는 클라이언트 애플리케이션이 직접 마이크로서비스에 접근할 수 없도록 하여, 보안 및 라우팅과 같은 정책을 강제할 수 있습니다.
동적 라우팅: 요청의 컨텍스트에 따라 동적으로 라우팅할 수 있습니다. 예를 들어, API 버전 정보가 헤더에 포함된 경우 해당 버전에 맞는 백엔드 마이크로서비스로 요청을 라우팅할 수 있습니다.
스티키 세션 처리: 특정 사용자의 요청이 항상 동일한 인스턴스로 전달되도록 하는 스티키 세션을 지원합니다.
다양한 교차 기능적 요구 사항 처리: 보안, 로깅, 감사, 메트릭 수집 등 다양한 비즈니스 요구 사항을 중앙에서 처리할 수 있습니다.
Spring Cloud Gateway는 Spring Reactor를 기반으로 구축되어 비차단(non-blocking) 방식으로 동작하며, 서킷 브레이커(Circuit Breaker) 및 서비스 디스커버리와의 통합을 제공합니다. 이러한 이유로 Spring Cloud Gateway는 Jewel과 같은 다른 게이트웨이 솔루션보다 성능이 우수합니다.
Spring Cloud Gateway는 클라이언트 애플리케이션과 마이크로서비스 간에 위치하여 모든 요청을 중앙에서 관리하며, 정책 적용 지점(Policy Enforcement Point) 역할을 합니다. 이를 통해 라우팅, 보안, 로깅, 감사 등의 정책을 효과적으로 구현할 수 있습니다.
Spring Cloud Gateway는 다양한 기능을 제공하며, 내부적으로 프레디케이트(Predicate)
와 필터(Filter)
를 사용하여 요청을 처리합니다. 이러한 개념들은 Spring Cloud Gateway의 핵심 요소로, 복잡한 비즈니스 요구 사항을 처리하는 데 사용됩니다.
Spring Cloud Gateway에 대해 더 알아보려면 Spring 공식 웹사이트(spring.io)를 방문하여 Spring Cloud Gateway 프로젝트에 대한 문서를 확인할 수 있습니다. 여기에는 Spring Cloud Gateway의 기능, 구성 요소, 및 다양한 활용 사례가 설명되어 있습니다.
먼저, 외부 클라이언트(모바일 애플리케이션, 웹사이트, 기타 REST 기반 API)로부터 요청을 받게 됩니다. 이 요청은 마이크로서비스 네트워크의 엣지 서버 역할을 하는 게이트웨이 서버로 전달됩니다. 이때 Gateway Handler Mapping이라는 중요한 컴포넌트가 요청 경로를 식별하고, 해당 요청을 어느 마이크로서비스로 라우팅할지 결정하는 역할을 합니다.
하지만, Gateway Handler Mapping은 자동으로 결정하지 않고, 개발자가 사전에 설정한 라우팅 관련 구성에 따라 경로를 결정합니다. 이 과정은 Spring Cloud Gateway의 첫 번째 단계로, 요청이 어떤 마이크로서비스로 전달되어야 하는지 식별하는 역할을 합니다.
요청이 라우팅될 마이크로서비스를 식별한 후, 게이트웨이는 개발자가 설정한 프레디케이트(Predicate)와 프리 필터(Pre Filter)를 검사합니다. 이 두 가지는 실제 마이크로서비스로 요청을 전달하기 전에 실행됩니다.
프레디케이트(Predicate): 프레디케이트는 참 또는 거짓을 반환하는 논리적 조건입니다. 개발자는 특정 조건이 충족될 때만 요청을 마이크로서비스로 전달하도록 설정할 수 있습니다. 만약 조건이 충족되지 않으면, 요청을 거부하고 적절한 오류 메시지를 반환합니다.
프리 필터(Pre Filter): 프리 필터는 요청을 처리하기 전에 다양한 작업을 수행할 수 있습니다. 예를 들어, 요청 유효성 검사, 감사 및 로깅, 요청 수정, 보안 검사 등을 수행할 수 있습니다. 이러한 비기능적 요구 사항이나 크로스컷팅 요구 사항은 프리 필터를 통해 구현할 수 있습니다.
프레디케이트와 프리 필터가 모두 통과되면, 요청은 실제 마이크로서비스로 전달됩니다. 마이크로서비스는 요청을 처리한 후 응답을 반환합니다. 이때 포스트 필터(Post Filter)가 응답을 인터셉트하여, 응답을 수정하거나 추가 검증을 수행할 수 있습니다.
포스트 필터는 응답이 클라이언트 애플리케이션으로 반환되기 전에 실행되며, 모든 포스트 필터가 실행된 후, 응답은 Gateway Handler Mapping을 통해 최종적으로 클라이언트 애플리케이션에 전달됩니다.
Spring Cloud Gateway의 또 다른 장점은, 다양한 시나리오에서 사용할 수 있는 사전 정의된 필터를 제공한다는 점입니다. Spring Cloud Gateway 공식 문서를 참고하여, 개발자는 이러한 필터를 쉽게 구성하고 사용할 수 있습니다.
예를 들어, Spring Cloud Gateway는 요청 헤더를 추가하는 필터, 요청 파라미터를 추가하는 필터, 응답 헤더를 추가하는 필터, 서킷 브레이커 필터, 요청 본문 수정 필터 등 다양한 필터를 제공합니다.
이 공식 문서에서는 Spring Cloud Gateway에 대한 전반적인 정보와 함께, 다양한 필터, 프레디케이트, 라우팅 구성 방법 등을 다루고 있으므로, 필요할 때 참조하여 사용하면 유용합니다.
자 이제, Spring Cloud Gateway를 사용하여 엣지 서버 또는 API 게이트웨이를 만드는 방법을 알아보겠습니다.
start.spring.io
에서 Maven 프로젝트를 선택하고, Java 17을 사용하여 새로운 Spring Boot 프로젝트를 생성합니다.Group
은 com.easybytes
, Artifact
와 Name
은 GatewayServer
로 설정합니다.Dependencies
로는 Spring Cloud Gateway
, Eureka Discovery Client
, Config Client
, Actuator
, DevTools
를 추가합니다.Section9
)에 복사하고 압축을 해제합니다.Section9
폴더를 열어 프로젝트를 로드합니다.pom.xml
파일에 Google Jib 플러그인을 추가합니다. 이는 Docker 이미지를 생성할 때 사용됩니다.pom.xml
파일에서도 태그 이름을 S9
으로 변경합니다.application.yml
파일 생성 및 수정:
application.properties
파일을 application.yml
파일로 변경하고, 기본적인 설정을 추가합니다.actuator
와 관련된 설정을 유지하고, Eureka와 관련된 설정은 Config Server에서 관리하기 위해 삭제합니다.Gateway 서버 설정 추가:
application.yml
파일에 다음 설정을 추가합니다:spring:
cloud:
gateway:
discovery:
locator:
enabled: true
Config Server 설정 업데이트:
gateway-server.yml
파일을 생성하고, Gateway 서버에 필요한 설정(포트, Eureka 관련 설정 등)을 추가합니다.이제 우리가 구축한 Gateway 서버를 실제로 실행하고 테스트하는 방법을 살펴보겠습니다.
8072
에서 실행됩니다.http://localhost:8072/actuator
를 열어 Actuator의 기본 정보를 확인합니다./actuator/gateway/routes
엔드포인트를 확인할 수 있습니다.http://localhost:8072/actuator/gateway/routes
를 열어 Gateway의 라우팅 정보를 확인합니다./loans
경로로 요청이 오면 Loans 마이크로서비스로 요청을 전달합니다.http://localhost:8072/ACCOUNTS/api/create
경로로 POST 요청을 보내 계정을 생성합니다.