서버 개발/스프링

[스프링 클라우드] 서비스 디스커버리

_금융덕후_ 2024. 10. 3. 12:00
728x90
반응형

서비스 디스커버리란?

마이크로 서비스 아키텍처(MSA)를 다루다 보면 특정 인스턴스에 접근해야 하거나,

현재 서비스 가능한 인스턴스의 갯수를 알아야 하는 경우가 종종 생긴다.

특히 MSA를 운영하다 보면 인스턴스 추가나 인스턴스가 교체되는 상황이 빈번하게 발생한다.

이때 인스턴스의 정보를 빠르게 파악할수 있도록,

서비스의 각 인스턴스 목록 및 ip리스트와 같은 메타데이터를 관리하는 것이 서비스 디스커버리다.

 

서비스 디스커버리의 종류

유레카

유레카는 넷플릭스에서 만든 서비스 디스커버리 패키지이다.

스프링 클라우드에서 기본적으로 제공하는 컴포넌트이다.

spring-cloud-starter-eureka-server 스타터를 통해 사용한다.

 

아파치 주키퍼

주키퍼는 주로 하둡 스파크와 같은 빅데이터 시스템에 활용되는 분산 코디네이터이다.

주키퍼는 별도의 클러스터로 구성되어 관리된다.

스프링 클라우드에서 활용할수 있도록 스타터가 제공되는데,

spring-cloud-starter-zookeeper-discovery를 통해 사용한다.

 

컨설

해시코프가 만든 서비스 디스커버리 및 분산 컨피규레이션 툴이다.

컨설은 서버에 연결하기 위해서 별도의 프로세스로 구성된 에이전트가 필요하다.

스프링 클라우도에서는 spring-cloud-starter-consul-discovery 를 통해 제공된다

 

서비스 디스커버리 동작방식

서비스 디스커버리는 보통 서버-클라이언트 두가지 부분으로 나누어져 동작한다.

부트 서비스가 시작되면 서버는 각 인스턴스로부터 생존신호를 받는다.

서버가 일정 시간(설정값)동안 특정 인스턴스의 heartbeat를 받지 못하면 레지스트리에서 삭제된다.

클라이언트는 주기적으로 서버에 heartbeat를 전송해야 한다.

그리고 주기적으로 서버로부터 데이터를 가져와 데이터를 캐싱한다.

부트 서비스 종료시에는 액추에이터의 /shutdown을 활용해 서버에서 등록을 해제한다.

 

레지스트리 갱신

디스커버리 서버(이하 유레카 서버)는 lease와 evict라는 용어를 사용한다.

lease - 임대, 유레카 서버에 인스턴스가 등록된 상태

evict - 퇴거, 유레카 서버에 인스턴스가 제거되는 행위

유레카 서버는 기본적으로 응답을 캐싱하고, 디폴트로 30초간 유지한다.

 

자기보호모드

유레카에는 자기보호모드 라는 특별한 메커니즘이 존재한다.

등록상태를 갱신하지 않는 인스턴스가 특정 수를 넘어가면,

인스턴스의 등록을 레지스트리에서 삭제하는 작업을 멈춘다.

네트워크 이슈와 같은 문제로 전체가 삭제되는 상황을 방지하는 것이다.

 

고가용성

유레카는 고가용성을 위해 보통 2개 이상의 클러스터로 운영된다.

하지만 리더 선출이나 자동참여와 같은 표준 클러스터링 메커니즘은 제공하지 않는다.

따라서 구성되는 인스턴스간 전체 복제를 통해 고가용성을 지원한다.

클러스터 내에서 장애가 발생하면 다른 인스턴스에 접속해 디스커버리 정보를 가져온다.

 

728x90
반응형