Registering services with Spring Eureka

2026. 1. 4. 21:09Spring Microservice/Service Discovery

ImageImageImageImage

🧭 Spring Eureka에 서비스 등록하기 (Registering Services with Spring Eureka)

Spring Boot 마이크로서비스를 Eureka 서비스 레지스트리에 등록하는 전체 흐름 정리 🚀

 

✨ 개요: 지금 우리는 무엇을 하고 있는가?

이미 Spring 기반 Eureka Server를 성공적으로 구축하셨습니다 👍
이제 다음 단계는 각 마이크로서비스(organization, licensing)자기 자신을 Eureka에 등록(register) 하도록 설정하는 것입니다.

이 과정을 통해 우리는 다음을 명확히 이해하게 됩니다.

✅ Spring Boot 마이크로서비스를 Eureka에 등록하는 방법
✅ application ID / instance ID 개념
✅ 왜 IP 기반 등록을 선호하는지
✅ Spring Cloud Config와 Eureka 설정 분리 전략
✅ Eureka의 고가용성(HA) 개념
✅ Eureka REST API로 서비스 조회하는 방법
✅ “서비스가 바로 안 보이는 이유(30초 룰)”

 

📌 중요 포인트
이 섹션에서는 비즈니스 로직 구현이 아닌,
👉 “서비스 디스커버리에 등록되는 과정” 자체 에 집중합니다.

 

🧩 실습 대상 서비스 소개

이번 챕터에서는 두 개의 마이크로서비스를 사용합니다.

  • 🏢 organization-service
  • 📜 licensing-service

이 두 서비스는 모두 Eureka Client 로 동작합니다.

📦 전체 예제 코드는 아래 링크에서 다운로드할 수 있습니다.
👉 https://github.com/ihuaylupo/manning-smia/tree/master/chapter6/Initial

⚠️ 참고
이미 가지고 계신 다른 마이크로서비스를 사용해도 무방합니다.
단, service ID (spring.application.name) 는 반드시 일관성 있게 관리해야 합니다.

 

📦 1단계: Eureka Client 의존성 추가

먼저 organization-servicelicensing-servicepom.xml
Eureka Client 의존성을 추가합니다.

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

🔍 이 의존성의 역할은?

  • Spring Cloud가 Eureka Server와 통신할 수 있도록 필요한 JAR 포함
  • 서비스 등록, 헬스체크, 레지스트리 조회 기능 제공

 

🆔 2단계: spring.application.name 설정 (매우 중요!)

Eureka에 등록되는 모든 서비스는 두 가지 식별자를 가집니다.

🔑 Application ID

  • 서비스 논리적 그룹 이름
  • spring.application.name 값과 완전히 동일
  • 예:
    • organization-service
    • licensing-service

🔢 Instance ID

  • 단일 서비스 인스턴스를 구분하기 위한 값
  • Eureka가 자동으로 랜덤 생성

📄 application.yml 설정 예시

organization-service

spring:
  application:
    name: organization-service
  profiles:
    active: dev
  cloud:
    config:
      uri: http://localhost:8071

 

licensing-service

spring:
  application:
    name: licensing-service
  profiles:
    active: dev
  cloud:
    config:
      uri: http://localhost:8071

📌 왜 bootstrap.yml 인가?
Eureka & Config Server 설정은 애플리케이션 컨텍스트보다 먼저 로딩되어야 하기 때문입니다.

 

⚙️ 3단계: Eureka 등록 설정 (Config Server에서 관리)

이제 서비스가 Eureka에 등록되도록 설정해야 합니다.

💡 핵심 전략

👉 각 서비스의 Eureka 설정을 Config Server로 위임

📂 설정 파일 위치

Spring Config Server 프로젝트 기준:

  • src/main/resources/config/organization-service.properties
  • src/main/resources/config/licensing-service.properties

📄 properties 파일 설정

eureka.instance.preferIpAddress = true
eureka.client.registerWithEureka = true
eureka.client.fetchRegistry = true
eureka.client.serviceUrl.defaultZone = http://localhost:8070/eureka/

 

📄 application.yml 형태라면?

eureka:
  instance:
    preferIpAddress: true
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8070/eureka/

 

🌐 왜 preferIpAddress = true 인가? (🔥 핵심 질문)

디폴트로 Eureka는 호스트 이름(hostname) 으로 서비스를 등록합니다.

 

🖥️ 서버 환경에서는?

  • DNS 기반 hostname 존재
  • 문제 없음 ✅

🐳 Docker / 컨테이너 환경에서는?

  • 컨테이너 시작 시 랜덤 hostname
  • DNS 엔트리 ❌
  • 👉 서비스 해석 실패

📌 해결책:

eureka.instance.preferIpAddress: true

 

💬 저자의 의견 (그리고 실무 권장 사항):

“우리는 항상 true로 설정합니다.”

왜냐하면:

  • ☁️ 클라우드 마이크로서비스는 일시적(ephemeral)
  • 📦 상태 없음(stateless)
  • 🔁 언제든 재시작 가능
    IP 기반 식별이 더 적합

 

🔄 Eureka Client 주요 옵션 설명

✅ registerWithEureka

eureka.client.registerWithEureka: true
  • 해당 서비스가 Eureka에 자신을 등록
  • 기본값: true

📥 fetchRegistry

eureka.client.fetchRegistry: true
  • Eureka Registry를 로컬 캐시
  • 매 요청마다 Eureka 호출 ❌
  • ⏱️ 30초마다 변경사항 동기화

⚠️ 참고
위 두 설정은 기본값이 true지만,
학습 목적상 명시적으로 선언했습니다.

🌍 serviceUrl.defaultZone

eureka.client.serviceUrl.defaultZone:
  http://localhost:8070/eureka/
  • Eureka Server 주소 목록
  • 콤마(,)로 여러 개 지정 가능
  • 고가용성(HA)을 위한 설정의 출발점

 

🏗️ Eureka와 고가용성(HA)

⚠️ 주의할 점!

defaultZone에 URL 여러 개 적는 것만으로는 HA가 아님

진짜 HA를 위해 필요한 것

  • Eureka Server 간 Peer-to-Peer 레지스트리 복제
  • 각 Eureka 노드가 서로를 인지해야 함

📚 이 내용은 책 범위를 벗어나므로 아래 공식 문서 참고:
👉 https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-eureka-server

 

🔍 Eureka REST API로 서비스 조회하기

Eureka는 REST API를 통해 등록된 서비스 목록을 제공합니다.

📌 특정 서비스 조회

GET http://<eureka-host>:8070/eureka/apps/<APPID>

예:

GET http://localhost:8070/eureka/apps/organization-service

📄 응답 포맷

  • 디폴트값: XML
  • JSON으로 받고 싶다면?
Accept: application/json

👉 Eureka는 XML / JSON 둘 다 지원합니다.

 

⏳ 서비스 기동 시 주의사항 (🔥 진짜 많이 헷갈리는 부분)

❗ “왜 서비스가 바로 안 보여요?”

Eureka는 서비스 등록 후 즉시 활성화하지 않습니다.

📌 내부 동작:

  • 30초 동안
  • 3번 연속 헬스체크 성공
  • 그 이후에야 UP 상태 전환

 

🐳 Docker 환경에서 특히 주의!

  • Eureka + 서비스들이 동시에 기동
  • 초기에는:
    • ❌ 404 Not Found
    • ❌ Service not found
  • 하지만…
    • ⏱️ 30초 후 정상 동작

💬 결론:

“조급해하지 마세요 😄
Eureka는 느리지만 신중합니다.”

 

🏁 마무리 정리

🎯 이 글에서 다룬 핵심 요약

  • ✔️ Spring Boot 마이크로서비스를 Eureka에 등록하는 전체 흐름
  • ✔️ application ID / instance ID 개념
  • ✔️ preferIpAddress가 중요한 이유
  • ✔️ Spring Cloud Config와 Eureka 설정 분리 전략
  • ✔️ Eureka REST API 활용법
  • ✔️ 서비스 기동 시 30초 워밍업 이슈