Search

[MSA] Service Discovery

Tags
MSA
Date
2024/06/17

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
복사