Spring boot의 서비스 디스커버리 개념

2024. 12. 11. 13:49Spring Microservice

스프링 부트의 서비스 디스커버리 아키텍처 개념

스프링 부트는 마이크로서비스 환경에서 서비스 디스커버리를 손쉽게 구현할 수 있도록 지원합니다. 이를 통해 개별 서비스 간의 동적 연결, 확장성, 상태 관리 등이 가능하며, Netflix Eureka와 같은 서비스 디스커버리 서버와 쉽게 통합할 수 있습니다. 다음 네 가지 핵심 개념을 상세히 설명하겠습니다.


1. 서비스 등록 (Service Registration)

서비스 등록은 서비스 인스턴스가 시작될 때 자신을 서비스 레지스트리(Service Registry)에 등록하여 네트워크 위치(IP와 포트 등)를 저장하는 과정입니다. 이 과정은 서비스 디스커버리의 기반을 형성하며, 다른 서비스가 이를 통해 위치를 조회할 수 있습니다.

작동 방식

  • 서비스 제공자는 Eureka Client 라이브러리를 포함하고, 이를 통해 Eureka 서버와 통신합니다.
  • 애플리케이션이 시작될 때:
    1. Eureka Client가 Eureka 서버에 HTTP 요청을 보내 서비스 정보를 등록합니다.
    2. 등록 정보에는 IP 주소, 포트, 서비스 ID, 메타데이터(서비스 이름, 버전, 환경 등)가 포함됩니다.
    3. 주기적으로 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)

서비스 디스커버리는 서비스 소비자가 서비스 레지스트리에서 다른 서비스의 위치를 조회하고, 해당 주소를 사용해 요청을 보내는 과정입니다.

작동 방식

  • 클라이언트 사이드 디스커버리:
    1. 클라이언트는 서비스 이름(예: SERVICE-NAME)을 사용하여 Eureka 서버에서 해당 서비스를 조회합니다.
    2. Eureka 서버는 사용 가능한 서비스 인스턴스의 리스트를 반환합니다.
    3. 클라이언트는 로드 밸런싱 전략(예: 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