2024. 12. 11. 13:49ㆍSpring Microservice
스프링 부트의 서비스 디스커버리 아키텍처 개념
스프링 부트는 마이크로서비스 환경에서 서비스 디스커버리를 손쉽게 구현할 수 있도록 지원합니다. 이를 통해 개별 서비스 간의 동적 연결, 확장성, 상태 관리 등이 가능하며, Netflix Eureka와 같은 서비스 디스커버리 서버와 쉽게 통합할 수 있습니다. 다음 네 가지 핵심 개념을 상세히 설명하겠습니다.
1. 서비스 등록 (Service Registration)
서비스 등록은 서비스 인스턴스가 시작될 때 자신을 서비스 레지스트리(Service Registry)에 등록하여 네트워크 위치(IP와 포트 등)를 저장하는 과정입니다. 이 과정은 서비스 디스커버리의 기반을 형성하며, 다른 서비스가 이를 통해 위치를 조회할 수 있습니다.
작동 방식
- 서비스 제공자는 Eureka Client 라이브러리를 포함하고, 이를 통해 Eureka 서버와 통신합니다.
- 애플리케이션이 시작될 때:
- Eureka Client가 Eureka 서버에 HTTP 요청을 보내 서비스 정보를 등록합니다.
- 등록 정보에는 IP 주소, 포트, 서비스 ID, 메타데이터(서비스 이름, 버전, 환경 등)가 포함됩니다.
- 주기적으로 Heartbeat 신호를 보내 서비스가 여전히 실행 중임을 알립니다.
스프링 부트에서 구현 예시
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka 서버 주소
instance:
hostname: my-service
prefer-ip-address: true
[참고]
@SpringBootApplication
@EnableEurekaClient
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args);
}
}
2. 클라이언트의 서비스 주소 검색 (Service Discovery)
서비스 디스커버리는 서비스 소비자가 서비스 레지스트리에서 다른 서비스의 위치를 조회하고, 해당 주소를 사용해 요청을 보내는 과정입니다.
작동 방식
- 클라이언트 사이드 디스커버리:
- 클라이언트는 서비스 이름(예:
SERVICE-NAME
)을 사용하여 Eureka 서버에서 해당 서비스를 조회합니다. - Eureka 서버는 사용 가능한 서비스 인스턴스의 리스트를 반환합니다.
- 클라이언트는 로드 밸런싱 전략(예: Round-Robin)을 사용하여 적절한 인스턴스를 선택하고 요청을 보냅니다.
- 클라이언트는 서비스 이름(예:
- 서버 사이드 디스커버리:
- 클라이언트는 직접 서비스 레지스트리를 조회하지 않고, 게이트웨이(예: Spring Cloud Gateway)가 Eureka에서 서비스를 조회하여 요청을 전달합니다.
스프링 부트에서 구현 예시
클라이언트에서 @LoadBalanced
RestTemplate 사용:
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
서비스 호출:
@RestController
public class ConsumerController {
private final RestTemplate restTemplate;
public ConsumerController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/consume")
public String consume() {
return restTemplate.getForObject("http://SERVICE-NAME/api/resource", String.class);
}
}
3. 정보 공유 (Information Sharing)
서비스 디스커버리에서는 각 서비스의 상태와 위치 정보가 서비스 레지스트리를 통해 공유됩니다. 이는 레지스트리가 중앙 저장소 역할을 하며, 모든 서비스의 네트워크 위치를 관리하기 때문입니다.
작동 방식
- Eureka 서버는 모든 등록된 서비스의 정보를 저장하며, 이 정보를 필요로 하는 클라이언트 또는 서비스에 제공합니다.
- Eureka의 Client Cache:
- 클라이언트는 Eureka 서버와 주기적으로 동기화하여 로컬 캐시에 최신 정보를 유지합니다.
- 이는 서버의 부하를 줄이고, 네트워크 중단 시에도 서비스 디스커버리가 가능하도록 보장합니다.
- 정보 공유는 RESTful API 기반으로 이루어지며, JSON 형식으로 서비스 정보가 전달됩니다.
장점
- 서비스 간 통신 시 네트워크 세부 정보를 직접 관리할 필요가 없습니다.
- 서비스 확장 시 자동으로 추가된 인스턴스를 공유합니다.
4. 상태 모니터링 (Health Monitoring)
서비스 디스커버리 아키텍처에서 상태 모니터링은 서비스의 가용성과 상태를 확인하는 데 필수적입니다. 서비스가 비정상 상태로 판단되면, 해당 서비스 인스턴스는 레지스트리에서 제거되거나 비활성화됩니다.
작동 방식
- Heartbeat 체크:
- Eureka 클라이언트는 주기적으로 Eureka 서버에 Heartbeat 신호를 보냅니다.
- 일정 시간 동안 Heartbeat 신호가 없으면, Eureka 서버는 해당 서비스를 더 이상 사용 불가능한 상태로 표시합니다.
- Health Check Endpoint:
- 서비스 인스턴스는
/actuator/health
와 같은 엔드포인트를 노출하여 상태 정보를 제공합니다. - Eureka 서버는 주기적으로 이 엔드포인트를 호출하여 상태를 확인합니다.
- 서비스 인스턴스는
스프링 부트에서 구현 예시
Spring Boot Actuator를 사용한 Health Check:
management:
endpoints:
web:
exposure:
include: health
Eureka와 통합된 Health Check:
eureka:
instance:
lease-renewal-interval-in-seconds: 10
lease-expiration-duration-in-seconds: 30
요약
개념 | 설명 | 주요 기술 및 구성 요소 |
---|---|---|
서비스 등록 | 서비스가 실행 시 자신의 정보를 레지스트리에 등록 | Eureka Client, @EnableEurekaClient |
클라이언트 검색 | 서비스 소비자가 레지스트리에서 서비스 정보를 조회하여 요청 전달 | RestTemplate, @LoadBalanced |
정보 공유 | 모든 서비스 정보가 레지스트리를 통해 공유되고 동기화됨 | Eureka 서버, Client Cache |
상태 모니터링 | Heartbeat 신호와 Health Check를 통해 서비스의 가용성 및 상태를 지속적으로 확인하고 관리 | Spring Boot Actuator, Eureka 서버 |
스프링 부트의 서비스 디스커버리는 위 네 가지 개념이 유기적으로 동작하며, 이를 통해 마이크로서비스 환경에서 서비스 간 연결과 상태 관리를 효과적으로 수행할 수 있습니다.
'Spring Microservice' 카테고리의 다른 글
Client-side load balancing (0) | 2024.12.11 |
---|---|
유레카 클라이언트 설정 (0) | 2024.12.11 |
클라우드 기반 서비스 디스커버리 에이전트 (0) | 2024.12.11 |
Vault와 Spring Cloud Vault 통합 (0) | 2024.12.11 |
Raft in Vault (0) | 2024.12.10 |