ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Cloud] Netflix Eureka 찍어먹기
    Spring Framework 2025. 1. 3. 23:36

    1. Eureka 소개

    Netflix Eureka는 Netflix OSS(Open Source Software)에서 제공하는 서비스 디스커버리 기술이다. 서비스 디스커버리란 마이크로서비스 아키텍처에서 각 서비스가 동적으로 서로를 찾고 통신할 수 있도록 돕는 메커니즘이다. 마이크로서비스에서는 서비스가 독립적으로 분리되기 때문에 서비스 간의 위치를 동적으로 파악하는 것이 필요하다. Eureka를 사용하여 마이크로서비스를 편리하게 관리할 수 있으며 Eureka 서버를 클러스터로 구성하여 장애에 대비할 수도 있다. 하지만 Eureka는 HTTP 기반 통신을 사용하기 때문에 대규모 시스템에서 네트워크 부하가 발생할 수 있다.

    2. 주요 기능

    • 서비스 동적 등록: 각 마이크로서비스가 IP 주소나 포트를 미리 알 필요 없이, Eureka 서버에 동적으로 등록된다.
    • 서비스 발견: 클라이언트 서비스가 Eureka 서버에서 필요한 서비스의 위치를 조회할 수 있다.
    • 헬스 체크(Health Check): 서비스 인스턴스가 정상적으로 작동하는지 확인하고, 비정상적인 인스턴스를 레지스트리에서 제거한다.

    3. 구성 요소

    (1) Eureka Server

    • 서비스 레지스트리 역할을 한다.
    • 일반적으로 HA(고가용성)를 위해 다중 서버 환경으로 구성한다.

    (2) Eureka Client

    • 서비스 인스턴스가 Eureka 서버에 자신의 정보를 등록하고, 다른 서비스의 정보를 검색한다.
    • Spring Cloud Netflix에서 간단한 설정을 통해 사용할 수 있다.

    4. Eureka 찍어 먹기

    (1) Eureka Server

    build.gradle

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

     
     
    EurekaServerApplication

    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }
    

     
     
    application.yml

    spring:
      application:
        name: eureka-server     # 애플리케이션 이름 (Eureka 서버로 설정)
    
    server:
      port: 8761                # Eureka 서버가 실행될 포트 번호
      servlet:
        context-path: /eureka   # Eureka 서버의 컨텍스트 경로
      ssl:
        enabled: false          # HTTPS 사용 여부 (true로 설정 시 아래 SSL 옵션 필요)
        # key-store: 키스토어 파일 경로
        # key-store-password: 키스토어 비밀번호
    
    eureka:
      server:
        wait-time-in-ms-when-sync-empty: 0  # 레지스트리를 동기화하지 못했을 때 대기 시간 (밀리초)
        enable-self-preservation: true      # 자기 보존 모드 활성화
        eviction-interval-timer-in-ms: 60000  # 만료된 인스턴스를 제거하는 주기 (밀리초)
    
      client:
        register-with-eureka: false       # 이 서버를 다른 Eureka 서버에 등록하지 않음
        fetch-registry: false             # 다른 Eureka 서버로부터 레지스트리를 가져오지 않음
    
    eureka:
      instance:
        hostname: eureka-server           # Eureka 서버의 호스트 이름
        prefer-ip-address: true           # 서비스 등록 시 IP 주소 사용 여부
        instance-id: eureka-server-1      # Eureka 서버의 고유 ID
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"                  # 모든 관리 엔드포인트 활성화
      endpoint:
        health:
          show-details: always            # 헬스 체크에서 세부 정보 표시
    
    logging:
      level:
        com.netflix.eureka: DEBUG         # Eureka 관련 디버그 로깅 활성화
        org.springframework: INFO         # Spring 관련 기본 로깅 레벨
    

     

    (2) Eureka Client

     
    build.gradle

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

     
     
    application.yml

    spring:
      application:
        name: my-eureka-client # Eureka 서버에 등록될 이름
    
    server:
      port: 8080
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/ # Eureka 서버의 URL. 클러스터 환경에서는 여러 서버 URL을 콤마로 구분하여 추가
        register-with-eureka: true                   # 클라이언트가 Eureka 서버에 자신을 등록할지 여부 (기본값 true)
        fetch-registry: true                         # Eureka 서버에서 레지스트리를 가져올지 여부 (기본값 true)
        healthcheck:
          enabled: true                              # 클라이언트가 헬스 체크 상태를 Eureka 서버에 보고할지 여부
    
      instance:
        instance-id: eureka-client-1                 # Eureka 서버에 등록되는 클라이언트의 고유 ID
        prefer-ip-address: true                      # Eureka 서버에 등록 시 IP 주소를 우선 사용 (true: IP, false: 호스트 이름)
        lease-renewal-interval-in-seconds: 30        # 클라이언트가 Eureka 서버에 상태를 갱신하는 주기 (초)
        lease-expiration-duration-in-seconds: 90     # Eureka 서버가 상태 갱신 신호를 기다리는 시간 (초)
        metadata-map:                                # 추가적인 메타데이터 정보 설정
          zone: primary                              # 데이터 센터 또는 서비스 영역(zone)을 설정
          version: 1.0                               # 애플리케이션 버전 정보
          environment: production                    # 환경 정보 (예: 개발, 테스트, 운영 환경)
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"                             # 모든 관리 엔드포인트 활성화
      endpoint:
        health:
          show-details: always                       # 헬스 체크에서 세부 정보 표시
    
    logging:
      level:
        com.netflix.eureka: DEBUG
        org.springframework: INFO