2026. 1. 4. 20:55ㆍSpring Microservice/Service Discovery




🚀 Spring Cloud Eureka Server 구축하기
Config Server 기반 서비스 디스커버리의 시작
마이크로서비스 아키텍처(MSA)에서 서비스 디스커버리(Service Discovery) 는 더 이상 선택이 아닌 필수 인프라입니다.
이번 챕터에서는 Spring Cloud + Eureka Server 를 활용하여 서비스 등록·탐색의 중심 노드를 구축하는 과정을 실무 관점에서 정리해보겠습니다.
🧭 왜 Eureka Server가 필요한가?
기존 모놀리식 환경에서는 다음과 같은 방식으로 서비스 위치를 찾았습니다.
- DNS + Load Balancer (F5, HAProxy 등)
- 고정 IP + 포트 기반 접근
❌ 하지만 클라우드 환경에서는 문제가 됩니다.
- 컨테이너는 수시로 생성/삭제
- IP는 동적
- 오토스케일링으로 인스턴스 수가 계속 변함
✅ 해결책이 바로 Eureka Server입니다.
Eureka는 서비스 인스턴스들의 메타데이터를 중앙에서 관리하고
클라이언트가 동적으로 서비스 위치를 조회하도록 해줍니다.
🏗️ 1. Eureka Server 프로젝트 생성 (Spring Initializr)
📍 https://start.spring.io 에서 다음과 같이 설정합니다.
📌 기본 설정
- Project: Maven
- Language: Java
- Spring Boot:
3.5.9 (Stable) - Group:
com.optimagrowth - Artifact:
eurekaserver - Name: Eureka Server
- Description: Eureka server
- Package name:
com.optimagrowth.eureka - Packaging: JAR
- Java: 17
📦 의존성 추가
- ✅ Eureka Server
- ✅ Config Client
- ✅ Spring Boot Actuator
📦 2. pom.xml 핵심 구성 분석 🔍
<properties>
<java.version>11</java.version>
<spring-cloud.version>2025.0.1</spring-cloud.version>
</properties>
🔥 핵심 포인트
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<!-- Ribbon 제거 -->
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-eureka</artifactId>
</exclusion>
</exclusions>
</dependency>
💡 왜 Ribbon을 제거할까?
- Ribbon은 Netflix OSS에서 유지 중단
- Spring Cloud에서는 Spring Cloud LoadBalancer 사용 권장
- 불필요한 자동 구성 충돌 방지 🧯
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
⚙️ 3. application.yml 설정 (Config Server 연동)
Eureka Server 역시 Config Server에서 설정을 가져오는 클라이언트입니다.
따라서 application.yml 이 반드시 필요합니다.
spring:
application:
name: eureka-server
cloud:
config:
uri: http://localhost:8071
loadbalancer:
ribbon:
enabled: false
✅ 핵심 포인트 정리
| 설정 | 의미 |
|---|---|
spring.application.name |
Config Server에서 참조할 설정 파일 이름 |
config.uri |
Config Server 주소 |
ribbon.enabled=false |
Ribbon 완전 비활성화 |
🗂️ 4. Eureka 전용 설정 파일 (Config Server 저장소)
Config Server 저장소에 Eureka 전용 구성 파일을 생성합니다.
📁 경로 예시
classpath:/config/eureka-server.yml
📄 eureka-server.yml
server:
port: 8070
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
waitTimeInMsWhenSyncEmpty: 5
🔍 설정 항목별 실무 해설
🟢 registerWithEureka: false
- Eureka 자기 자신을 등록하지 않음
- 단일 노드 서버에서는 필수 설정
🟢 fetchRegistry: false
- 다른 Eureka 노드의 레지스트리를 가져오지 않음
- Standalone 모드
🟢 defaultZone
- 클라이언트들이 접속할 Eureka 엔드포인트
🟢 waitTimeInMsWhenSyncEmpty
- 기본값: 5분
- 로컬 테스트 시 5ms로 단축
- 서비스 등록 확인 시간 단축 🚀
⚠️ 참고
Eureka는 10초 간격 heartbeat 3회를 받아야
서비스가 정상 등록됨 (최대 30초)
🧩 5. Eureka Server 활성화 (@EnableEurekaServer)
이제 Eureka를 서버 모드로 활성화합니다.
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
✨ 이 한 줄의 애노테이션이 의미하는 것
- 서비스 레지스트리 활성화
- REST 기반 등록/조회 API 자동 구성
- 대시보드 UI 제공 (
/)
▶️ 6. 실행 순서 & 주의사항 🚨
✅ 올바른 실행 순서
1️⃣ Spring Config Server 먼저 실행
2️⃣ Eureka Server 실행
3️⃣ Client 서비스 실행 (licensing, organization 등)
❌ Config Server 미실행 시 발생 오류
Connect Timeout Exception on Url - http://localhost:8071
Connection refused
📌 해결책
- Docker Compose로 의존 서비스 묶어서 실행
- Config → Eureka → Client 순서 유지
🎯 마무리 정리
✅ 이 단계까지 완료하면 다음이 보장됩니다.
- ✔ 중앙 집중식 서비스 등록소 구축
- ✔ 동적 서비스 디스커버리 가능
- ✔ Config Server 기반 설정 일원화
- ✔ Ribbon 제거 → 최신 LoadBalancer 사용
'Spring Microservice > Service Discovery' 카테고리의 다른 글
| Using service discovery to look up a service (0) | 2026.01.04 |
|---|---|
| Registering services with Spring Eureka (0) | 2026.01.04 |
| Service discovery in the cloud (0) | 2026.01.04 |
| Where’s my service? (1) | 2026.01.04 |
| Feign Client (1) | 2025.03.14 |