먼저 Spring Eureka란?
아래 공식문서를 살펴보자!
https://cloud.spring.io/spring-cloud-netflix/reference/html/
Spring Cloud Netflix
This project provides Netflix OSS integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. With a few simple annotations you can quickly enable and configure the common pat
cloud.spring.io
대략적으로 설명을 읽어보면 아래와 같다.
이 프로젝트는 Spring Environment 및 기타 Spring 프로그래밍 모델 관용구에 대한 자동 구성 및 바인딩을 통해 Spring Boot 앱을 위한 넷플릭스 OSS 통합을 제공합니다. 간단한 주석 몇 개를 사용하면 애플리케이션 내부의 공통 패턴을 빠르게 활성화하고 구성할 수 있으며, 전투 테스트를 거친 Netflix 구성 요소로 대규모 분산 시스템을 구축할 수 있습니다. 제공되는 패턴에는 Service Discovery(유레카), Circuit Breaker(Hystrix), Intelligent Routing(Zuul) 및 Client Side Load Balancing(리본)이 포함됩니다.
여기서 핵심은 분산 시스템 환경에서 빠르게 여러 애플리케이션을 중간에서 관리하는 미들웨어 서버이다. 즉, 각 MSA 환경에서 외부 요청에 따라서 알맞은 서비스로 보내주는 것이다.
2. Service Discovery란 무엇일까?
Service Discovery란 Client가 각 서비스를 호출할 때, 해당 서비스의 정보 (IP, Port)를 알아야한다. 이때 이러한 정보들을 관리하는 것이다. 여기서 크게 Client Side와 Server Side로 나뉜다.
Client Side

여기서 진한 노란색으로 보이는 부분이 Servie Registry인데, 클라이언트 즉, Service Instance들이 Registry에서 찾아서 호출하는 방식이다. 이 때 각 서비스들은 인스턴스 생성에 따라 삭제, 추가된다. 위 그림이 대표적으로 Netflix Eureka이다.
Server Side

여기서 한 가지 추가 된 점은 LB이다. 즉. 요청이 들어오면 LB에서 이를 Service Registry에 질의 한 뒤, 해당 서비스로 라우팅 한다. 대표적으로 ELB (AWS)가 있다.
그렇다면 Eureka는 이를 어떻게 구현하고 있을까?
Eureka Server는 Eureka Client에 해당하는 서비스 (마이크로서비스) 상태 정보가 등록되어있는 레지스트리를 갖는다.
Eureka Client의 서비스가 시작 될 때 Eureka Server에 자신의 정보를 등록한다. 즉, 이 시점에 Eureka Server는 Client 보다 먼저 가동되고 있고 이를 인식할 준비가 되어 있어야 한다.
등록된 후에는 30초마다 레지스트리에 ping을 전송하는데 이때 ping이 확인되지 않는다면 Eureka Server에서 해당 서비스를 레지스트리에서 제외시킨다. 또한, 모든 Eureka Client에 복제되어 있어 필요할 때마다 가용 상태인 모든 서비스들의 목록을 확인할 수 있고 이 목록은 30초마다 갱신된다.
그렇다면 Spring Boot의 직접적인 구현 방식을 알아보자.
- 이때, Eureka Client와 Eureka Server로 나뉜다. 여기서 Client는 각각의 마이크로 서비스가 될 것이고, Server는 이를 연결해 주는 미들웨어 서버가 될 것이다.
이를 Spring과 적용하려면 Eureka의 의존성이 필요하다. 이는 start.spring.io에서도 확인 가능하고 Maven Repository에서도 확인하여 추가할 수 있다.

dependencies {
// Server 주체가 되는 Eureka 의존성
implementation("org.springframework.cloud:spring-cloud-starter-netflix-eureka-server")
// Client 주체가 되는 Eureka 의존성
implementation("org.springframework.cloud:spring-cloud-starter-netflix-eureka-client")
}
// Spring Cloud
dependencyManagement {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
}
}
필자는 테스트를 용이하게 하기 위해 각각의 클라이언트를 생성하고 이를 받는 서버 모듈을 생성했다.

// Client A
@EnableDiscoveryClient
@SpringBootApplication
class ClientAApplication
fun main(args: Array<String>) {
runApplication<ClientAApplication>(*args)
}
// Client B
@EnableDiscoveryClient
@SpringBootApplication
class ClientBApplication
fun main(args: Array<String>) {
runApplication<ClientBApplication>(*args)
}
// Server
@SpringBootApplication
@EnableEurekaServer
class EurekaApplication
fun main(args: Array<String>) {
runApplication<EurekaApplication>(*args)
}
꼭 위와 같이 설정하지 않아도 된다. 각각의 포트는 9091, 9092, 8761 (server 기본 포트)를 사용하였고 Local 환경이다.

그렇다면 이제 실제로 클라이언트 서비스와 서버가 어떻게 동작하고 어떻게 데이터를 가져오는지 알아보자!
'서버 개발(생각과 구현)' 카테고리의 다른 글
외부 API 호출을 위한 OpenFeign, RestClient, WebClient들의 차이점 (0) | 2024.12.20 |
---|---|
Kotest를 활용한 유닛 테스트 구성 (0) | 2024.12.19 |
Kotlin-jdsl과 Querydls의 차이점과 선택 과정 (0) | 2024.12.19 |
코틀린을 활용한 JPA 엔티티 전략 고민 과정 (0) | 2024.12.19 |
Spring Eureka를 사용해서 MSA 체험기 (2) (0) | 2024.12.19 |