본문 바로가기

MicroService Architecture

[Spring Cloud] Netflix Eureka 개념, 용어 정리 및 사용 예제

Spring Cloud Netflix Eureka
  • 마이크로 서비스의 정보를 Registry에 등록할 수 있도록 하고 동적인 탐색과 로드 밸런싱을 제공
  • AWS와 같은 Cloud 시스템에서 서비스의 로드 밸런싱과 실패 처리 등을 유연하게 가져가 위해
    각 서비스들의 IP / Port / InstanceId를 가지고 있는 REST 기반의 미들웨어 서버
  • 유레카는 Middle-Tier Load Balancer로 정의
  • 전통적인 로드밸런싱의 경우 서비스의 위치가 고정되어 있었지만 AWS와 같은 클라우드 환경에서는 서버의 위치가 동적으로 변동되기 때문에 개발자가 직접 이를 컨트롤 하기는 어려움
    → 하지만, AWS에서는 middle-tier load balancer를 제공하지 않기 때문에 유레카는 더 많은 관심을 받는다고 함

MSA에서의 Eureka
  • 마이크로서비스 아키텍처에서 유레카는 Client Side Discovery
  • 시스템은 트래픽에 따라 동적으로 증가하거나 감소할 수 있는데, 이러한 환경에서 서비스의 Host와 Port가 동적으로 변하더라도 서비스 인스턴스를 호출할 수 있도록 해주는 Service Registry를 제공 및 관리


Discovery
  • 각 서비스의 위치가 등록된 서버에서 특정 작업을 위한 서버의 위치를 파악하는 작업
  • 즉, 각 서비스 인스턴스들이 동적으로 확장, 축소 되어도 인스턴스 상태를 하나의 서비스로 관리할 수 있는 서비스로 생각하면 됨
  • MSA에선 Service의 IP와 Port가 일정하지 않고 지속적을 변화하기 때문에 Client에 Service의 정보를 수동으로 입력하는 것은 한계가 분명함
    • 즉, Service Discovery는 MSA의 상황에 적합
    • 이때, MSA의 핵심 원칙 중 하나인 Service Discovery의 역할을 수행하기 위해 Eureka Server를 사용

Registry
  • 각 서비스가 자신의 위치(IP) 정보를 특정 서버에 등록하는 작업
  • 이때, MSA의 핵심 원칙 중 하나인 Service Discovery의 역할을 수행하기 위해 Eureka Client를 사용

Eureka Client
  • 각각의 서비스에 해당하는 모듈로 생각
  • 스스로 Eureka Server에 등록 (IP, PORT, InstanceId)
  • Eureka Server로부터 저장된 Registry 정보를 수신하여 자신의 로컬에 저장
    → 다른 Client의 정보를 알 수 있음
  • 처음 모든 정보를 로컬에 저장하고 일정 시간마다 변경되어 정보를 Eureka Server로 요청

Eureka Server
  • Eureka Client를 관리하는 서버
  • Eureka Client의 정보를 Registy에 등록
  • Eureka Client의 Heartbeat Client를 수신하여 해당 Client를 Health Check
  • Heartbeat가 정상적으로 수신되지 않은 경우엔 Server는 Client가 수행 중이지 않다고 판단해당 Client Registry 정보를 삭제
  • 여러 인스턴스를 클러스터로 구성해 가용성을 높이기 위해 Peering 지원

Eureka의 흐름
  1. Eureka Client 서비스가 시작될 때 Service Registry 기능을 할 Eureka Server에 자신의 정보를 등록
  2. Eureka Client는 Eureka Server로부터 다른 Client의 연결 정보가 등록된 Registry를 받아 자신의 로컬에 저장
  3. 주기적으로 Eureka Server로부터 변경 사항을 갱신
  4. 일정 시간 마다 Ping을 통해 자신이 동작하고 있다는 신호 전송
  5. 신호를 보내지 못하면 Eureka Server가 보내지 못한 Client를 Registry에서 제외

용어 정리
  • Service Registration
    • Client(마이크로 서비스)가 자신의 정보를 유레카에 등록하는 행동
  • Service Registry
    • Client의 정보들을 저장하는 위치
  • Service Discovery
    • 클라이언트가 Service Registry에서 요청을 보내야하는 대상을 찾는 과정
    • 요청에 맞는 Service를 찾는 과정으로 이해 됨
  • Eureka Client
    • 다른 서비스의 위치 정보를 알아내기 위해 레카 서버에 질의하는 서비스
  • Eureka Server
    • 유레카 서비스가 자기 자신을 등록(Service Registration)하고 Eureka Client가 Eureka Service를 찾기 위해 가용 서비스 목록(Service Registry)를 요청하는 서버
    • 즉, Eureka Service들이 저장된 위치로 이해 됨
  • Eureka Service
    • 유레카 Client가 요청하였을 때 발견의 대상이 되는 서비스
    • 즉, 유레카에 등록된 Service
  • Eureka Instance
    • 유레카에 등록되어 Service Registry에서 조회 가능한 Eureka Service
  • Fetch Registry
    • Client는 Server로 부터 Service Registry 정보를 가져와 로컬 캐시로 저장하고 일정 주기마다 업데이트
  • Cancel
    • Client가 종료될 때 유레카 서버로 Cancel 요청을 보내서 Service Registry에서 즉시 제거
  • Time Lag
    • 유레카 서버의 Service Registry가 변경된 후 Client가 새로 Fetch 하기 전까지의 데이터의 차이
  • Renew
    • Client는 유레카에 등록된 이후 설정된 주기마다 heartbeat를 전송하여 자신의 존재를 알리는데, 유레카 서버는 설정된 시간동안 heartbeat를 받지 못하면 Eureka Instance를 Service Registry에서 제거
    • Renew Interval서버 내부적으로 유레카 클라이언트를 관리하는 로직이 있기 때문변경하는 것을 권장하지 않음
  • Peering
    • 여러 대의 유레카 서버를 사용할 경우 서로 통신할 수 있도록 구성 필요
      → Peering 구성
  • Self-Preservation Mode
    • 유레카 인스턴스가 요청을 처리할 수는 있지만 단순 Heartbeat를 전송하지 못하는 상황을 대비하여 self-preservation을 사용
    • 이는 registry에서 문제된 인스턴스를 지정한 시간동안 제거하지 않을 수 있음

멀티모듈을 사용한 Eureka 사용 예제

 

1. 프로젝트 생성

 

2. src 삭제

  • 루트 프로젝트는 하위 모듈만 담당하기 때문에 src 삭제

 

3. 새 모듈 추가

  • 루트 프로젝트(eureka-example) 마우스 우클릭 - New(Alt + Insert) → module 클릭
  • 의존성 Eureka Server 추가

 

4. 새 모듈 추가

  • 의존성 Eureka Discovery Client, Spring Web 추가

 

5. 루트 프로젝트의 settings.gradle에 새로 추가된 모듈 포함

 

6. eureka-server 모듈 application.yml 설정

spring:
  application:
    name: eureka-server

server:
  port: 8888

# Eureka Server Setting
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone : http://localhost:8888/eureka
    register-with-eureka: false
    fetch-registry: false
  • eureka.client.serve-url.defaultZone
    • eureka는 여러 instance를 두고 여러 서버를 둘 수 있음
    • 이 부분의 역할은 이 여러 인스턴스를 연동해서 하나의 유레카 서버가 다운 될 경우 다른 유레카 서버의 정보를 사용하여 각 client들의 기본 정보등을 불러 올 수 있게 함
  • eureka.client.register-with-eureka
    • 클라이언트 단으로 등록 할 지 여부를 묻는 것
    • Eureka Server이기 때문에 false (기본값 true)
  • eureka.client. fetch-registry
    • 서버로 부터 registry 정보를 30초마다 수신하여 캐싱
    • 클라이언트가 Server에게 받는 것이기 때문에 false (기본값 true)

7. @EnableEurekaServer 어노테이션 추가

  • Application에 EurekaServer를 쓴다고 알려줌
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

}

 

8. eureka-client 모듈 application.yml 설정

spring:
  application:
    name: api-gateway

# Eureka Server Setting
eureka:
  client:
    service-url:
      defaultZone : http://localhost:8888/eureka
    register-with-eureka: true
    fetch-registry: true
  • spring.application.name
    • 유레카에 등록될 이름
  • eureka.client.serve-url.defaultZone
    • 유레카 서버에 등록 ⇒ registry

9. @EnableDiscoveryClient 어노테이션 추가

  • @EnableDiscoveryClient는 굳이 적지 않아도 기본적으로 지원한다고 함
  • 즉, application.yml 파일만 설정해도 무관
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

}

 

10. 두 모듈 모두 실행 후 localhost:8888 접속

  • Eureka Client에 설정한 이름인 api-gateway로 등록(registry)가 된 것 확인

 

11. Eureka Client 강제 종료

  • Eureka Client를 종료하자마자 유레카 서버를 새로 고침
  • API-GATEWAY가 정상 실행(UP) 상태가 아니게 되어 상태가 DOWN으로 변경

  • 다시 새로 고침 시 어떠한 인스턴스도 등록되지 않음

'MicroService Architecture' 카테고리의 다른 글

FeignClient(OpenFeign) 사용 이유, 예제  (0) 2024.08.21
Feign Client / Web Client / RestTemplate  (0) 2024.08.21
Service Discovery 개념, 종류, 특징  (0) 2024.08.20
Spring Cloud란?  (0) 2024.08.20
API Gateway란?  (0) 2024.08.20