Service Discovery란?
MSA와 같은 분산 환경에서의 동작은 서비스 간의 원격 호출(API 호출)로 구성되며, 원격 호출은 각 서비스의 ip 주소와 port를 기반으로 요청된다.
클라우드 환경에서는 서비스가 autoScaling 등에 의해 동적으로 생성되거나, 컨테이너 기반의 배포로 인해서 서비스의 ip가 동적으로 변경되는 일이 잦아졌다.
이러한 변경은 클라우드에서 일어난 것이기 때문에 동적으로 변하는 ip를 수동으로 대응할 수는 없다.
때문에 클라우드 환경에서는 서비스 클라이언트가 서비스를 호출할 때, 서비스의 위치(ip 주소와 port)를 알아낼 수 있는 기능이 필요하다.
이것을 바로 Service Discovery라고 하며, 이를 구현하는 방법으로는 크게 Client Side Discovery 방식과 Server Side Discovery 방식이 있다.
클라이언트 사이드 디스커버리(Client-Side Discovery)
service client가 service registry에 query를 통해 서비스의 위치를 물어보고 호출하는 방식이며, 호출 시에는 로드밸런싱 알고리즘을 통해 서비스가 호출된다.
service instance가 생성될 때(구동될 때) ip 주소, port, 서비스명 등이 service registry에 등록되며, service instance가 종료될 때 service registry에서 삭제된다.
장점
- 클라이언트가 사용 가능한 서비스 인스턴스에 대해서 알고 있기 때문에 각 서비스별 로드밸런싱 방법을 선택할 수 있다.
단점
- 클라이언트와 서비스 레지스트리 사이의 의존성이 생기며, 서비스 클라이언트에서 사용하는 각 프로그래밍 언어 및 프레임워크에 대해서 클라이언트 측 service discovery 로직(register나 discovery)을 구현해야 합니다.
client side discovery의 대표적인 예로 Netflix OSS의 Netflix Eureka가 있다.
Netflix Eureka는 서비스 인스턴스의 등록을 관리하고, 사용 가능한 인스턴스를 조회하기 위한 REST API를 제공하며, Netflix Ribbon은 Eureka와 함께 쓰이며 호출 시 로드밸런싱 역할을 해준다.
서버 사이드 디스커버리(Server-Side Discovery)
호출 되는 서비스 앞에 Load Balancer를 넣는 방식으로 service client가 Load Balancer를 호출하면 Load Balancer가 service register로 서비스의 위치를 물어보고 가용할 수 있는 서비스 인스턴스를 라우팅 한다.
client side discovery와 마찬가지로 서비스 인스턴스가 생성될 때(구동될 때) service registry에 생성되고 종료될 때 삭제된다.
장점
- Discovery의 기능이 클라이언트로부터 분리되어 있어 의존성이 낮아지고, 분리되어 있는 클라이언트는 단순히 로드밸런서에 요청만 합니다.
- 클라이언트 측에서 각 프로그래밍 언어 및 프레임워크에 대한 검색 로직을 구현할 필요가 없습니다.
- 일부 배포환경에서는 이 기능을 무료로 제공한다.
단점
- 로드밸런서가 배포환경에서 제공되어야 한다.
- 제공되어있지 않다면 설정 및 관리해야 하는 또 다른 고 가용성 시스템 요소가 된다.
Server-Side Discovery의 예로는 AWS Elastic Load Balancer(ELB), Kubernetes가 있다.
서비스 레지스트리(Service Registry)
service registry는 service discovery의 핵심 부분으로 서비스 인스턴스의 네트워크 location을 포함하는 데이터베이스와 같다.
높은 가용성이 보장되어야 하고 항상 최신 정보를 유지해야 한다는 특징이 있으며, 서비스 레지스트리는 일관성을 유지하기 위해 복제 프로토콜을 사용하는 서비스 클러스터로 구성된다.
대표적인 service registry로는 Netflix Eureka, Apache Zookepper, etcd, HashiCorp의 Consul가 있다.
Kubernates, Marathon 같은 몇몇 시스템에는 명시적인 service registry가 없는데, Kubernetes나 Marathon과 같은 배포 환경은 클러스터 내의 각 호스트에서 프록시(Porxy)를 생성하는데, 이 프록시가 Server Side Discovery의 로드밸런서 역할을 수행한다.
클라이언트는 서비스에 요청을 보내기 위해서 ip나 port 정보를 사용하며, 프록시는 클러스터 내의 사용 가능한 서비스 인스턴스로 해당 요청을 포워딩하게 된다.
참고 자료 :
https://wildeveloperetrain.tistory.com/202
https://mangchhe.github.io/springcloud/2021/04/07/ServiceDiscoveryConcept/
https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/
https://www.baeldung.com/cs/service-discovery-microservices
'백엔드 > MSA' 카테고리의 다른 글
[MSA] Kafka Connect (0) | 2023.05.24 |
---|---|
[MSA] Spring Cloud Gateway (0) | 2023.05.13 |
[MSA] Spring Cloud Netflix Eureka (0) | 2023.05.11 |