사붐이개발일기

[Spring MSA] 섹션1- Spring Cloud Netflix Eureka 본문

인프런/[Spring Cloud] MSA-이도원

[Spring MSA] 섹션1- Spring Cloud Netflix Eureka

sabeom 2023. 11. 17. 11:14

https://yunanp.tistory.com/64

 

[Spring Cloud로 개발하는 마이크로서비스] Section 1: Service Discovery

Spring Cloud Netfilx Eureka 스프링 클라우드 넷플릭스는 '스프링부트 애플리케이션'에 대한 통합 환경 구성을 지원하는 Netfilx OSS 서비스이다. Netfilx OSS의 다양한 서비스 Eureka : Disocovery Server 각각의 서

yunanp.tistory.com

 

Spring Cloud Netfilx Eureka


스프링 클라우드 넷플릭스는 '스프링부트 애플리케이션'에 대한 통합 환경 구성을 지원하는 Netfilx OSS 서비스이다.

  • Netfilx OSS의 다양한 서비스
    • Eureka : Disocovery Server
      • 각각의 서비스 인스턴스들이 동적으로 확장, 축소 되더라도  인스턴스의 상태를 하나의 서비스로 관리할 수 있는 서비스
    • Ribbon : Client Side Load Balancer
      • 트래픽을 분산시키는 기능 
    • Zuul : API Gateway
      • 각각의 마이크로서비스 종단점을 연결하는 리버스 프록시
    • Hystrix : Circuit Breaker
      • 특정 서비스가 과부하가 걸려 서비스 장애를 전파하는 특성을 해결하는 기능
    • 이외에도 다양한 서비스를 제공한다.

Netfilx - Eureka


이 중에서 `Eureka`에 대해 알아보자.

 

각 클라이언트의 설정 및 IP정보를 수동으로 구성한다면 CI/CD와 Scaling에 많은 제약사항이 생긴다.

Eureka는 서버는 등록된 서비스에 대한 상태를 다른 서버로 복제할 수 있고 서버를 구성 및 배포하여 가용성을 높히는 역할을 한다.

 

Eureka의 2가지 구성요소

  • Service Discovery
    • '등록된 서버'에서 특정 작업을 위한 서버의 위치 파악하는 작업
    • Service Discovery를 위해 Eureka Server를 사용
  • Service Registry
    • 자신의 위치(IP)정보를 특정 서버에 등록하는 작업
    • Service Registry를 위해 Eureka Client를 사용

Service Disocovery 과정

https://wonit.tistory.com/495

 

동작순서

  1. Service Registry 기능을 할 Eureka Server 가 최초에 기동된다.
  2. Service Registry 서버인 Eureka Server 에 등록될 서비스들이 기동된다. 여기서 등록된 서비스는 Eureka Client 라고 한다.
  3. Eureka 서버는 자신에게 등록된 Eureka Client 에게 30초마다 Ping을 보내며 Health Checking을 수행한다.
  4. 만약 30초마다 보내는 Heart Heat가 일정 횟수 이상으로 동작되지 않으면 Eureka Server는 해당 Client를 삭제한다.

Eureka는 서비스 위치를 등록하고 찾아주는 역할만을 담당하므로 보통 Gateway서비스나 로드밸런서와 함께 동작하게 된다.

 

하나의 서비스에 3가지 인스턴스를 사용해서 개발

 

스프링클라우드에 서비스 등록

 

서비스 디스커버리

- 요청정보에 따라서 필요한 서비스를 알려주는 역할

 

application.yml

* 서비스 디스커버리로써 Eureka 서버에 등록 (유레카서버가 웹서비스형태로 동작)

* 각각의 마이크로서비스에 고유한 역할지정 spring.application.name

* eureka.client설정 : 유레카서버에 등록할 것인지 true, false

 

여러 개의 인스턴스를 하나의 서비스에 등록하기


application.yml에 server.port 9001 port를 가지는 서버 인스턴스를 하나 실행시킨다.

 

다른 하나를 실행시킬 때 인텔리제이 실행에서는 포트번호가 겹치므로 edit configuration을 통해 VM options에 '-Dserver.port=9002'를 넘겨준다. 그러면 9002 포트로 정상작동된다.

외부에서 User-service로 요청이오면 Discovery 서비스 안에서 살아있는 인스턴스 알맞은 인스턴스로 분산되어 실행되게 된다.

 

터미널에서 mvn으로 실행

$> mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'

터미널에서 빌드 후 실행

$> mvn compile package

빌드된 jar파일

$> java -jar -Dserver.port=9004 ./target/user-service-0.0.1-SNAPSHOT.jar

하나의 서비스에 인스턴스 4개가 실행되고 있다.

그런데 이렇게 하나씩 포트를 설정해가며 실행하는 것은 매우 불편하다.

 

스프링에서 지원하는 랜덤포트를 사용해보자.

server:
  port: 0

0번은 랜덤포트를 사용하겠다는 의미.

이렇게 설정하면 각각의 인스턴스 실행 시 랜덤으로 port번호를 할당하게 된다.

하지만 Eureka를 확인해보면 여러 인스턴스를 실행해도 포트 0번만 보인다.

이것은 Eureka가 yml파일에 있는 포트 설정번호로 인스턴스를 인식하기 때문이다.

 

따라서, 우리는 yml파일에 추가적인 인스턴스 정보를 넣어줘야만 한다.

eureka:
  instance:
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}

위 코드를 추가해주면 Eureka 각각의 인스턴스를  해당 id로 인식하게 된다.