1. Service Discovery
1-1 Service Discovery 등장 배경
마이크로서비스 아키텍처에서는 서비스가 개별적으로 배포되고 실행되는데, 이 과정에서 다음과 같은 문제가 발생하게 됩니다.
- 컨테이너나 서버가 동적으로 시작되고 종료되면 IP주소나 포트가 변경될 수 있다.
- 동일한 서비스를 여러 인스턴스로 확장하면 각 인스턴스를 어떻게 연결할지 관리가 필요하다.
- 클라우드 기반 환경에서 서비스가 자동으로 추가되거나 제거되는 일이 빈번히 발생한다.
위와 같이 IP, Port의 변경이 잦거나 서비스가 확장될 때마다 API Gateway나 Load Balancer의 설정 정보를 수동으로 업데이트하는 것은 상당한 불편함을 야기합니다.
이런 불편함을 해결하기 위해 Service Discovery 패턴이 등장하게 됩니다.
1-2 Service Discovery란?
Service Discovery는 어느 서버가 어디에 위치해 있는지 등록하고 요청이 들어올 경우 해당 요청을 어디로 보낼지 알려주는 역할을 합니다. Service Discovery는 아래와 같은 3가지 주요 요소로 구성됩니다.
1. 서비스 레지스트리 (Service Registry)
- 서비스와 인스턴스 정보를 저장하는 데이터베이스 역할을 한다.
- 자신의 이름, IP주소, 포트 번호 등을 등록하고 이 레지스트리를 조회하며 다른 서비스에 연결한다.
2. 서비스 등록 및 제거
- 서비스가 직접 레지스트리에 등록한다.
- 별도의 서비스가 레지스트에 등록을 관리한다.
3. 서비스 조회
- 클라이언트 측 조회(Client-Side Discovery) : 클라이언트가 직접 레지스트리를 조회하고 서비스에 연결한다.
- 서버 측 조회(Server-Side Discovery) : 클라이언트가 로드 밸런서에 요청을 보내고 로드 밸런서가 서비스 레지스트리를 쿼리해 사용 가능한 서비스 인스턴스로 요청을 라우팅한다.
이러한 서비스 디스커버리 패턴 구성요소를 구현하면
각 서비스의 위치 정보는 서비스 레지스트리에 저장되게 되며
요청을 보내는 클라이언트는 Service Dsicovery를 통해 서비스 위치를 질의함으로
적절한 서비스 인스턴스에 요청을 보낼 수 있는 것입니다.
이를 통해 IP와 포트같은 위치정보가 동적으로 변경되더라도 효율적으로 서비스 통신이 가능하게 됩니다.
2. Eureka 라이브러리를 사용해 Service Discovery 구현하기
지금까지 Service Discovery에 대해 알아보았습니다.
지금부터는 스프링에서 자주 사용되고 있는 Eureka 라이브러리를 사용해 Service Discovery를 구현해보도록 하겠습니다. 최종 목표와 흐름은 아래와 같습니다.
1. 각 서비스는 위치 정보를 Eureka Server에 등록한다.
2. 클라이언트가 요청을 보내면 게이트웨이는 요청정보를 Eureka Server에 전달한다.
3. Eureka Server는 해당 요청의 서비스 위치를 레지스트리에서 찾아 알려준다.
4. API Gateway는 전달받은 위치를 통해 요청을 보낸다.
지금부터는 본격적으로 Eureka Server를 구현해보도록 하겠습니다.
2-1 discovery-service 모듈 생성하기
Eureka Server 구성을 위해 새로운 모듈을 추가해줍니다.
2-2 Eureka Server 의존성 추가하기
위 단계에서 의존성을 깜빡하고 추가하지 않았다면 build.gradle에 아래와 같은 의존성을 추가해줍니다.
ext {
set('springCloudVersion', "2023.0.5")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
2-3 Eureka Server 활성화하기
Eureka Server활성화를 위해 아래와 같은 어노테이션을 추가해줍니다.
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServiceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryServiceApplication.class, args);
}
}
application.yml 파일을 아래와 같이 작성해줍니다.
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
register-with-eureka: false
fetch-registry: false
- register-with-eureka : 유레카 서버 자신의 정보를 등록할지 여부
- fetch-registry : 유레카 서버로부터 인스턴스들의 정보를 주기적으로 가져올 것인지의 여부
https://docs.spring.io/spring-cloud-netflix/reference/configprops.html
설정의 정보들은 위의 사이트에서 확인할 수 있습니다.
위와 같은 작업이 끝나고 8761 포트로 서버를 띄우면
위와 같은 대시보드를 확인할 수 있습니다.
이제 서비스를 유레카 서버에 등록하는 과정을 진행해보겠습니다.
2-4 Eureka Client 구현하기
서비스의 위치정보를 Eureka Server에 등록하기 위한 작업을 진행해보겠습니다.
(각 서비스의 설정은 같기 때문에 user-service를 기준으로 진행합니다!)
user-service 모듈에 eureka-client 의존성을 추가해줍니다.
build.gradle 설정 추가
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
eureka-client 활성화를 위해 @EnableDiscoveryClient 어노테이션을 추가해줍니다.
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
application.yml 작성하기
server:
port: 8080
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
- name : Eureka에 등록될 서비스 이름을 지정
- defaultZone : 유레카 서버의 위치 등록
해당 설정을 마치고 유레카 서버, user-service를 실행한 후 유레카 서버에 접속하면 아래와 같은 대시보드를 확인할 수 있습니다.
해당 대시보드를 통해 정상적으로 user-service가 등록된 것을 볼 수 있습니다.
다음편에는 API-Gateway를 구현하는 방법에 대해 알아보도록 하겠습니다.
참고
Spring Cloud로 개발하는 마이크로서비스 애플리케이션
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의 | Dowon Lee - 인프런
Dowon Lee | Spring framework의 Spring Cloud 제품군을 이용하여 마이크로서비스 애플리케이션을 개발해 보는 과정입니다. Cloud Native Application으로써의 Spring Cloud를 어떻게 사용하는지, 구성을 어떻게 하는
www.inflearn.com
https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html
Spring Cloud Netflix Features :: Spring Cloud Netflix
Service Discovery is one of the key tenets of a microservice-based architecture. Trying to hand-configure each client or some form of convention can be difficult to do and can be brittle. Eureka is the Netflix Service Discovery Server and Client. The serve
docs.spring.io
https://www.baeldung.com/cs/service-discovery-microservices

'Backend > MSA 전환' 카테고리의 다른 글
[MSA 전환하기 6편] OpenFeign을 활용한 서비스 간 통신하기 (0) | 2025.01.29 |
---|---|
[MSA 전환하기 5편] Spring Cloud Config 도입하기 (+ Spring Cloud Bus) (0) | 2025.01.20 |
[MSA 전환하기 4편] Spring Cloud Gateway 구현하기 (API Gateway) (0) | 2025.01.15 |
[MSA 전환하기 2편] 멀티 모듈 구성하기 (0) | 2025.01.11 |
[MSA 전환하기 1편] 모놀리식 아키텍처와 MSA란 무엇인가? (1) | 2024.11.26 |