정의
Client-side Service Discovery
IP / Port / Instance ID
를 가지고 있는 REST 기반의 미들웨어 서버입니다.Eureka 행동 관련
Service Registration
Service Registry
Service Discovery
Eureka 구성 요소 관련
Eureka Client
Eureka Service
Eureka Server
서비스 인스턴스의 네트워크 위치를 찾고 로드밸런싱하는 역할을 클라이언트가 담당합니다.
서비스 인스턴스는 시작될 때 자신의 네트워크 주소를 서비스 레지스트리(Service Registry) 에 등록하고, 서비스 레지스트리는 각 서비스 인스턴스의 상태를 계속해서 체크합니다.
클라이언트는 서비스 레지스트리에 등록된 인스턴스 중 하나를 골라서 요청을 보내는 방식으로 로드 밸런싱(Load Balancing) 이 이루어집니다. 그리고 인스턴스가 종료되면 서비스 레지스트리에 등록된 정보는 삭제됩니다.
Netflix OSS가 클라이언트 사이드 디스커버리 패턴의 좋은 예입니다. Netflix Eureka는 서비스 레지스트리로 서비스 인스턴스의 등록과 가용한 인스턴스를 찾는 REST API를 제공합니다. 그리고 Netflix Ribbon은 Eureka와 같이 동작하는 IPC 클라이언트로 가능한 서비스 인스턴스 간 로드 밸런싱을 해줍니다.
클라이언트 사이드 디스커버리는 Service Client가 Service Registry에서 직접 서비스의 위치를 찾아서 호출하는 방식인 반면에 서버 사이드 디스커버리는 일종의 Proxy 서버인 로드 밸런서로 요청을 먼저 보냅니다. 그리고 로드 밸런서는 Service Registry를 조회해서 가용한 인스턴스를 찾고 그 중 선택해서 요청을 라우팅하는 방식입니다. Service Registry에 등록되는 방식은 클라이언트 사이드 디스커버리와 동일합니다.
AWS Elastic Load Balancer(ELB) 가 서버 사이드 디스커버리 패턴의 좋은 예입니다. ELB는 일반적으로 인터넷에서 들어오는 외부 트래픽을 로드 밸런싱하는 데 사용되고, VPC(Virtual Private Cloud) 에서 내부 트래픽을 처리할 때 사용되기도 합니다. 클라이언트에서 DNS 이름을 이용해 ELB로 요청을 보내면 ELB는 등록된 EC2(Elastic Compute Cloud) 인스턴스나 ECS(EC2 Container Service) 컨테이너 사이에서 부하를 분산합니다.
서비스 레지스트리는 각 서비스 인스턴스의 네트워크 위치 정보를 저장하는 데이터베이스로 항상 최신 정보를 유지해야 하며 고가용성이 필요합니다.
대표적인 서비스 레지스트리인 Netflix Eureka는 서비스 인스턴스를 등록하고 조회하는 REST 기반 API를 제공합니다. 각 서비스 인스턴스는 POST
요청으로 자신의 네트워크 위치를 등록하고 30초마다 PUT
요청으로 자신의 정보를 갱신합니다. 등록된 서비스 정보는 DELETE
요청이나 타임 아웃으로 삭제됩니다. 그리고 등록된 서비스 정보는 GET
요청으로 조회할 수 있습니다.
각 서비스는 서비스 레지스트리에 각자의 정보를 등록하고 해제해야 하는데 여기에는 두 가지 방식이 존재합니다.
1) 셀프 등록 패턴
등록과 관리를 하는 주체가 서비스인 방식입니다. 각 서비스는 서비스 레지스트리에 자신의 정보를 등록하고, 필요하다면 주기적으로 자신이 살아 있다는 신호(Heartbeat)를 계속 전송합니다. 만약 이 정보가 일정 시간이 지나도 오지 않는다면 서비스에 문제가 발생한 것으로 보고 등록이 해제됩니다. 그리고 서비스가 종료될 때는 등록을 해제합니다.
앞서 살펴본 Eureka Client가 이에 해당합니다. Spring에서는 @EnableEurekaClient
어노테이션을 이용해 쉽게 구현할 수 있습니다.
2) 써드 파티 등록 패턴
외부에서 서비스 등록을 관리하는 방법도 있습니다. 서비스 등록을 관리하는 서비스 레지스트라(Service Registrar) 를 따로 두는 것입니다. 서비스 레지스트라는 각 서비스 인스턴스의 변화를 폴링(Polling)이나 이벤트 구독으로 감지해서 서비스 레지스트리에 계속 업데이트합니다.
글 잘봤습니다~!
여러 포스트들 보고 있는데 엄청 잘 되어있는 것 같아요!
그래서 들으신 udemy 강의에도 관심이 생기는데, 전체적으로 괜찮나요? (혹시 자막도 있을까요?)