Service Discovery (서비스 디스커버리)란?
서비스 디스커버리는 분산 시스템에서 각 서비스가 동적으로 서로를 찾고 통신할 수 있도록 해주는 메커니즘입니다.
왜 필요한가?
마이크로서비스 아키텍처에서는 여러 개의 서비스가 독립적으로 실행되며, 각 서비스는 동적으로 실행되거나 종료될 수 있습니다. 이러한 환경에서 서비스들이 서로를 찾고 연결하기 위해 고정된 IP 주소를 사용하는 것은 어렵거나 불가능합니다.
이를 해결하기 위해 서비스 디스커버리가 필요합니다.
서비스 디스커버리 방식
- 클라이언트 사이드 디스커버리
- 서비스 소비자(클라이언트)가 **디스커버리 서버(서비스 레지스트리)**에 등록된 서비스 목록을 조회하여 적절한 서비스 인스턴스를 선택합니다.
- 예: Netflix Eureka, Consul, Zookeeper
- 서버 사이드 디스커버리
- 서비스 소비자는 고정된 로드 밸런서(서비스 디스커버리 서버)를 호출하고, 디스커버리 서버가 적절한 서비스 인스턴스로 라우팅합니다.
- 예: AWS ALB, Kubernetes Service
Eureka Server란?
Eureka Server는 Netflix에서 개발한 서비스 디스커버리 서버로, 마이크로서비스들이 자신을 등록하고(등록: Service Registration), 다른 서비스의 위치를 조회(탐색: Service Discovery)할 수 있도록 해주는 중앙 레지스트리 역할을 합니다.
Eureka의 주요 개념
- Eureka Server
- 서비스 레지스트리 역할을 하며, 모든 서비스 인스턴스가 여기 등록됨.
- 마이크로서비스들이 Eureka Server에 주기적으로 자신의 상태를 갱신(Heartbeat)하며, 응답이 없으면 자동으로 제거됨.
- Eureka Client
- 마이크로서비스는 Eureka Client로 동작하며, Eureka Server에 등록 및 주기적 갱신을 수행함.
- 다른 서비스 정보를 조회해 부하 분산과 서비스 탐색을 수행.
- Self-Preservation Mode (자가 보호 모드)
- Eureka Server가 일정 시간 동안 서비스 헬스 체크 요청을 받지 못해도 즉시 서비스에서 제거하지 않고 유지하는 기능.
- 네트워크 장애가 발생해도 서비스가 갑자기 사라지지 않도록 보호.
Eureka Server 설정하기
1. Spring Boot 프로젝트 생성
Spring Initializr(https://start.spring.io)를 통해 다음 설정으로 프로젝트를 생성합니다:
- Dependency: Spring Cloud Netflix Eureka Server, Spring Boot DevTools
2. 프로젝트 설정
build.gradle 또는 pom.xml 파일에 필요한 의존성을 추가합니다.
build.gradle 예시:
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
3. Eureka Server 활성화
Spring Boot 애플리케이션 클래스에 @EnableEurekaServer를 추가합니다.
EurekaServerApplication.java:
package com.example.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4. 설정 파일 작성
application.yml 또는 application.properties 파일을 작성합니다.
application.yml:
server:
port: 8761 # Eureka Server 기본 포트
eureka:
client:
register-with-eureka: false # 서버는 자신을 등록하지 않음
fetch-registry: false # 다른 레지스트리 정보를 가져오지 않음
server:
wait-time-in-ms-when-sync-empty: 0 # 서버 동기화 대기 시간
5. Eureka 대시보드 확인
Eureka Server가 실행되면, http://localhost:8761에서 Eureka 대시보드를 확인할 수 있습니다.
Eureka Client 설정하기
Eureka Server에 서비스를 등록하려면 클라이언트에서도 몇 가지 설정이 필요합니다.
1. 의존성 추가
Eureka Client 프로젝트에 spring-cloud-starter-netflix-eureka-client를 추가합니다.
build.gradle:
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
2. Eureka Client 설정
application.yml 파일에 Eureka Server URL과 클라이언트 정보를 설정합니다.
application.yml:
spring:
application:
name: my-service # 서비스 이름
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka Server 주소
3. 애플리케이션 실행
클라이언트를 실행하면, Eureka 대시보드에서 서비스가 등록된 것을 확인할 수 있습니다.
Eureka의 주요 기능
- Load Balancing
Eureka Client는 동적으로 서비스 목록을 가져오며, 이를 통해 클라이언트 측 로드 밸런싱이 가능합니다. - Failover
Eureka Server가 여러 인스턴스로 구성된 경우, 클라이언트는 다른 서버로 자동 전환합니다. - Self-Preservation
네트워크 오류가 발생해도 서버는 등록된 서비스 정보를 유지합니다.
장점과 단점
✅ 장점
- 클라이언트가 직접 서비스 디스커버리를 수행하여 로드 밸런싱을 유연하게 조정 가능.
- Netflix OSS와 Spring Cloud 환경에서 강력한 지원.
❌ 단점
- 클라이언트에서 직접 서비스 목록을 조회하므로 부하 분산 로직을 추가적으로 고려해야 함.
- Kubernetes, Consul, Zookeeper 등과 비교했을 때 멀티 리전(다중 데이터센터) 환경에서 약점이 있음.

✔ Service Discovery(서비스 디스커버리)는 동적 서비스 탐색 및 통신을 위한 핵심 기능이다.
✔ Eureka Server는 Spring Cloud 기반 마이크로서비스 환경에서 널리 사용되는 서비스 디스커버리 솔루션이다.
✔ 클라이언트가 직접 Eureka Server에서 서비스 목록을 가져와 부하 분산하며, Spring Cloud Netflix Eureka를 사용하면 손쉽게 설정 가능하다.
'Back_End > Spring' 카테고리의 다른 글
비밀번호 해싱(Hashing) (1) | 2025.03.27 |
---|---|
@Component와 @Configuration 비교 (1) | 2024.12.26 |
스프링 핵심 개념: IoC, DI, AOP 알아보기 (2) | 2024.12.05 |
Filter와 Interceptor 이해하기 (2) | 2024.11.29 |
서블릿(Servlet)과 디스패처 서블릿(Dispatcher Servlet)이란? (4) | 2024.11.29 |