목표
- API Gateway에 대해 이해한다.
- Spring Cloud Gateway에 대해 이해하고 실습한다.
API Gateway
- 클라이언트의 요청을 받아 백엔드 서비스로 라우팅하는 중간 서버이다.
- Microservices마다 각각의 다른 host로 요청을 보내는 대신, API Gateway 단일 지점으로 요청하며, end-point에 따라 호출하는 서비스를 다르게 설정한다.
주요 기능
1. 라우팅
- 클라이언트 요청을 적절한 서비스로 전달한다.
2. 인증 및 권한 부여
- 요청의 인증 및 권한을 검증한다.
3. 로드 밸런싱
- 여러 서비스 인스턴스 간의 부하를 분산한다.
4. 모니터링 및 로깅
- 요청 및 응답을 로깅하고 모니터링한다.
5. 요청 및 응답 변환
- 요청과 응답을 변환하거나 필터링한다.
Spring Cloud Gateway
- Eureka와 통합하여 사용할 수 있는 API Gateway 모듈이다.
실습
- 바로 이전에 실습할 때 사용했던 com.spring-cloud.eureka.server 프로젝트를 가지고 진행한다.
- 강의 내용에 따라 port 번호를 변경하고 OrderController와 ProductController 내부 로직을 수정한다.
- Server, order-service와 두 개의 product-service를 실행하고 브라우저에서 'http://localhost:19090'에 요청하면 [그림 1]과 같은 페이지가 출력된다.
[그림 1]

- com.spring-cloud.eureka.client.gateway라는 이름의 새로운 프로젝트를 생성한다. 다음의 의존성을 주입한다.
- 의존성 주입 목록
1. Reactive Gateway
2. Spring Boot Actuator
3. Eureka Discovery Client
4. Lombok
5. Spring Web
- [그림 2]와 같이 IntelliJ IDEA 상에서 server 애플리케이션의 Gradle에 gateway 프로젝트를 추가한다.
[그림 2]

- GlobalFilter와 Ordered 인터페이스의 구현 클래스인 CustomPreFilter 클래스와 CustomPostFilter 클래스를 정의한다.
- 강의 내용에 따라 각각의 클래스 내부의 메서드를 정의하고, 환경 설정 파일인 application.yml의 내용도 수정하였다.
- 필자는 편의상 Logger.getLogger(CustomPreFilter.class.getName()) 대신 @Slf4j의 log 필드를 이용하여 log.info()를 호출하도록 하였다.
gateway 애플리케이션을 추가적으로 실행한 후 'http://localhost:19090'에 요청하면 [그림 3]과 같은 페이지가 출력된다.
[그림 3]

- 이제부터 포트 번호가 19092, 19093이 아닌 gateway의 포트 번호인 19091로 요청을 보낼 것이다.
- [그림 4]와 [그림 5]에서 응답이 정상적으로 반환되었음을 확인할 수 있다.
[그림 4] - 'http://localhost:19091/product'

[그림 5] - 'http://localhost:19091/product'
