서론
MSA에 대한 이해를 위해 Spring Cloud를 공부하던 중 Spring Cloud의 API Gateway와 로드 밸런서에 대한 개념을 접하게 되었다. 그런데 기존에 알고 있던 API Gateway, 로드밸런서와 뭔가 다르다는 걸 느꼈는데 이 차이를 명확하게 구분하지 못해 이 글로 정리하게 되었다.
클라우드 서비스의 API Gateway와 로드밸런서
기존에 알던 클라우드 서비스에서 API Gateway는 인프라 계층에서 운영되는 서비스로 클라이언트의 모든 API 요청의 단일 진입점 역할을 하며 여러 기능(리버스프록시, 인증/인가, SSL/TLS, 요청 검증, 응답 캐싱, 속도 제한, 모니터링 등)을 내부적으로 처리해준다.
로드밸런서 또한 인프라 계층에서 운영되는 서비스로 외부에서 유입된 트래픽을 특정 서버에 몰리지 않게 여러 서버 인스턴스로 분산시켜주는 역할을 하는 프록시/라우터이다.
그래서 처음 Spring Cloud의 Gateway와 Load Balancer라는 개념을 접하게 되었을 때 이미 클라우드 서비스에 Gateway와 로드밸런서가 있는데 왜 추가적으로 코드에서 두 요소를 설정하는지 의문이 들었다.
Spring Cloud의 Gateway와 로드밸런서
Spring Cloud에서 제공하는 Gateway와 로드밸런서는 위에서 설명한 기존 인프라 계층에 존재하는 Gateway 및 로드밸런서와 개념이 다르다. Spring Cloud의 Gateway와 로드밸런서는 Application 내부에 위치하며 코드로 구현되어 있다.
Spring Cloud는 마이크로 서비스간의 통신을 지원하기 위한 라이브러리들의 집합이기 때문에 이렇게 코드로 구현되어 있는 Spring Cloud는 내부 마이크로 서비스 간 통신에서 Gateway와 로드 밸런싱을 수행한다.
아래의 예시를 통해 이해해 보자.
예시를 통한 이해
마이크로 서비스로 구성된 애플리케이션에서 A, B라는 두 개의 마이크로 서비스가 있고 각 서비스가 여러 인스턴스를 가진다고 가정한다.
사용자가 A 서비스에 요청 → 로드밸런서가 API Gateway 인스턴스들 중 하나로 트래픽 분산 -> 클라우드 서비스의 API Gateway가 내부 로드밸런싱 로직을 통해 A 서비스의 여러 서비스 인스턴스 중 하나로 라우팅 처리 (로드밸런서와 API 게이트웨이의 처리 순서는 요구사항에 따라 바뀔 수 있다.)
이후 A 서비스에서 추가적으로 B 서비스의 작업이 필요하다면
A 서비스에 설정된 Spring Cloud Gateway가 요청의 URI로 라우트 id를 확인 → Eureka 서버에서 라우트 id로 B 서비스의 인스턴스 목록을 조회 → 조회한 여러 인스턴스 중 하나를 Gateway 내부 Load Balancer가 선택 → 이 선택된 인스턴스로 Gateway를 통해 요청을 전달.
결론
- 클라우드 인프라의 Gateway와 로드 밸런서는 Application 외부 요청을 관리하고 트래픽을 분산하는 역할로 서버 인스턴스 앞단에 위치
- Spring Cloud에서의 Gateway와 로드 밸런서는 마이크로 서비스 내부에서 다른 마이크로 서비스로 요청을 처리할 때 사용되며 코드로 구현되어 서비스 내부에 위치
헷갈렸던 부분
MSA에서 Gateway와 로드밸런서의 위치 순서
인프라 계층의 Gateway와 로드밸런서의 위치 순서는 요구사항에 따라 달라진다고 하는데 MSA에서는 보통 어떤식으로 설정하는지 궁금했다.
API Gateway는 어떤 마이크로 서비스로 요청을 전달해야하는지 구분해주고 로드밸런서는 인스턴스를 구분해준다. 일반적으로 MSA는 서비스별로 인스턴스가 나뉘어져 있기 때문에 보통 Gateway로 서비스를 먼저 구분한 뒤 해당 서비스를 가지는 인스턴스들을 로드밸런서가 트래픽을 분산시켜준다... 라고 생각했는데
실제 운영 환경에서는 Gateway 자체도 서비스로 여러 개 배포하여 사용하는게 일반적이기 때문에 앞에 로드밸런서가 부착된다고 한다. 그러면 API Gateway 뒷단의 로드밸런싱은 또 ELB를 추가로 달아서 하냐라는 의문이 생겼는데 이건 API Gateway 자체가 로드밸런서 역할을 수행하는 로직을 가져 로드밸런싱을 해준다고 한다.
마이크로 서비스 내부 호출에서 Spring Cloud Gateway와 로드밸런서의 위치
기존에 알던 API Gateway와 로드밸런서는 서버 인스턴스 앞단에 존재하여 API Gateway → Load Balancer → 서버 인스턴스 순으로 요청이 흘러갔는데 Spring Cloud를 사용하면 코드상에서 설정을 해주면 다른 마이크로 서비스에 보내는 요청이 Gateway와 로드밸런싱이 이루어진다고 했다.
여기서 나는
어떻게 요청을 받는 서버의 앞단에 Gateway와 로드밸런서를 달 수 있는 거지?
코드상 설정으로 로드밸런서를 생성해서 다른 인스턴스 앞단에 달아주는 건가?
정확히 어느 위치에 Gateway와 로드밸런서가 위치하는 거지? 와 같은 의문들이 생겼다.
→ Spring Cloud에서의 Gateway와 로드밸런서는 코드상에 작성했기 때문에 클라우드 서비스의 Gateway와 로드밸런서와 달리 서버 인스턴스 내부에 위치하면서 마이크로 서비스에 요청을 보내는 것이었다. (지금 보니 마이크로 서비스간의 통신 개념을 처음 접한 상태라 생긴 의문이었던것 같다.)