티스토리 뷰

Spring/Spring Cloud

[MSA] Service Discovery

woo'^'chang 2022. 7. 6. 15:32

Service Discovery

Microservice Architecture에서 각각의 서비스들은 마이크로서비스로 분리되어 있고 IPPort로 구분할 수 있습니다. 클라이언트의 요청에 알맞은 서비스를 제공하기 위해 구분된 서비스 정보들을 저장하고 관리하는 관리자 역할을 Service Discovery가 수행합니다.

Spring Cloud Netflix

넷플릭스는 MSA로의 전환을 통해 많은 경험을 가지게 되었는데 이 경험을 OSS(Open Source Software)로 공개했습니다. 클라우드 환경에 특화된 프레임워크인 Spring Cloud에도 많은 넷플릭스 OSS가 통합되어 있는데 그 중 Spring Cloud Netflix Eureka에 대해서 알아보고자 합니다.

Spring Cloud Netflix Eureka

Service Discovery 구성을 위해서는 기본적으로 아래의 마이크로서비스가 구현되어야 합니다.

  • Eureka Server
    • 마이크로서비스 인스턴스 정보를 동적으로 관리하기 위한 Service Discovery Server입니다.
  • Eureka Client
    • Eureka Server에 저장되어 관리될 마이크로서비스를 의미합니다.

새로운 인스턴스는 Eureka Server에 등록될 때 자신의 IP, Host, Port 등의 정보를 스스로 전달하기 때문에 받은 정보를 바탕으로 일정한 간격으로 상태를 확인하며 인스턴스를 관리합니다. 이러한 정보 제공으로 인해 Server측에서는 확장 시 IP 관리 부담이 필요하지 않게 되었습니다.

 

인스턴스를 등록하고자 한다면 Eureka Server 정보만 입력하면 되고, 다른 서비스를 호출하고자 한다면 Eureka Server에 등록된 인스턴스 정보만 확인하면 됩니다. 수평 확장적인 부분에서 편리함을 알 수 있습니다.

실습

Eureka Server

Spring 프로젝트를 생성할 때 Spring Cloud Discovery Eureka Server 의존성을 추가해줍니다. Spring Boot 버전마다 사용가능한 Spring Cloud 버전이 다르므로 확인이 필요합니다.

 

프로젝트를 생성하면 main 폴더의 생성한 패키지 경로에 @SpringBootApplication이 붙은 Application 파일이 존재합니다. 이 애플리케이션이 Eureka Server임을 알려주는 @EnableEurekaServer 어노테이션을 추가합니다.

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

추가로 몇 가지 설정이 더 필요합니다. 프로젝트의 Root 경로에 application.yml 파일을 추가한 뒤, 아래의 코드를 작성합니다.

server:
  port: 8761

spring:
  application:
    name: discoveryservice

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  • server.port : 서비스가 실행될 포트 번호를 지정합니다.
  • spring.application.name : 서비스의 고유한 이름을 지정합니다.
  • eureka.client.register-with-eureka : Eureka Server는 서비스를 등록하는 Service Registry의 역할을 수행하는데 레지스트리에 등록할지를 결정합니다. 기본값은 true입니다.
  • eureka.client.fetch-registry : 레지스트리에 있는 정보를 가져와 로컬에 캐시를 수행할지를 결정합니다. 다시 말해서 레지스트리 정보를 주기적으로 가져올지를 결정합니다. 기본값은 true입니다.

설정을 완료한 뒤 서버를 가동하고 지정해둔 포트 번호로 접속하면 다음과 같은 화면을 확인할 수 있습니다. 시스템 상태, Eureka Server에 등록된 인스턴스, 각종 정보 등을 담고 있습니다. 다음으로 Eureka Server에 등록할 서비스를 만들어보도록 하겠습니다.

Eureka Client

Spring 프로젝트를 생성할 때 Spring Cloud Discovery Eureka Discovery Client 의존성을 추가해줍니다. 등록하고자 하는 서비스의 종류에 따라 추가로 의존성을 추가해줍니다. 저는 Spring Boot DevTools, Lombok, Spring Web 의존성을 추가하였습니다.

 

프로젝트를 생성하면 main 폴더의 생성한 패키지 경로에 @SpringBootApplication이 붙은 Application 파일이 존재합니다. 이 애플리케이션이 Eureka Client임을 알려주는 @EnableDiscoveryClient 어노테이션을 추가합니다.

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceApplication.class, args);
    }

}

@EnableEurekaClient 어노테이션도 존재하지만, 위의 어노테이션이 Client 규격에 해당하는 어노테이션이라고 합니다.

EurekaClient도 마찬가지로 추가적 설정이 필요합니다. main/resources 경로에 application.yml 파일을 생성 후 아래의 내용을 작성합니다.

server:
  port: 0

spring:
  application:
    name: user-service

eureka:
  instance:
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
  • server.port : 서비스가 실행될 포트 번호를 지정합니다.
    • 0번으로 지정 시 인스턴스 실행마다 랜덤한 포트 번호가 할당됩니다.
  • spring.application.name : 서비스의 고유한 이름을 지정합니다.
  • eureka.instance.instance-id : 서비스 레지스트리에 등록될 인스턴스의 ID를 설정합니다.
  • eureka.client.register-with-eureka : Eureka Server는 서비스를 등록하는 Service Registry의 역할을 수행하는데 레지스트리에 등록할지를 결정합니다. 기본값은 true입니다.
  • eureka.client.fetch-registry : 레지스트리에 있는 정보를 가져와 로컬에 캐시를 수행할지를 결정합니다. 다시 말해서 레지스트리 정보를 주기적으로 가져올지를 결정합니다. 기본값은 true입니다.
  • eureka.client.service-url.defaultZone : Eureka Client가 등록될 서버 주소를 설정합니다.

실행 시마다 포트 번호가 다르게 할당되기에 여러 개 실행시켜 Eureka Server에 잘 등록되는지 확인해보도록 하겠습니다.

방법 1

사진에 보이는 실행 버튼을 눌러 애플리케이션을 실행합니다.

방법 2

Edit Configurations를 클릭합니다.

해당 Application의 Configurations를 복사하여 위와 같은 방법으로 실행합니다.

방법 3

mvn spring-boot:run

해당 프로젝트의 Root 경로에서 다음 명령어를 입력하여 실행합니다.

방법 4

mvn clean

mvc compile package

java -jar ./target/user-service-0.0.1-SNAPSHOT.jar

별도의 Shell을 이용해 프로젝트의 Root 경로로 이동 후 다음과 같은 순서로 명령어를 입력하여 실행합니다.

  • mvn clean : 빌드 정보를 초기화합니다.
  • mvn compile package : 컴파일과 패키징을 수행합니다. target 디렉토리가 생성되고 하위에 프로젝트의 jar 파일이 생성됩니다.
  • java -jar : jar 파일을 실행합니다.

위에 설명해 드린 방법을 통해 4개의 인스턴스를 실행시켰으므로 Eureka Server에 4개의 인스턴스가 정상적으로 등록된 것을 확인할 수 있습니다. Status에 보이는 명칭은 eureka.instance.instance-id를 통해 설정한 이름입니다.

마치며

여러 개의 서비스를 어떻게 관리할까 하는 궁금증으로 MSA 공부를 시작하게 되었습니다. 지금까지 진행했던 프로젝트 모두 단일 프로젝트 안에 모든 서비스가 존재했기에 프로젝트의 복잡성을 제대로 관리하지 못했던 것 같습니다. 아직은 MSA의 첫 발걸음을 내디딘 단계이지만 추후에는 프로젝트를 하더라도 MSA를 적극적으로 제안할 수 있도록 학습을 이어갈 예정입니다.

참고

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

'Spring > Spring Cloud' 카테고리의 다른 글

마이크로서비스 아키텍처  (0) 2022.06.20
클라우드 네이티브 아키텍처  (0) 2022.06.18
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Total
Today
Yesterday