본문 바로가기
MSA

[MSA] 서비스 디스커버리

by hsro2228 2021. 1. 14.

<스프링 마이크로서비스 코딩 공작소>(길벗)을 학습하고 개인 학습용으로 정리한 내용입니다

서비스 디스커버리

MSA와 같이 분산 아키텍쳐에서는 다른 서비스를 호출해야할 경우 해당 서비스에 대한 네트워크 정보(IP,포트)를 알아야한다. 그러나 클라우드 환경에서는 서비스 인스턴스의 네트워크 정보가 동적으로 할당되기 때문에 고정적이지 않다. 그래서 서비스 클라이언트가 서비스를 호출할 때 해당 서비스의 네트워크 정보를 알아낼 수 있는 기능이 필요로 한데 이를 서비스 디스커버리(service discovery)라 한다.

 

서비스 디스커버리 아키텍처

1. 서비스 디스커버리를 이용하면 호출하고자 하는 서비스의 IP 주소를 알지 못하더라도 논리적 이름 만으로 서비스를 호출할 수 있다.

2. 서비스는 온라인 상태가 되면 자신의 IP 주소를 서비스 디스커버리 노드에 알려준다. 이때 하나의 디스커버리 노드에만 정보를 전달하게 되고 이 정보를 받은 디스커버리 노드가 다른 노드들에게 정보를 전달하여 공유한다.

3. 디스커버리 노드는 서비스 인스턴스의 상태 정보를 다른 노드들과 공유한다.

4. 각 서비스 인스턴스는 디스커버리 서비스에 자신의 상태 정보를 전달하고 만약 정상 상태가 아닌 서비스 인스턴스는 가용한 서비스 인스턴스 풀에서 제거된다.

 

=> 그러나 이러한 방식은 서비스를 호출할 때마다 디스커버리 엔진에 요청을 해야하므로 디스커버리 엔진에 의존성해야해서 취약할 수 있다. 그래서 클라이언트 측 부하 분산 방법을 사용하여 보완할 수 있다.

 

클라이언트 측 부하 분산

 

1. 서비스를 호출할 때 우선적으로 로컬 캐시를 확인하여 호출하고자하는 서비스 인스턴스의 IP 주소가 있는지 확인한다.

2. 클라이언트가 캐시에서 서비스 인스턴스의 IP 주소를 확인했다면 그대로 이용하고 찾지 못했다면 서비스 디스커버리에서 검색한다.

3.  클라이언트 캐시는 서비스 디스커버리 계층을 통해 지속적으로 업데이트한다.

 

참고자료

스프링 마이크로 서비스 코딩 공작소

 

 

댓글