MSA같은 분산환경은 서비스간의 원격호출로 구성된다.

이때, 원격 서비스 호출은 IP주소와 포트를 이용하여 구현되는데, 클라우드 환경이 되면서 서비스가 오토스케일링에 의해 동적으로 생성되는 경우가 잦아졌고, 컨테이너 기반의 배포로 인해 서비스 IP가 동적으로 변경되는 일이 잦아졌다.

그래서 서비스 클라이언트가 서비스를 호출할 때, 서비스의 위치를 알아낼 수 있는 기능이 필요한데, 이를 바로 Service Discovery라고 한다.

서비스 레지스트리

Untitled

위 그림에서 serviceA의 인스턴스들이 생성될때, 서비스 레지스트리에 해당 서버 정보를 등록하게 된다. 이후, ServiceA를 호출하고자하는 클라이언트는 ServiceRegistry에 ServiceA의 주소를 물어보고 등록된 주소를 받아 해당 주소로 서비스를 호출하게 된다.

이런 서비스 디스커버리를 구현하기 위해서는 client discovery방식과 server side discovery방식이 있다.

이름 그대로 registry로부터 어떤 주체에 의해 discovery하느냐에 따라 방법이 나뉜다.

Proxy Server (Load Balancer)

Server Side Discovery의 대표적인 접근 방법으로, 호출이 되는 서비스 앞에 일종의 Proxy서버(로드밸런서)를 넣는 방식이 있다. 서비스클라이언트는 이 로드밸런서를 호출하면 로드밸런서가 ServiceRegistry로부터 등록된 서비스 위치를 리턴하고 이를 기반으로 라우팅하게된다.

Untitled

Service Registry를 구현하는 방법

가장 쉬운 방법은 DNS레코드에 하나의 호스트명에 여러개의 IP를 등록하는것으로 구현할 수 있다. 다만 DNS레코드 삭제시 업데이트 되는 시간 소요등이 있기에 Zookeeper, etcd와 같은 서비스를 이용하는 경우가 대다수이며, 전문화된 솔루션으로는 Netflix의 Eureka 혹은 Hashcorp의 Consul과 같은 서비스가 있다.

참고

서비스 디스커버리 기능은 기본적으로 서비스를 등록하고 등록된 서비스의 목록을 리턴하는 기능이지만, 이외에도 부가적인 기능을 이용할 수 있다.