마이크로서비스 아키텍처에서는 여러 개의 서비스가 독립적으로 배포되고 실행됩니다. 문제는 이렇게 서비스가 분리되면 “서버의 위치(IP, 포트)”를 각 서비스가 직접 관리하기 어렵다는 점입니다. 이때 서비스 디스커버리(Service Discovery)를 사용하면, 서비스가 실행될 때 자동으로 자신의 위치를 등록하고, 다른 서비스는 이름으로 이를 찾을 수 있습니다. .
서비스 디스커버리란?
서비스 디스커버리는 동적으로 변하는 서비스 인스턴스의 위치 정보를 자동으로 관리하는 기능입니다. 예를 들어 주문 서비스가 사용자 서비스의 IP를 직접 알고 있으면, 서버 증설·재배포 시마다 주소를 수정해야 합니다. 하지만 디스커버리 서버를 두면 서비스는 실행 시 자신을 등록하고, 다른 서비스는 이름 기반으로 호출할 수 있습니다.
Spring Cloud에서 가장 널리 사용되는 서비스 디스커버리 구현체가 바로 Netflix Eureka입니다.
Eureka의 기본 구조
Eureka는 Server와 Client 구조로 구성됩니다.
+-------------------+
| Eureka Server |
| (Service Registry)|
+-------------------+
▲
│
▼
+-------------------+ +-------------------+
| User-Service | | Order-Service |
| (Eureka Client) | | (Eureka Client) |
+-------------------+ +-------------------+
각 클라이언트 서비스는 자신을 Eureka 서버에 등록하고, 다른 서비스의 정보를 Eureka를 통해 조회합니다. 즉, Eureka가 모든 서비스의 “전화번호부” 역할을 하게 됩니다.
Eureka Server 구축
1. 의존성 추가 (Gradle)
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
2. 메인 클래스 설정
Eureka 서버를 활성화하려면 @EnableEurekaServer 애노테이션을 추가합니다.
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3. application.yml 설정
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: false
fetch-registry: false
server:
enable-self-preservation: true
Eureka 서버는 다른 서비스에 자신을 등록하지 않기 때문에 register-with-eureka와 fetch-registry를 false로 설정합니다.
4. Eureka 대시보드 확인
서버를 실행한 뒤 브라우저에서 아래 주소로 접속합니다.
http://localhost:8761
Eureka 대시보드에서 현재 등록된 서비스 목록을 확인할 수 있습니다.
Eureka Client 설정 (서비스 등록)
1. 의존성 추가
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
2. application.yml 설정
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
이 설정을 통해 서비스가 Eureka 서버(8761 포트)에 자신의 정보를 등록합니다. Eureka 대시보드에서 USER-SERVICE가 “UP” 상태로 표시되면 정상적으로 등록된 것입니다.
Eureka Client 간 통신
이제 다른 서비스에서 RestTemplate을 이용해 서비스명 기반으로 호출할 수 있습니다.
@RestController
@RequiredArgsConstructor
public class OrderController {
private final RestTemplate restTemplate;
@GetMapping("/orders")
public String getOrders() {
String result = restTemplate.getForObject("http://USER-SERVICE/users", String.class);
return "Order -> " + result;
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@LoadBalanced 애노테이션을 사용하면 Eureka의 서비스 디스커버리 기능을 활용하여, IP 대신 서비스명(USER-SERVICE)으로 호출할 수 있습니다.
Eureka의 핵심 기능
- 서비스 등록: 각 서비스가 실행 시 Eureka 서버에 자신의 IP와 포트를 등록
- 서비스 탐색: 다른 서비스의 위치를 서비스명으로 조회
- 헬스 체크: 일정 주기로 인스턴스의 상태를 검사하여 장애 감지
- 자동 제거: 응답 없는 인스턴스를 자동으로 레지스트리에서 제거
Self Preservation 모드
Eureka는 일시적인 네트워크 문제로 인한 대량의 인스턴스 해제를 방지하기 위해 Self Preservation 모드를 제공합니다. 이 기능이 활성화되면 일정 비율 이상의 Heartbeat(하트비트)가 수신되지 않아도 인스턴스를 즉시 제거하지 않습니다.
운영 환경에서는 기본값(활성화)을 유지하는 것이 안전하며, 테스트 환경에서는 false로 비활성화할 수도 있습니다.
eureka:
server:
enable-self-preservation: false
Eureka 클러스터 구성 (고가용성)
운영 환경에서는 Eureka 서버도 장애에 대비해 2대 이상으로 구성합니다. 서버 간의 peer 설정을 통해 상호 레지스트리를 동기화합니다.
# eureka-server-1.yml
eureka:
client:
service-url:
defaultZone: http://eureka-server-2:8762/eureka/
# eureka-server-2.yml
eureka:
client:
service-url:
defaultZone: http://eureka-server-1:8761/eureka/
이렇게 하면 하나의 서버가 다운되어도 다른 서버를 통해 서비스 디스커버리를 유지할 수 있습니다.
실무 적용 시 고려사항
- Config Server와 연동: Eureka 서버 설정을 중앙 관리 가능
- 보안 설정: Spring Security로 Eureka 대시보드 접근 제어
- 헬스체크: Actuator의
/actuator/health엔드포인트 사용 - 모니터링: Prometheus, Grafana를 이용해 인스턴스 상태 시각화
- Gateway 연동: API Gateway에서 Eureka를 통해 자동 라우팅 구성
주의할 점
- 서비스 수가 많을 경우 Eureka 서버의 메모리 사용량이 증가함
- Self Preservation 해제 시 네트워크 불안정 환경에서 인스턴스가 과도하게 제거될 수 있음
- 운영 환경에서는 반드시 SSL 및 인증 적용 필요
- 서비스명 중복 방지 —
spring.application.name은 고유해야 함
Eureka는 마이크로서비스 아키텍처에서 핵심적인 역할을 담당하는 서비스 디스커버리 서버입니다. 이를 통해 서비스 간 통신이 동적으로 이루어지며, 확장성 있고 유연한 시스템 구성이 가능합니다. 실무에서는 Spring Cloud Gateway 및 Config Server와 함께 Eureka를 연동하여 완전한 MSA 인프라를 구축합니다.
'개발 > JAVA' 카테고리의 다른 글
| Sleuth와 Zipkin으로 분산 트레이싱 - 마이크로서비스의 요청 흐름 가시화 (0) | 2025.11.08 |
|---|---|
| Hystrix/Resilience4j로 장애 대응하기 — 마이크로서비스의 회복탄력성 설계 (0) | 2025.11.07 |
| Spring Cloud Gateway로 API 게이트웨이 만들기 - 마이크로서비스 통합의 핵심 구성 (0) | 2025.11.05 |
| [JAVA] Spring Cloud Config 서버 구축하기 — 마이크로서비스 환경에서의 중앙 설정 관리 (0) | 2025.11.04 |
| [JAVA] Spring Cloud 소개 — 마이크로서비스 아키텍처의 핵심 구성 이해 (0) | 2025.11.03 |
