클라우드 환경의 다수의 서비스(예: API서버)들의 로드밸런싱 및 장애 조치 목적을 가진 미들웨어 서버
- Eureka는 이러한 미들웨어 기능을 하기 위해 각 연결된 서비스의 IP / PORT /InstanceId를 가지고 있고 REST기반으로 작동
- Client-Sever 방식으로 Eureka Server에 등록된 서비스는 Eureka Client로 불림
로드 밸런싱 : 특정 서비스를 제공하는 서버가 여러대가 있을 때 트래픽을 한 서버에 몰리지 않게 분산 해주는 기술
미들웨어 : 데이터를 주고 받는 양쪽의 서비스(예: 클라이언트와 API서버)의 중간에 위치해 매개 역할을 하는 소프트웨어

▲ Eureka Server와 Eureka Client의 프로세스
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.5'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'org.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '21'
}
ext { // 프로젝트의 확장 속성을 설정
// springCloudVersion이라는 이름으로 "2023.0.0"이라는 값을 설정
// 전체 스크립트에서 springCloudVersion을 사용해서 참조가능
set('springCloudVersion', "2023.0.0")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
// 의존성 관리를 위한 설정
// mavenBom을 사용해서 스프링 클라우드 프로젝트의 모든 의존성을 한번에 관리할 수 있도록 설정
// ${springCloudVersion}을 사용해서 위에서 정의한 스프링 클라우드의 버전을 적용
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
// BOM(Bill of Materials): 여러 라이브러리의 호환되는 버전을 미리 정의해 놓은 것
}
}
repositories {
mavenCentral()
}
tasks.named('test') {
useJUnitPlatform()
}
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: false # 현재 서비스를 eureka server에 등록 여부
# 다른 서비스들의 정보를 eureka server로 부터 받아서 로컬메모리에 캐싱할지 여부
fetch-registry: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/ # Eureka Server URL지정 Eureka API 요청용 URL
server:
# 서버가 요청을 받기 전 대기할 초기 시간(ms)
# default 5분 : 실무에서는 보통 모든 서비스가 등록 되길 기다리기 위해 5분 후 정보를 공유
# 개인 프로젝트인 만큼 빠른 등록을 위해 5ms로 설정
wait-time-in-ms-when-sync-empty: 5
management:
endpoints:
web:
exposure:
include: "*" # Spring Actuator의 어떤 API를 사용할 지 지정하는 설정, * : 우선 모든 API사용
유레카 설정을 마치고 대시보드에 접속

경고메세지
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
➡️ 유레카 대시보드에서 흔히 볼 수 있는 문구
유레카 서버가 운영중에 서비스 인스턴스들의 상태에 대해 잘못된 정보를 보고할 수 있다는 경고
EX ) 실제로는 동작하지 않는 인스턴스를 정상 동작한다고 인식할 가능성이 있다
이경고표시의 주된 원인
유레카 서버가 충분한 수의 heartbeats를 받지 못한다면 발생할 수 있는 상황
eureka.instance.leaseRenewalIntervalInSeconds와 eureka.instance.leaseExpirationDurationInSeconds 설정을 조정하여 인스턴스의 heartbeats 간격과 만료 시간을 조절각 Service 마다 Eureka Clients 추가해주기
ext {
set('springCloudVersion', "2023.0.0")
}
dependencies {
// eureka-client 외의 서비스에 필요한 의존성들
...
// Eureka Clients 의존성
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
// 스프링 엑추에이터
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
server:
port: 8011
spring:
application:
name: user-service
eureka:
instance:
prefer-ip-address: true # 서비스의 호스트이름이 아닌 ip주소를 유레카서버에 등록 할지 여부
# 배포환경에서 DNS가 존재하면 할당받은 호스트이름을 Eureka서버에 등록하면 되지만 컨테이너 기반의 배포환경일 경우
# 컨테이너가 DNS 엔트리가 없는 임의의 호스트이름이 부여되기 때문에 false로 설정시 유레카서버가 해당 서비스의 호스트 이름위치를 정상적으로 얻지 못함
# 따라서, 컨테이너 기반 배포라면 해당 옵션을 true로 하여 Eureka Server가 서비스를 IP 주소로 등록해서 찾게하기
client:
register-with-eureka: true # Eureka server에 현재서비스를 등록할지 여부
fetch-registry: true # Eureka server에 등록되어있는 서비스들을 캐싱해둘지 여부
serviceUrl:
defaultZone: http://localhost:8761/eureka/
management:
endpoints:
web:
exposure:
include: "*"
prefer-ip-address: true
- 서비스의 호스트이름이 아닌 ip주소를 유레카서버에 등록 할지 여부
- 배포환경에서 DNS가 존재하면 할당받은 호스트이름을 Eureka서버에 등록하면 되지만
컨테이너 기반의 배포환경일 경우 컨테이너가 DNS 엔트리가 없는 임의의 호스트이름이 부여되기 때문에 false로 설정시 유레카서버가 해당 서비스의 호스트 이름위치를 정상적으로 얻지 못함- 따라서, 컨테이너 기반 배포라면 해당 옵션을 true로 하여 Eureka Server가 서비스를 IP 주소로 등록해서 찾게하기
@EnableDiscoveryClient // 어노테이션 넣기
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}