Back_End/Spring

Eureka Server(유레카 서버)란?

10Biliion 2024. 11. 26. 15:46

 

Service Discovery (서비스 디스커버리)란?

서비스 디스커버리는 분산 시스템에서 각 서비스가 동적으로 서로를 찾고 통신할 수 있도록 해주는 메커니즘입니다.

왜 필요한가?

마이크로서비스 아키텍처에서는 여러 개의 서비스가 독립적으로 실행되며, 각 서비스는 동적으로 실행되거나 종료될 수 있습니다. 이러한 환경에서 서비스들이 서로를 찾고 연결하기 위해 고정된 IP 주소를 사용하는 것은 어렵거나 불가능합니다.

이를 해결하기 위해 서비스 디스커버리가 필요합니다.


서비스 디스커버리 방식

  1. 클라이언트 사이드 디스커버리
    • 서비스 소비자(클라이언트)가 **디스커버리 서버(서비스 레지스트리)**에 등록된 서비스 목록을 조회하여 적절한 서비스 인스턴스를 선택합니다.
    • 예: Netflix Eureka, Consul, Zookeeper
  2. 서버 사이드 디스커버리
    • 서비스 소비자는 고정된 로드 밸런서(서비스 디스커버리 서버)를 호출하고, 디스커버리 서버가 적절한 서비스 인스턴스로 라우팅합니다.
    • 예: AWS ALB, Kubernetes Service

Eureka Server란?

Eureka Server는 Netflix에서 개발한 서비스 디스커버리 서버로, 마이크로서비스들이 자신을 등록하고(등록: Service Registration), 다른 서비스의 위치를 조회(탐색: Service Discovery)할 수 있도록 해주는 중앙 레지스트리 역할을 합니다.

Eureka의 주요 개념

  1. Eureka Server
    • 서비스 레지스트리 역할을 하며, 모든 서비스 인스턴스가 여기 등록됨.
    • 마이크로서비스들이 Eureka Server에 주기적으로 자신의 상태를 갱신(Heartbeat)하며, 응답이 없으면 자동으로 제거됨.
  2. Eureka Client
    • 마이크로서비스는 Eureka Client로 동작하며, Eureka Server에 등록 및 주기적 갱신을 수행함.
    • 다른 서비스 정보를 조회해 부하 분산과 서비스 탐색을 수행.
  3. Self-Preservation Mode (자가 보호 모드)
    • Eureka Server가 일정 시간 동안 서비스 헬스 체크 요청을 받지 못해도 즉시 서비스에서 제거하지 않고 유지하는 기능.
    • 네트워크 장애가 발생해도 서비스가 갑자기 사라지지 않도록 보호.

Eureka Server 설정하기

1. Spring Boot 프로젝트 생성

Spring Initializr(https://start.spring.io)를 통해 다음 설정으로 프로젝트를 생성합니다:

  • Dependency: Spring Cloud Netflix Eureka Server, Spring Boot DevTools

2. 프로젝트 설정

build.gradle 또는 pom.xml 파일에 필요한 의존성을 추가합니다.

build.gradle 예시:

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
    implementation 'org.springframework.boot:spring-boot-starter-web'
}
 

3. Eureka Server 활성화

Spring Boot 애플리케이션 클래스에 @EnableEurekaServer를 추가합니다.

EurekaServerApplication.java:

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 EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

4. 설정 파일 작성

application.yml 또는 application.properties 파일을 작성합니다.

application.yml:

server:
  port: 8761  # Eureka Server 기본 포트

eureka:
  client:
    register-with-eureka: false  # 서버는 자신을 등록하지 않음
    fetch-registry: false        # 다른 레지스트리 정보를 가져오지 않음
  server:
    wait-time-in-ms-when-sync-empty: 0  # 서버 동기화 대기 시간

5. Eureka 대시보드 확인

Eureka Server가 실행되면, http://localhost:8761에서 Eureka 대시보드를 확인할 수 있습니다.


Eureka Client 설정하기

Eureka Server에 서비스를 등록하려면 클라이언트에서도 몇 가지 설정이 필요합니다.

1. 의존성 추가

Eureka Client 프로젝트에 spring-cloud-starter-netflix-eureka-client를 추가합니다.

build.gradle:

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

2. Eureka Client 설정

application.yml 파일에 Eureka Server URL과 클라이언트 정보를 설정합니다.

application.yml:

spring:
  application:
    name: my-service  # 서비스 이름

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # Eureka Server 주소

3. 애플리케이션 실행

클라이언트를 실행하면, Eureka 대시보드에서 서비스가 등록된 것을 확인할 수 있습니다.


Eureka의 주요 기능

  1. Load Balancing
    Eureka Client는 동적으로 서비스 목록을 가져오며, 이를 통해 클라이언트 측 로드 밸런싱이 가능합니다.
  2. Failover
    Eureka Server가 여러 인스턴스로 구성된 경우, 클라이언트는 다른 서버로 자동 전환합니다.
  3. Self-Preservation
    네트워크 오류가 발생해도 서버는 등록된 서비스 정보를 유지합니다.

 

 

장점과 단점

장점

  • 클라이언트가 직접 서비스 디스커버리를 수행하여 로드 밸런싱을 유연하게 조정 가능.
  • Netflix OSS와 Spring Cloud 환경에서 강력한 지원.

단점

  • 클라이언트에서 직접 서비스 목록을 조회하므로 부하 분산 로직을 추가적으로 고려해야 함.
  • Kubernetes, Consul, Zookeeper 등과 비교했을 때 멀티 리전(다중 데이터센터) 환경에서 약점이 있음.

 

 

✔ Service Discovery(서비스 디스커버리)는 동적 서비스 탐색 및 통신을 위한 핵심 기능이다.
Eureka ServerSpring Cloud 기반 마이크로서비스 환경에서 널리 사용되는 서비스 디스커버리 솔루션이다.
✔ 클라이언트가 직접 Eureka Server에서 서비스 목록을 가져와 부하 분산하며, Spring Cloud Netflix Eureka를 사용하면 손쉽게 설정 가능하다.