참고
- https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/
- https://velog.io/@hoonki/마이크로서비스-패턴-서비스-디스커버리
🕵️♂️ Service Discovery 패턴이 등장하게 된 배경
기존 서비스 인스턴스의 개수와 IP 가 고정적이였던 온 프레미스 환경과 달리 MSA 환경에서는 Application 들이 AutoScaling 을 하면서 동적으로 줄었다가 늘어나면서 IP 자체도 고정이 아닌 동적으로 바뀌게 됐습니다.
Client 나 Gateway 입장에서 서비스 인스턴스들이 동적으로 늘었는지 줄었는지에 대한 파악을 하기가 어려운 문제가 있었고 그에 따른 LoadBalancing 하는데 어려움이 있었습니다.
변경 및 추가된 서비스들의 위치와 주소를 쉽게 파악하기 위해 Service Discovery 가 등장하게 됐습니다.
✅ 서비스 등록 - Service Registry
Service Discovery 패턴에서는 Service EndPoint 를 조회 및 관리하기 위한 저장소가 필요한데, 이를 Service Registry 라 합니다. MSA 에서 각 서비스들이 실행하게 되면 Service Registry 에 자신의 EndPoint 들을 등록합니다.
그리고 주기적으로 Service Registry 에 등록된 서비스 중이 정상적인지 Health Check 를 진행하고, 정상적인 응답이 안올 경우 목록에서 삭제하는 방식으로 진행합니다.
MSA 에서 서비스를 찾을 때는 Service Registry 를 이용하므로 서비스 이용시 필수적으로 등록돼 있어야 합니다.
✅ Service Discovery 패턴 종류
Service EndPoint 를 접근하는 방식에 따라 두가지로 나뉘게 됩니다. 첫번째는 Client-Side Discovery
두번째는 Server-Side Discovery
패턴이 있습니다.
Client Side Discovery
MSA 내 한 서비스가 다른 서비스를 호출할때 Service Registry 로 부터 EndPoint 를 조회한 후 해당 서비스를 호출하는 방식입니다.
Spring Cloud 를 사용하게 되면 Eureka 에 각각의 서비스들을 등록하고 각 Client 에서는 유레카에 등록된 서비스들을 검색 후 원하는 서비스로 통신을 하게 됩니다.
Server Side Discovery
Server Side Discovery 패턴은 기존 Client Side Discovery 와는 다르게 Service Registry 앞에 Load Balancer
를 두는 형태를 띄고 있습니다.
Server Side Discovery 는 Client Side Discovery 와 다르게 각 서비스간의 호출시에는 Load Balancer 를 통해 호출을 하게 되고 Load Balancer 가 Service Registry 에 등록된 EndPoint 들을 확인한 후 라우팅하는 방식입니다.
Server Side Discovery 패턴의 장점은 각각의 서비스 들에게 DNS 를 부여해 Domain 이름으로 호출할 수 있는 장점이 있고 Client Side Discovery 와는 달리 서비스 호출에 Load Balancer 를 거쳐야 하는 문제가 있어 Network Hop 이 늘어나는 단점이 있습니다.
쿠버네티스에서는 Server Side Discovery 를 제공합니다.