Search

[MSA] Service Discovery

Status
UPLOADING
Date
2024/06/17
Tags
MSA

1. 개요

MSA에 대한 학습을 진행하기에 앞서 알아야 하는 중요 개념인 Service Discovery에 대해서 알아보도록 하겠습니다.

2. Service Discovery란

외부에서 다른 서비스들이 마이크로 서비스를 검색하기 위해서 사용되는 개념입니다.
MSA로 서비스를 구축하게 되면 수 많은 서버가 생성됩니다. 각각의 서버는 IP를 가지고 있습니다. 문제는 클라우드 환경에서 각 서버의 IP가 동적으로 바뀌게 되고, 이를 수동으로 추적하기는 매우 어렵습니다. 따라서 Service Discovery에 서버를 등록하고 검색하여 마이크로 서비스 간 통신을 가능하게 해줍니다.
Spring에서는 대표적으로 Spring Eureka를 사용하여 Service Discovery 작업을 진행할 수 있습니다.

3. hands-on

3-1. Service Discovery

실습을 한번 해보겠습니다. 스프링 프로젝트를 하나 만들고 build.gradle에 다음 의존성을 추가해줍니다. build.gradle
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
Plain Text
복사
SpringMsaApplication.java
@SpringBootApplication @EnableEurekaServer public class SpringMsaApplication { ... }
Plain Text
복사
Eureka 서버 역할을 하기 위해서는 어플리케이션을 서버의 자격으로서 등록을 해주어야 합니다. 위의 @EnableEurekaServer 어노테이션을 붙여주게 된다면 Spring Boot가 초기 가동되면서 해당 정보를 읽고 Service Discvoery 로서 어플리케이션을 가동합니다.
application.yml
server: port: 8761 spring: application: name: spring-msa eureka: client: register-with-eureka: false fetch-registry: false
YAML
복사
기본적인 .yml 설정파일의 구성이며 register-with-eurekafetch-registryfalse로 설정함으로써 자기 자신을 Service Discovery에 등록하는 것을 방지하였습니다.
이 상태에서 어플리케이션 실행 후 http://localhost:8761 로 접속하면 다음과 같은 화면을 확인할 수 있습니다.
위 화면은 대시보드로서 등록된 인스턴스와 관련된 정보들을 확인할 수 있습니다.

3-2. Client 서버

다음으로 Client 서버를 만들어보겠습니다. 새로운 스프링 프로젝트를 생성하고 의존성은 다음을 추가해줍니다.
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-web'
Plain Text
복사
그리고 Application 클래스에 @EnableDisvoceryClient를 추가해줍니다. UserServiceApplication.java
@SpringBootApplication @EnableDiscoveryClient public class UserServiceApplication { ... }
Java
복사
이후 두 프로젝트를 동시에 실행하면 Service Discovery에 user-service가 등록된 것을 확인할 수 있습니다.
3-2-1. 다른 포트 번호로 실행하기
상단의 Edit Configurations를 클릭하고
add VM Option에 -Dserver.port = 9002를 넣어주면, 다른 포트번호로 똑같은 서버가 실행되게 됩니다.
결과는 다음과 같습니다.

3-3. 로드 밸런서

매번 인스턴스를 가동할 때 마다 포트 번호를 변경하는 것은 귀찮은 작업입니다. 우리는 스프링 부트에서 지원해주는 랜덤 포트 기능을 사용하여 이를 간편화 할 수 있습니다.
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: fetch-registry: true register-with-eureka: true service-url: defaultZone: <http://127.0.0.1:8761/eureka/>
YAML
복사