서비스 디스커버리
MSA와 같은 분산 구조는 서비스 간의 통신이 원활해야 한다.
그러기 위해서는 `IP Address`와 `Port`를 이용하게 되는데 클라우드 환경에 배포를 하게 되면서 서비스가 오토 스케일링 등에 의해서 동적으로 생성되어 서비스의 IP가 변경되는 일이 있다.
그래서 서비스를 호출할 때, 서비스의 위치 즉 IP Address와 Port를 알아낼 수 있어야 하는데, 이것을 할 수 있게 해주는 것이 서비스 디스커버리(Service Discovery)이다.
서비스 디스커버리에는 클라이언트 사이드와 서버 사이드, 두 가지 방식으로 나뉜다.
클라이언트 사이드

클라이언트 사이드는 브라우저의 도메인 주소 렌더링 방식와 유사하다고 보면 된다.
브라우저에 구글 도메인 주소를 입력하면 DNS 서버에서 구글의 IP를 찾아 브라우저에 보내주면 IP를 이용해 구글의 정보를 렌더링하여 브라우저에 표시해준다.

쉽게 표현하면, A 서비스 클라이언트에서 서비스 레지스트리로 B의 위치(IP, Port)를 물어보면 레지스트리에서 알려주고, A는 B에게 연락하는 방식이다.
장점
- 구현이 더 간단하다.
- 프록시와 같은 유형의 인프라도 설정할 필요가 없다. 레지스트리와 해당 레지스트리에 요청하는 서비스만 있으면 된다.
단점
- 각 언어에 대해 특정 구현이 필요하다. 예를 들어 Java에서 실행되는 서비스, Node에서 실행되는 서비스, Python에서 실행되는 서비스가 있는 경우, 각 서비스 간 통신을 위해 클라이언트 측 서비스 검색을 구현해야 한다.
- 서비스와 서비스 레지스트리 간의 결합이 높아 서비스 레지스트리의 변경사항이 모든 서비스의 구현에 영향을 미칠 수 있다는 것이다.
서버 사이드

서버 사이드 방식은 서비스 클라이언트가 레지스트리와 직접 통신하지 않고 로드밸런서와 같은 Proxy를 사용하여 서비스의 위치를 전달받는 방식이다.
그림을 설명하면, A가 프록시에게 B가 어딨냐고 물어보면 프록시가 대신 레지스트리에게 물어봐준다. 레지스트리는 B의 위치를 알려주고, 프록시는 B로 리다이렉션시켜준다. 즉, A와 B는 직접적인 통신을 하지 않는다.
장점
- 언어에 구애받지 않는다. 즉, 어떤 서비스에도 서비스 검색의 특정 구현이 직접 필요하지 않는다.
- 서비스와 서비스 레지스트리 사이에 결합이 필요하지 않는다.
단점
- 프록시와 같은 인프라를 구축해야 한다는 점이다.
Spring Cloud Netflix Eureka
Spring Boot에는 Netflix OSS 통합을 제공한다. 몇 가지 간단한 애노테이션만 추가하면 애플리케이션 내부의 공통 패턴을 빠르게 활성화하고 구성하며, 이를 사용하여 대규모 분산 시스템을 구축할 수 있다. 여기서 제공해주는 서비스 검색이 `Eureka`이다.
유레카는 클라이언트 사이드 디스커버리 방식으로 서비스 레지스트리 역할을 하게 된다.
사용법
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
디스커버리 서비스에는 eureka-server 의존성을 추가해줘야 한다.
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
default-zone: http://${eureka.instance.hostname}/${server.port}/eureka/
server:
port: 8761
- eureka.instance.hostname는 유레카 서버의 호스트 이름을 localhost로 지정한 것이다.
- eureka.client.register-with-eureka는 자기 자신을 유레카 서버에 등록하지 않는다는 것이다.
- eureka.client.fetch-registry는 유레카 서버에서 레지스트리 목록을 가져오지 않는다는 것이다.
- eureka.client.service-url.default-zone는 유레카 서버의 기본 URL을 설정하는 것이다.
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class, args);
}
}
EnableEurekaServer 어노테이션을 사용하여 유레카 서버를 활성화시킨다.
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
이제 다른 클라이언트 서비스들에 eureka-client 의존성을 추가한다.
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8761/eureka
이렇게 환경설정을 해주면 된다.

localhost:8761를 들어가게 되면 확인할 수 있다.
References
https://www.youtube.com/watch?v=v4u7m2Im7ng&t=117s
'Project > E-commerce(MSA)' 카테고리의 다른 글
| 도커 컴포즈를 통해 Infra 설정하기 (feat. mongo express 환경변수 에러) (0) | 2025.05.31 |
|---|---|
| 유용한 DB 마이그레이션 도구, Flyway (0) | 2025.05.25 |
| Spring Cloud Config 환경변수 (0) | 2025.05.06 |