목차
1. Eureka란?
1-1. 주요 개념
1-2. 동작 방식
1-3. 구성 요소
2. Eureka Server 등록 방법
3. Eureka Client 등록 방법
1. Eureka란?
- Eureka는 Netflix에서 개발한 서비스 디스커버리(서비스 레지스트리) 도구.
- 마이크로서비스 아키텍처(MSA)에서 동적으로 서비스들을 탐지하고 연결하기 위해 사용. 즉, 마이크로서비스 간의 통신을 관리
- 로드 밸런싱 및 Fault Tolerance의 역할.
1-1. 주요 개념 및 역할
- 서비스 디스커버리 (Service Discovery)
- 마이크로서비스 환경에서는 여러 서비스가 네트워크를 통해 서로 통신합니다. 각 서비스는 IP 주소와 포트로 식별되는데, 이 정보가 동적으로 변할 수 있습니다.
- Eureka는 서비스가 자신을 등록(Register)하고, 다른 서비스가 이를 검색(Discovery)할 수 있도록 관리합니다.
- Eureka Server
- Eureka의 중심 역할을 하는 레지스트리 서버입니다.
- 서비스들은 이 서버에 자신을 등록하며, 서버는 등록된 서비스의 위치 정보를 저장합니다.
- 각 서비스는 일정 주기로 Heartbeat 신호를 보내 Eureka Server에 자신의 상태를 갱신합니다.
- Eureka Client
- 애플리케이션에서 Eureka Server와 통신하는 역할을 합니다.
- 클라이언트는 자신의 정보를 Eureka Server에 등록하며, 다른 서비스를 탐색할 때 Eureka Server를 조회합니다.
- 로드 밸런싱 및 Fault Tolerance
- Eureka는 여러 인스턴스가 등록된 경우 클라이언트에서 라운드 로빈(Round-Robin) 방식으로 요청을 분배할 수 있도록 지원합니다.
- 특정 서비스 인스턴스가 응답하지 않는 경우, Eureka는 이를 제거하고 다른 인스턴스를 사용하도록 합니다.
1-2. Eureka의 동작 방식
- 서비스 등록
- 마이크로서비스(A)가 Eureka Client를 통해 Eureka Server에 자신의 정보를 등록합니다.
- 등록 정보에는 서비스 이름, IP 주소, 포트 번호, 상태 등이 포함됩니다.
- 서비스 검색
- 마이크로서비스(B)는 특정 서비스(A)의 위치를 알아내기 위해 Eureka Server에 요청합니다.
- Eureka Server는 요청에 응답하며, 서비스(A)의 위치 정보를 반환합니다.
- 상태 갱신 (Heartbeat)
- Eureka Client는 일정 주기로 Heartbeat 신호를 Eureka Server에 보내 서비스 상태를 갱신합니다.
- Heartbeat 신호를 받지 못한 경우 Eureka Server는 해당 서비스를 DOWN 상태로 표시하고 목록에서 제거합니다.
1-3. Eureka의 구성 요소
- Eureka Server
- 마이크로서비스 레지스트리를 유지하며, 서비스의 등록 및 검색 요청을 처리합니다.
- 주로 Spring Boot 기반으로 설정됩니다.
- Eureka Client
- 각 마이크로서비스가 Eureka Server에 정보를 등록하거나 다른 서비스를 검색하는 역할을 합니다.
- Peer-to-Peer Replication
- Eureka Server는 고가용성을 위해 서로 동기화(peer-to-peer replication)하여 데이터를 복제합니다.
2. Eureka Server
build.gradle
- gradle 설정 파일에 의존성을 추가한다.
- mavenBom버전은 사용중인 스프링 버전과 맞게 설정. ( Spring Boot 3.x → Spring Cloud 2022.x.x 이상 )
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:2024.0.0"
}
}
*버전 참고
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies
application.properties
spring.application.name=eureka
# Eureka 서버 포트 설정
server.port=8761
# Eureka 서버 설정
# 이 서버는 다른 서버에 등록하지 않음
eureka.client.registerWithEureka=false
# 이 서버는 다른 서버의 정보를 가져오지 않음
eureka.client.fetchRegistry=false
# 서버 자기 보호 모드 비활성화
eureka.server.enableSelfPreservation=false
# 이 설정을 통해 기본 UI를 활성화할 수 있음
management.endpoints.web.exposure.include=*
main Class에 @EnableEurekaServer 어노테이션 추가
package com.example.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
Eureka 대시보드 확인
- http://localhost:8761 로 접속
3. Eureka Client
build.gradle
- gradle 설정 파일에 의존성을 추가한다.
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
//필수x. 대시보드에서 actuator 확인 위함
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:2024.0.0"
}
}
application.properties
spring.application.name=gateway
# Spring Cloud Gateway 설정
# 서버 포트 설정
server.port=8080
# 라우트 설정
# Eureka 서비스 디스커버리와 통합
# uri=lb://MY-SERVICE-NAME는 Eureka에서 등록된 서비스 이름을 사용하여 해당 서비스의 여러 인스턴스에 대해 로드 밸런싱을 수행합니다.
spring.cloud.gateway.routes[0].id=to_service1
spring.cloud.gateway.routes[0].uri=lb://SERVICE-1
spring.cloud.gateway.routes[0].predicates[0]=Path=/service1/**
spring.cloud.gateway.routes[0].filters[0]=AddRequestHeader=X-Gateway-Header, Gateway-Value
spring.cloud.gateway.routes[1].id=to_service2
spring.cloud.gateway.routes[1].uri=lb://SERVICE-2
spring.cloud.gateway.routes[1].predicates[0]=Path=/service2/**
spring.cloud.gateway.routes[1].filters[0]=AddRequestHeader=X-Gateway-Header, Gateway-Value
# Eureka 서버 URL (Eureka와 연동 시)
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
# Spring Cloud Gateway 기본 설정
#Eureka 서비스 등록을 통한 동적 라우팅 활성화
spring.cloud.gateway.discovery.locator.enabled=true
#eureka server를 registry에 등록할지 여부
eureka.client.registerWithEureka=true
#registry에 있는 정보들을 가져올지 여부
eureka.client.fetchRegistry=true
#Actuator 엔드포인트를 활성화
management.endpoints.web.exposure.include=info,health
main Class에 @EnableEurekaClient 어노테이션 추가
package com.example.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
Eureka 대시보드 확인
- Instances 에서 등록한 application이 조회된다.
- status링크 클릭 시 http://desktop-2lii5um:8080/actuator/info로 이동된다.