RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

[PLUS] Spring Cloud Eureka & Load Balancing

MSA(Microservice Architecture) 환경에서는 하나의 서비스를 여러 대의 서버에서 실행하는 경우가 많다. 이때 각 서비스의 IP와 Port를 직접 관리하면 서버가 추가되거나 변경될 때마다 모든 서비스의 설정을 수정해야 하는 문제가 발생한다.

이를 해결하기 위해 Spring Cloud Eureka를 사용한다.


Eureka란?

Eureka는 Service Discovery(서비스 디스커버리) 서버

각 서비스는 실행되면서 자신의 정보를 Eureka Server에 등록한다.

예를 들어 User Service가 3개의 인스턴스로 실행 중이라면 Eureka는 다음과 같은 정보를 관리한다.

USER-SERVICE

- 10.0.0.1:8080
- 10.0.0.2:8080
- 10.0.0.3:8080

다른 서비스는 User Service의 주소를 직접 알고 있을 필요 없이 Eureka에게 현재 실행 중인 인스턴스 목록을 요청하여 사용할 수 있다.


Eureka의 역할

처음에는 Eureka가 로드밸런싱까지 수행한다고 생각했지만, 실제 역할은 다르다.

Eureka의 역할은

  • 서비스 등록(Service Registration)
  • 서비스 검색(Service Discovery)
  • 실행 중인 서비스 목록 관리

이다.

즉, 어떤 서버들이 실행 중인지 알려주는 역할을 담당한다.


실제 요청 흐름

사용자
   │
   ▼
API Gateway
   │
   │ "USER-SERVICE 어디 있어?"
   ▼
Eureka Server
   │
   └── User Service 인스턴스 목록 반환
            │
            ▼
Spring Cloud LoadBalancer
            │
            ▼
선택된 User Service 인스턴스

Gateway는 Eureka에서 User Service의 인스턴스 목록을 조회한 뒤, Spring Cloud LoadBalancer를 통해 하나의 서버를 선택하여 요청을 전달한다.


Eureka와 LoadBalancer의 차이

EurekaSpring Cloud LoadBalancer

서비스 등록 요청 분산
서비스 검색 서버 선택
실행 중인 인스턴스 관리 라운드 로빈 등 로드밸런싱 수행

따라서 Eureka는 로드밸런서가 아니라 서비스 정보를 제공하는 역할을 수행하며, 실제 요청을 어느 서버로 보낼지는 LoadBalancer가 결정한다.


Gradle 의존성 추가

Eureka Client를 사용하기 위해서는 Gradle에 다음 의존성을 추가한다.

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

Eureka Server는 다음 의존성을 추가한다.

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'

 

처음에는 "사용자의 요청이 Eureka를 거쳐 서버로 전달되며, Eureka가 로드밸런싱까지 수행한다."고 이해하고 있었지만, 공부하면서 역할이 분리되어 있다는 것을 알게 되었다.

  • Eureka는 서비스의 위치를 관리하는 Service Discovery 서버이다.
  • Spring Cloud LoadBalancer는 Eureka에서 받은 서비스 목록을 기반으로 실제 요청을 분산한다.
  • API Gateway는 클라이언트의 요청을 받아 적절한 서비스로 전달하는 진입점 역할을 한다.