본문 바로가기

Spring Cloud

🌱 Spring Cloud - Service Discovery (Netflix Eureka) 🌱

Github 소스코드

Service Discovery ?

  • 보통의 경우 한 서비스에서 다른 서비스를 호출할 때 IP와 Port정보를 이용하여 해당 서비스를 식별하여 요청한다. 하지만 클라우드 환경에서는 IP와 Port정보가 Auto-scaling 등으로 인해 동적으로 바뀌게 된다. 그렇기 때문에 해당하는 서비스를 식별할 수 있는 다른 방법이 필요하다.
  • Service Discovery는 서비스의 위치와 가용 상태 등을 관리하여 클라이언트 서비스가 요청할 서비스를 식별 가능토록 한다.

Service Discovery의 종류

  • Client Side Discovery
    • 생성된 서비스는 Service Registry에 서비스를 등록되고, 서비스를 사용할 클라이언트는 Service Registry에서 서비스의 위치를 찾아 호출하는 방식이다.
  • Server Side Discovery
    • 서비스를 사용할 클라이언트와 Service Registry 사이에 Load Balancer를 두는 방식이다.
    • 클라이언트는 Load Balancer에 서비스를 요청하고 Load Balancer가 Service Registry에 호출할 서비스의 위치를 질의하는 방식이다.

Eureka Server

  • 실습환경
    • Spring boot 2.4.x
    • Spring cloud 2020.0.0
    • Dependency
      • Eureka Server
  • Springboot main클래스에 @EnableEurekaServer 설정
  • .yml or .properties 설정
  • 위 설정을 마치고 Springboot main메서드를 실행하고 해당 포트로 이동하면 Eureka Dashboard를 확인할 수 있다.

Test Service 작성

실습환경

  • Spring boot 2.5.0
  • Spring cloud 2020.0.3
  • Eureka Discovery Client
  • Spring web
  • .yml or .properties 설정
  • Test Service 실행 후 Eureka Server에 등록된 것을 확인

다양한 서버 구동 방법을 통한 여러 개 서비스 인스턴스 등록

방법 1 - IDE사용 (intellij Ultimate)

  • Run/Debug Configurations
  • 아래와 같이 설정
  • 각각 실행
  • Eureka Server에 2개 인스턴스가 등록된 것을 확인

방법 2 - Maven명령어 사용

  • mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=8082'

방법 3 - 컴파일 후 jar파일 실행

  • mvn clean compile package
    • 프로젝트 폴더에 target폴더가 생성
  • target폴더의 jar파일 실행
    • java -jar -Dserver.port=8082 ./target/project_name.jar

Random Port

여러 방식을 통해 프로젝트를 수행해보았다. 하지만 매번 실행마다 포트를 설정해주어야 하는 불편함이 있다.

  • spring이 제공해주는 random port기능을 이용해보자.
  • .yml or .properties 설정
    • 포트번호를 0으로 설정한다.
  • 두 개 인스턴스 등록
    • 첫 번째 서비스는 IDE에서 실행
    • 두 번째 서비스는 mvn명령어를 통해 실행
      • mvn spring-boot:run
      • 포트 번호를 따로 설정해주지 않아도 된다.
  • 등록된 인스턴스 확인
    • 등록된 인스턴스에 마우스 커서를 올리면 왼쪽 하단에 랜덤화된 포트번호를 확인 할 수 있다.