서비스 인스턴스는 시작할 때 서비스 검색 인스턴스가 자신을 액세스하는 데 사용할 물리적 위치, 경로, 포트를 등록한다. 서비스의 각 인스턴스에는 고유 IP 주소와 포트가 있지만 동일한 서비스 ID로 등록된다. 이때 서비스 ID는 동일한 서비스 인스턴스 그룹을 고유하게 식별하는 키일 뿐이다.
서비스는 일반적으로 하나의 서비스 디스커버리 인스턴스에만 등록된다. 대부분의 서비스 디스커버리 구현체는 서비스 인스턴스 관련 데이터를 클러스터 내 다른 노드에 전달하는 데이터 전파 방법으로 P2P(Peer-to-Peer) 모델을 사용한다. 전파 메커니즘은 서비스 구현체에 따라 하드코딩된 서비스 목록을 사용해서 전파하거나, gossip 같은 멀티캐스팅 프로토콜이나 전염식(infection-style) 프로토콜을 사용하여 클러스터에서 발생한 변경을 다른 노드가 ‘발견(discovery)’할 수 있게 한다.
Note ≣
gossip이나 전염식 프로토콜을 더 알고 싶다면 콘술(Consul)의 ‘Gossip 프로토콜’(https://www.consul.io/docs/internals/gossip.html) 또는 브라이언 스토티(Brian Storti)가 게시한 ‘SWIM: 확장 가능한 멤버십 프로토콜’(https://www.brianstorti.com/swim/)을 추천한다.
마지막으로 각 서비스 인스턴스는 자기 상태를 서비스 디스커버리 서비스에 푸시(push)하거나 가져온다(pull). 정상 상태를 전달하지 못한 서비스는 가용 서비스 인스턴스 풀에서 제거된다. 서비스 디스커버리에 등록되고 나면 서비스는 자신의 기능을 이용해야 하는 애플리케이션이나 서비스를 사용할 준비가 된 것이다. 물론 클라이언트가 서비스를 발견할 수 있는 다른 모델도 있다.