[Spring Boot & MSA] Eureka Service Discovery(1)

원알렉스·2020년 8월 6일
2

Spring Boot MSA

목록 보기
1/12
post-thumbnail

깃허브 소스코드
Udemy 강의

🚀 Eureka 개요

정의

  • Client-side Service Discovery
  • Eureka는 주소가 동적으로 변하는 AWS와 같은 Cloud 시스템 환경에서 클라이언트가 서비스 인스턴스를 호출할 수 있도록 각 서비스들의 IP / Port / Instance ID 를 가지고 있는 REST 기반의 미들웨어 서버입니다.
  • 즉, Service Registry를 제공하고 관리해주는 서비스입니다.

✔ Eureka 용어 정리

Eureka 행동 관련

  • Service Registration

    • 서비스가 자기 자신의 정보를 Eureka 서버에 등록하는 행동
  • Service Registry

    • 등록된 서비스들의 정보 목록
  • Service Discovery

    • 서비스 클라이언트가 요청을 보내고자 하는 대상의 정보를 Service Registry를 통해 발견하는 과정

Eureka 구성 요소 관련

  • Eureka Client

    • 서비스들의 위치 정보를 알아내기 위해 Eureka에 정보를 요청하는 서비스
  • Eureka Service

    • Eureka Client에 의해 발견의 대상이 되도록 Eureka에 등록을 요청한 서비스
  • Eureka Server

    • Eureka Service가 자기 자신을 등록(Service Registration)하는 서버이자, Eureka Client가 등록된 서비스 목록(Service Registry)를 요청하는 서버

✔ 클라이언트 사이드 디스커버리

서비스 인스턴스의 네트워크 위치를 찾고 로드밸런싱하는 역할을 클라이언트가 담당합니다.

서비스 인스턴스는 시작될 때 자신의 네트워크 주소를 서비스 레지스트리(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 요청으로 조회할 수 있습니다.

✔ 서비스 등록

각 서비스는 서비스 레지스트리에 각자의 정보를 등록하고 해제해야 하는데 여기에는 두 가지 방식이 존재합니다.

  • 셀프 등록 패턴 (Self Registration Pattern): 서비스 스스로 등록을 관리
  • 써드 파티 등록 패턴 (3rd Party Registration Pattern): 제 3의 시스템에서 등록을 관리

1) 셀프 등록 패턴

등록과 관리를 하는 주체가 서비스인 방식입니다. 각 서비스는 서비스 레지스트리에 자신의 정보를 등록하고, 필요하다면 주기적으로 자신이 살아 있다는 신호(Heartbeat)를 계속 전송합니다. 만약 이 정보가 일정 시간이 지나도 오지 않는다면 서비스에 문제가 발생한 것으로 보고 등록이 해제됩니다. 그리고 서비스가 종료될 때는 등록을 해제합니다.

앞서 살펴본 Eureka Client가 이에 해당합니다. Spring에서는 @EnableEurekaClient 어노테이션을 이용해 쉽게 구현할 수 있습니다.

2) 써드 파티 등록 패턴

외부에서 서비스 등록을 관리하는 방법도 있습니다. 서비스 등록을 관리하는 서비스 레지스트라(Service Registrar) 를 따로 두는 것입니다. 서비스 레지스트라는 각 서비스 인스턴스의 변화를 폴링(Polling)이나 이벤트 구독으로 감지해서 서비스 레지스트리에 계속 업데이트합니다.

References

profile
Alex's Develog 🤔

3개의 댓글

comment-user-thumbnail
2021년 3월 2일

글 잘봤습니다~!
여러 포스트들 보고 있는데 엄청 잘 되어있는 것 같아요!
그래서 들으신 udemy 강의에도 관심이 생기는데, 전체적으로 괜찮나요? (혹시 자막도 있을까요?)

2개의 답글