인생을 코딩하다.

[MSA] Spring cloud 적용에 사용되는 컴포넌트 중 하나인 Eureka 본문

Spring

[MSA] Spring cloud 적용에 사용되는 컴포넌트 중 하나인 Eureka

Hyung1 2021. 10. 28. 15:53
728x90
반응형

저번 글에서는 MSA에 관한 글을 작성했었습니다. 이번 글에서는 각기 다른 IP / Port/ instanceId를 가지고 있는 MicroService(인스턴스서버)들의 정보를 레지스트리에 등록할 수 있게 하고, MicroService의 동적인 탐색과 로드밸런싱을 할 수 있게 도와주는 Spring Cloud 적용에 사용되는 컴포넌트 중 하나인 Eureka에 관해 알아보도록 하겠습니다.

Spring cloud(스프링 부트 + 넷플릭스 OSS)란 무엇일까요?

넷플릭스 OSS를 더 쉽게 쓸 수 있도록 스프링 진영의 피보탈에서는 기존의 스프링 부트 프레임워크에서 잘 돌아갈수 잇도록 넷플릭스 OSS 모듈들을 스프링 프레임워크로 감싸서 스프링 클라우드라는 명칭으로 발표했습니다.

비즈니스가 성장하면서 MicroService의 개수가 증가할수록 관리는 복잡해지고 어려워집니다. 이러한 문제는 Spring Cloud를 적용하여 해결할 수 있습니다.

Spring Cloud란 분산 시스템에서 공통적 패턴(구성 관리, 서비스 검색, 지능형 라우팅, 마이크로 프록시 등)을 모아 신속하게 구축할 수 있는 도구를 스프링 라이브러리 형태로 제공한 것을 의미합니다.

Spring Cloud는 스프링 프레임워크를 개발하고 있는 피보탈에서 넷플릭스가 공개한 줄, 유레카, 히스트릭스, 리본 등의 넷플릭스 오픈소스를 스프링 부트 프레임워크 기반으로 사용하기 쉽게 통합한 것입니다.


Spring Cloud는 아래와 같은 기능 목록을 가지고 있습니다.

이번 글은 Spring Cloud의 Eureka에 관해 알아보도록 하겠습니다.

Eureka란 무엇이고, 왜 사용할까?

클라이언트가 마이크로서비스를 호출하기 위해서는 최적 경로를 찾아주는 라우팅 기능이 제공돼야 합니다. 라우터는 최적 경로를 탐색하기 위해 서비스 명칭에 해당하는 IP 주소를 알아야 합니다. 그런데 이러한 라우팅 정보를 클라이언트가 가지고 있으면 클라우드 환경에서 동적으로 변경되는 백엔드의 유동 IP 정보를 매번 전송받아 변경해야합니다.

따라서, 제3의 공간에서 이러한 정보를 관리하는 것이 좋습니다. 즉, 백엔드 마이크로서비스 서비스의 명칭과 유동적인 IP 정보를 매핑해서 보관할 저장소가 필요합니다. 넷플릭스 OSS의 유레카(Eureka)가 그 기능을 담당하고, 이러한 패턴을 서비스 레지스트리 패턴이라고 합니다.

Spring cloud에 속해 있는 Spring Cloud Netflix의 Eureka의 동작 방식

마이크로서비스들의 정보를 레지스트리에 등록할 수 있도록 하고 마이크로서비스의 동적인 탐색과 로드밸런싱을 제공하는 서버 입니다.


먼저 Eureka는 Eureka Server와 Eureka Client로 구성됩니다. Eureka Server는 Eureka Client에 해당하는 마이크로 서비스들의 상태 정보가 등록되어 있는 레지스트리를 갖습니다.

Eureka Client의 서비스가 시작 될 때 서비스 레지스트리(Eureka Serve)에 자신의 서비스 이름과 할당된 IP 주소를 등록합니다.

만약 등록이 되고나서 30초마다 레지스트리에 ping을 전송하여 자신이 가용 상태임을 알리는데, 일정 횟수 이상 ping이 확인되지 않으면 Eureka Server에서 해당 서비스를 레지스트리에서 제외시킵니다.

레지스트리의 정보는 모든 Eureka Client에 복제되어 있어 필요할 때마다 가용 상태인 모든 서비스들의 목록을 확인할 수 있고 이 목록은 30초마다 갱신됩니다. 가용 상태의 서비스 목록을 확인할 경우에는 서비스의 이름을 기준으로 탐색하며 로드밸런싱을 위해 내부적으로 Ribbon(클라이언트 측의 로드밸런서)을 사용합니다.

그 다음 클라이언트가 해당 서미스명을 호출할 때 라우터가 레지스트리 서비스를 검색해 해당 서비스의 이름과 매핑된 IP 정보를 확인후 호출합니다. 이 레지스트리 서비스는 모든 마이크로서비스의 인스턴스 주소를 알고 있는 서비스 매핑 저장소가 됩니다. 모든 마이크로 서비스가 처음 기동할 때 자신의 위치 정보를 저장하고 서비스가 종료될 때 위치 정보가 삭제됩니다.

서비스 레지스트리(Eureka Serve)에는 업무 처리를 위한 마이크로서비스 뿐만 아니라 관리와 운영을 위한 기반 서비스와 주소도 함께 보관합니다. 예를들면, config 서비스, 모니터링 서비스, 추적 서비스도 모두 이름을 가지고 있기 때문에 주소를 가지고 있어야 합니다.

Eureka Server에 인스턴스 서버를 등록해 보도록 하겠습니다.

 

상품, 주문, 유레카 서버가 있다고 가정하고 유레카 서버에 인스턴스 서버를 등록해보도록 하겠습니다.


유레카 서버의 build.gradle에 아래의 dependency를 추가합니다.

implementation("org.springframework.cloud:spring-cloud-starter-netflix-eureka-server")

Eureka 서버의 EurekaServerApplication에 @EnableEurekaServer 어노테이션을 적용합니다.

@EnableEurekaServer // @EnableEurekaServer를 추가합니다.
public class EurekaServerApplication {

    public static void main(String[] args) {

        SpringApplication.run(ProductServiceApplication.class, args);
    }

}

그 후 상품 서버의 build.gradle에 아래의 dependency를 추가합니다.

implementation("org.springframework.cloud:spring-cloud-starter-netflix-eureka-client")

product 서버의 ProductServiceApplication에 @EnableEurekaClient 어노테이션을 적용합니다.

@EnableEurekaClient // @EnableEurekaServer를 추가합니다.
public class ProductServiceApplication {

    public static void main(String[] args) {

        SpringApplication.run(ProductServiceApplication.class, args);
    }

}

기본적으로 인스턴스 서버를 등록할 때 hostname으로 등록이 되기 떄문에 application.yml에 아래와 같이 작성하여 줍니다. 아래와 같이 작성했을 경우 hostname 대신 자신의 ip adress를 사용하여 등록하게 됩니다.

eureka:
  instance:
    prefer-ip-address: true

주문 서버도 위와 같이 유레카 서버의 인스턴스 서버로 등록해줍니다.

 

구동한 후에 유레카 서버를 구동하고 로컬호스트/8761을 실행해보면 아래와 같은 화면이 나타나게 됩니다.

정리

  • @EnableEureka / @EnableEurekaClient를 통해 서버 구축, 클라이언트 Enable이 가능합니다.
  • @EnableEurekaClient를 붙인 Application은 Eureka 서버로 부터 남의 주소를 가져오는 역할고 ㅏ자신의 주소를 등록하는 역할 둘 다 수행 가능합니다.
  • Eureka Client가 Eureka Server에 자신을 등록할 떄 'sppring.application.name'이 이름으로 사용합니다. 

 

이번 글은 Spring Cloud의 Eureka에 관해 글을 작성해보았습니다. 다음 글은 "MSA의 BFF 패턴, 외부 구성 저장소 패턴, 인증 인가 패턴이란?" 주제로 글을 작성해보도록 하겠습니다. 감사합니다.

728x90
반응형
Comments