Backend/spring cloud (MSA)

Eureka개념 및 설정 방법

dddzr 2025. 1. 3. 21:18

목차

1. Eureka란?

 1-1. 주요 개념

 1-2. 동작 방식

 1-3. 구성 요소

2. Eureka Server 등록 방법

3. Eureka Client 등록 방법

1. Eureka란?

  • Eureka는 Netflix에서 개발한 서비스 디스커버리(서비스 레지스트리) 도구.
  • 마이크로서비스 아키텍처(MSA)에서 동적으로 서비스들을 탐지하고 연결하기 위해 사용. 즉, 마이크로서비스 간의 통신을 관리
  • 로드 밸런싱 및 Fault Tolerance의 역할.

 

1-1. 주요 개념 및 역할

  1. 서비스 디스커버리 (Service Discovery)
    • 마이크로서비스 환경에서는 여러 서비스가 네트워크를 통해 서로 통신합니다. 각 서비스는 IP 주소와 포트로 식별되는데, 이 정보가 동적으로 변할 수 있습니다.
    • Eureka는 서비스가 자신을 등록(Register)하고, 다른 서비스가 이를 검색(Discovery)할 수 있도록 관리합니다.
  2. Eureka Server
    • Eureka의 중심 역할을 하는 레지스트리 서버입니다.
    • 서비스들은 이 서버에 자신을 등록하며, 서버는 등록된 서비스의 위치 정보를 저장합니다.
    • 각 서비스는 일정 주기로 Heartbeat 신호를 보내 Eureka Server에 자신의 상태를 갱신합니다.
  3. Eureka Client
    • 애플리케이션에서 Eureka Server와 통신하는 역할을 합니다.
    • 클라이언트는 자신의 정보를 Eureka Server에 등록하며, 다른 서비스를 탐색할 때 Eureka Server를 조회합니다.
  4. 로드 밸런싱 및 Fault Tolerance
    • Eureka는 여러 인스턴스가 등록된 경우 클라이언트에서 라운드 로빈(Round-Robin) 방식으로 요청을 분배할 수 있도록 지원합니다.
    • 특정 서비스 인스턴스가 응답하지 않는 경우, Eureka는 이를 제거하고 다른 인스턴스를 사용하도록 합니다.

 

1-2. Eureka의 동작 방식

  1. 서비스 등록
    • 마이크로서비스(A)가 Eureka Client를 통해 Eureka Server에 자신의 정보를 등록합니다.
    • 등록 정보에는 서비스 이름, IP 주소, 포트 번호, 상태 등이 포함됩니다.
  2. 서비스 검색
    • 마이크로서비스(B)는 특정 서비스(A)의 위치를 알아내기 위해 Eureka Server에 요청합니다.
    • Eureka Server는 요청에 응답하며, 서비스(A)의 위치 정보를 반환합니다.
  3. 상태 갱신 (Heartbeat)
    • Eureka Client는 일정 주기로 Heartbeat 신호를 Eureka Server에 보내 서비스 상태를 갱신합니다.
    • Heartbeat 신호를 받지 못한 경우 Eureka Server는 해당 서비스를 DOWN 상태로 표시하고 목록에서 제거합니다.

 

1-3. Eureka의 구성 요소

  1. Eureka Server
    • 마이크로서비스 레지스트리를 유지하며, 서비스의 등록 및 검색 요청을 처리합니다.
    • 주로 Spring Boot 기반으로 설정됩니다.
  2. Eureka Client
    • 각 마이크로서비스가 Eureka Server에 정보를 등록하거나 다른 서비스를 검색하는 역할을 합니다.
  3. 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로 이동된다.