Backend/Spring Cloud

[MSA] 마이크로서비스 Service Discovery

_은선_ 2024. 7. 6. 01:59
728x90
SMALL

[Spring Cloud Netflix Eureka]

[그림 설명]

  • 하나의 마이크로서비스가 3가지 인스턴스에 의해 확장돼서 개발되는 경우
  • 일종의 로드밸런서 역할을 하는 것처럼 부하 분산 처리가 돼있다고 가정
  • 보유하고 있는 노트북/PC가 한 대일 경우에는 여러 개의 서비스를 동시에 실행하기 위해 반드시 포트를 나눠서 실행 → 하나의 IP일 경우에는 포트를 분산시켜 실행
  • 가용할 수 있는 IP가 여러개일 경우에는 포트를 분산시킬 필요 X

Service Discovery란?

  • Spring Cloud Netflix Eureka가 하는 역할 : Service Discovery
  • Service Discovery란 외부의 서비스들이 마이크로서비스를 검색하기 위해 사용되는 개념으로, 각각의 마이크로서비스가 어디에 저장돼있으며 요청 정보가 들어왔을 때 해당 요청 정보에 따라 필요한 서비스의 위치를 알려주는 역할
  • key-value 형태로 정보 저장 → 어떠한 서비스가 어느 위치에 있는지 등록하고 있는 정보
  • 서비스 등록, 검색과 관련된 작업 수행

Spring Cloud Netflix Eureka

  • 넷플릭스 회사가 가진 자사의 클라우드 기술들을 스프링 재단에 기부해서 사용할 수 있는 서비스
  1. 각각의 마이크로서비스가 자신의 위치 정보를 Spring Cloud Netflix Eureka 서버에 등록 작업 먼저 수행
  2. 마이크로서비스를 사용하고 싶은 클라이언트는 제일 먼저 자신이 필요한 요청 정보를 로드밸런서나 API Gateway에 전달
  3. 요청 정보가 서비스 디스커버리에 전달 → 내가 필요한 서비스의 서버 위치를 클라이언트에게 반환

EcommerceDiscoveryService

  • 마이크로 서비스인 사용자 서비스, 상품 서비스, 주문 서비스를 가지고 있는 아주 간단한 온라인 쇼핑몰 e-commerce를 만드는 예제

EcommerceApplication.java

@SpringBootApplication

  • 스프링 부트가 가진 모든 클래스 중에서 @SpringBootApplication라는 어노테이션을 검색 후 해당 어노테이션이 있는 파일 실행

@EnableEurekaServer

  • 우리가 만드는 스프링 부트 프로젝트가 유레카 서버 역할을 하기 위해서는 해당 프로젝트를 유레카 서버 자격으로 등록 필요
  • Service Discovery로서 프로젝트를 기동한다는 의미

application.yml (or application.properties)

port 번호

  • 유레카 서버가 웹 서비스의 성격으로서 기동 됨으로써 포트 번호 지정

name

  • 각각의 마이크로서비스에 고유한 아이디 부여 필요 → 아이디의 역할로 애플리케이션 네임 정보를 등록

유레카 클라이언트

  • 유레카 라이브러리가 포함된 채 스프링부트가 기동이 되면 기본적으로 유레카 클라이언트 역할로서 어딘가에 등록 작업 시도
  • register-with-eureka: true
    fetch- registry: true
    → 자신의 정보를 자신한테 등록하는 의미 없는 작업을 하게 됨

[User Service - 프로젝트 생성]

  • 앞서 만든 discoveryservice를 Eureka 서버로서 구동
  • userservice를 위의 Eureka 서버(discoveryservice)의 클라이언트로서 구동
    • UserServiceApplication을 port 번호 9001으로 하여 구동
    • UserServiceApplication-2을 port 번호 9002으로 하여 구동
      1. application.yml에 9001라고 작성된 port 번호를 9002라고 변경하는 방법 O
      2. Edit Configurations을 눌러 spring application을 실행할 시 실행 명령어를 변경하여 port 번호를 변경하는 방법
        • -Dserver.port=9002
      3. command line에서 maven 명령어를 사용하여 userservice 프로젝트를 직접 실행하는 방법
        • mvn spring-boot:run -Dspring-boot.run.jvmArguments=’-Dserver.port=9003
      4. java jar 파일을 이용하여 직접 실행하는 방법
        • mvn compile package (컴파일 하고 패키지 만들기)
        • java -jar -Dserver.port=9004 ./target/user-service-0.0.1-SNAPSHOT.jar
  • 만약 외부에서 클라이언트 요청이 userservice로 전달된다면, discoveryservice 안에서 9001번/9002번 port로 전달할지, 어떠한 인스턴스가 살아있는지의 정보 값을 gateway나 라우팅 서비스에 전달
  • 2가지 마이크로서비스에 의해 분산된 서비스가 실행되게 됨.

[User Service - Load Balancer]

서버의 포트번호를 직접 변경하는 방법의 대안

위의 4가지 방법처럼 서버의 포트 번호를 매번 변경하는 일은 굉장히 수고스러운 작업이다.

 

랜덤 포트 사용하기

  • server.port = 0으로 지정하면 랜덤 포트를 사용하겠다는 의미
  • 같은 서비스가 실행된다 하더라도 매번 실행될 때마다 포트의 번호가 랜덤하게 할당
  • 랜덤 포트를 사용하면 여러 서비스를 동시에 실행 가능

→ 스케일링 작업을 하기 위해 userservice를 실행할 때마다 자동으로 포트가 부여되고, 사용자들한테 인식할 수 없는 상태에서 여러 개의 인스턴스가 만들어짐. 각각의 인스턴스들은 Eureka 서비스 즉, discovery 서비스에 잘 등록됨 (라우팅 서비스와 게이트웨이에 의해 필요한 작업을 호출할 수 있는 상태) → 부하분산, 로드 밸런싱 구현

 

다음 포스팅에서는 유레카 서비스에 있는 각각의 정보들을 실제로 라우팅하고, 해당하는 서비스로 정확하게 이동하기 위해 API Gateway를 어떻게 연동하면 좋은지 알아보겠다.



728x90
LIST