본문 바로가기

System Architecture

Eureka의 내부 동작.

Eureka는 서비스 디스커버리로써, 서버와 클라이언트 파트로 구성된다.

Server

  • 등록한 서비스의 목록을 수집한다.
  • 새로운 서비스의 네트워크 주소와 함께 등록을 담당한다.

Client

  • 애플리케이션 시작시 서버에 자신을 등록한다.
  • 종료전, 서버에서 등록 해제를 담당한다.
  • 유레카 서버로부터, 주기적으로 최신 서비스 목록을 가져온다.

동작방식

  • 자신을 Eureka 서버에 등록하고 호스트, 포트, 상태 정보, URL, 홈페이지 URL을 보낸다.
  • Eureka 서버는 서비스의 각 인스턴스로부터 생존신호(Heartbeat) 메시지를 받는다.
  • 설정된 기간 동안 생존신호 메시지를 받지 못하면 레지스트리에서 서비스가 삭제된다.
  • 서버로부터 데이터를 가져와서 캐싱하고 주기적으로 변경사항을 점검한다.

자기보존모드(Self-preservation Mode)

  • 일반적으로 Eureka 서버에 등록된 instance는 주기적으로 heartbeat를 보내는데, heartbeat를 받지 못하면 서버의 registry에서 instance를 제거 한다.
  • 하지만 자신의 서비스 등록 상태를 제 시간에 갱신하지 않는 서비스의 수가 일정 수를 넘게 되면 '등록 만료'를 멈춘다.
  • 즉 서버 Registry에서 instance를 제거하지 않는 것이다.
  • 그 이유는 네트워크 장애가 발생했을 때 등록된 모든 서비스가 해제되는 것을 방지하기 위함이다.
  • 그러니까 Eureka로의 네트워크는 단절되었지만, 해당 서비스 자체는 문제가 없는 경우가 있기 때문에 '자기 보존 모드'가 활성화 되어 있으면 registry에서 해당 instance를 정해진 기간 동안 제거하지 않게 된다.

레지스트리 갱신

  • Eureka client를 종료해도 Eureka Server Registry에 Up으로 일정기간 등록되어 있다. 자기 보존 모드를 해제하여도 마찬가지이다.
  • 이는 모든 클라이언트 서비스가 30초(default)마다 서버로 하트비트를 보내기 때문이다.
  • 서버가 하트비트를 받지 못하면 레지스트리에서 인스턴스를 제거하기 전에 90초를 기다린다.
  • 등록을 해제해서 인스턴스로 더 이상 트래픽이 가지 못하도록 차단할 수 있다.
  • 속성으로 설정이 가능하며, leaseExpirationDurationInSeconds 속성에 지정된 기간 동안 heartbeat가 수신되지 않으면 eureka 서버에서 instance를 제거한다.

클라이언트 설정

eureka:
  instance:
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2

서버 설정

eureka:
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 3000
  • 서버까지 설정하는 이유는, Evict(퇴거) 이라는 백그라운드 태스크 때문이다.
  • Evict은 클라이언트로부터 하트비트가 계속 수신 되는지 점검하는 일을 수행한다.
  • 기본설정으로 60초를 지정하기 때문에, 60초동안은 유레카 클라이언트가 종료되어도 서버 레지스트리에는 남아있는 것이다.

응답 캐싱(서버)

  • 유레카 서버는 기본적으로 응답을 캐시한다. 그리고 30초마다 캐시 데이터를 지운다.
  • 유레카 서버를 실행하고 /eureka/apps API를 호출해보자. 아무것도 안나온다.
  • 그리고 클라이언트 인스턴스를 실행 하고 서버의 /eureka/apps를 다시 호출해보자. 여전히 안나온다.
  • 30초가 지나고 나서 다시 호출해보자 추가된 클라이언트 인스턴가 조회된다.
  • 다음과 같은 속성을 통해 재정의 할수 있다.
eureka:
  server:
    response-cache-update-interval-ms: 3000

로드 밸런싱

  • 보통 Discovery Service는 Proxy역할을 수행하는 Gateway와 함께 사용하기 마련이다.
  • 그렇다면 로드 밸런싱을 어떻게 할수 있을까?
  • 위에서 보았듯이, Spring Cloud Gateway는 자기 자신을 유레카 서버에 등록한다. 
  • 이후 설정에 lb:{Eureka client instance id}를 작성하게 되는데, 이후 요청이 올때마다 주기적으로 가져온 최신 서비스 목록에 해당 request를 처리할때 instance id를 찾게 된다.
  • 두개가 존재할수 있고, 3개가 존재할수 있다. 찾은 instance의 서버상황(주기적으로 유레카는 응답에 대한 캐싱을 진행하므로 서버 상황을 파악)에 맞게 실행할 서버를 찾아서 요청을 전달하는 것이다.

결론

Eureka는 MSA환경내에서, 변화하는 서버 환경에서 유연함을 주기 위한 Service Discovery이자 Load Balanser역할을 수행하는 Middle ware Server라고 볼수 있다.

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

MiddleWare란?  (0) 2022.08.07