본문 바로가기
MSA

3 - 서비스 디스커버리 (Eureka)

by 젼젼39 2026. 2. 23.

1. 서비스 디스커버리 개요

  • 1-1) 서비스 디스커버리란?
    • 마이크로서비스 아키텍처(MSA)에서 각 서비스 인스턴스의 네트워크 위치를 동적으로 관리하고 찾아주는 핵심 기능
    • 각 서비스는 기동 시 레지스트리 서버에 자신의 위치를 등록하고, 호출 측은 이를 조회하여 통신을 수행
    • 주요 기능으로는 서비스 등록(Registration), 주소 조회(Lookup), 헬스 체크(Health Check) 등이 있음

2. Eureka 가이드

  • 2-1) Eureka란?
    • 넷플릭스에서 개발한 서비스 디스커버리 전용 서버로, MSA 환경에서 각 서비스의 위치를 동적으로 관리
    • 모든 서비스 인스턴스의 정보를 저장하는 중앙 저장소 역할을 하며, 주기적인 상태 확인을 통해 가용성을 보장
    • 다중 인스턴스 구성을 지원하여 시스템의 고가용성(High Availability)을 유지할 수 있음
  • 2-2) Eureka 서버 설정
    • 서비스 레지스트리를 구성하는 중앙 통제 서버의 설정 예시
server:
  port: 8761

eureka:
  client:
    register-with-eureka: false  # 서버 본인을 클라이언트로 등록하지 않음
    fetch-registry: false        # 다른 피어로부터 레지스트리 정보를 가져오지 않음
  server:
    enable-self-preservation: false  # 자기 보호 모드 비활성화 (개발 환경 권장)
  • 2-3) Eureka 클라이언트 설정
    • 각 마이크로서비스가 유레카 서버에 자신을 등록하기 위한 설정
spring:
  application:
    name: my-service  # 레지스트리 식별 아이디

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # Eureka 서버 엔드포인트
    register-with-eureka: true  #Eureka 서버에 등록
    fetch-registry: true  #Eureka 서버로부터 레지스트리 정보 가져오기
  instance:
    hostname: localhost  #클라이언트 호스트 이름
    prefer-ip-address: true  # 호스트명보다 IP 주소 사용을 선호함
    lease-renewal-interval-in-seconds: 30  # 생존 신호(Heartbeat) 전송 주기(리스 갱신 간격)
    lease-expiration-duration-in-seconds: 90  # 미응답 시 인스턴스 제거 대기 시간(리스 만료 기간)

3. 서비스 등록 및 디스커버리 실무

  • 3-1) 서비스 등록 프로세스
    • spring-cloud-starter-netflix-eureka-client 의존성을 포함한 서비스는 실행 시 설정된 이름을 기반으로 레지스트리에 자동 등록됨
  • 3-2) 동적 서비스 디스커버리 활용

1) RestTemplate을 사용하는 경우
- @LoadBalanced 애너테이션을 통해 서비스 이름 기반의 로드 밸런싱 호출을 구현함

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Bean
    @LoadBalanced // 서비스 이름을 실제 주소로 매핑 및 로드 밸런싱 수행
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
@RestController
public class MyRestTemplateController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/get-data-rest")
    public String getDataWithRestTemplate() {
        // 물리적 IP 대신 논리적 서비스명(my-service)을 URL에 사용함
        String serviceUrl = "http://my-service/api/data";
        return restTemplate.getForObject(serviceUrl, String.class);
    }
}

2) FeignClient를 사용하는 경우
- 인터페이스 선언만으로 외부 서비스를 호출하는 선언적 방식
- 클라이언트 애플리케이션이 Eureka 서버에서 필요한 서비스의 위치를 조회함

@SpringBootApplication
@EnableFeignClients // Feign 클라이언트 활성화
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
@FeignClient(name = "my-service") // 호출 대상 서비스명 지정
public interface MyServiceClient {
    @GetMapping("/api/data")
    String getData();
}
@RestController
public class MyFeignClientController {
    @Autowired
    private MyServiceClient myServiceClient;

    @GetMapping("/get-data-feign")
    public String getDataWithFeignClient() {
        // 인터페이스 호출만으로 서비스 탐색 및 호출이 처리됨
        return myServiceClient.getData();
    }
}
  • 3-3) 헬스 체크 및 장애 처리
    • 헬스 체크: 유레카 서버는 주기적으로 각 인스턴스의 /actuator/health 상태를 확인하여 가용성을 유지
    • 장애 처리: 서비스 장애가 감지되면 레지스트리에서 해당 인스턴스를 즉각 제거하여 다른 서비스의 접근을 차단

4. Eureka 고가용성(HA) 구성

  • 4-1) 클러스터(Cluster) 구성
    • 유레카 서버 자체의 장애에 대비해 다중 인스턴스를 구성하고 상호 백업(Peer Aware) 체계를 구축
    • 각 노드는 서로를 피어로 등록하여 등록 정보를 실시간으로 복제함
eureka:
  client:
    service-url:
      # 다중 서버 주소를 쉼표로 연결하여 피어 간 동기화를 활성화함
      defaultZone: http://eureka-peer1:8761/eureka/, http://eureka-peer2:8762/eureka/

'MSA' 카테고리의 다른 글

6 - API 게이트웨이  (0) 2026.02.23
5 - 서킷브레이커  (0) 2026.02.23
4 - 로드밸런싱  (0) 2026.02.23
2 - Spring Cloud  (0) 2026.02.23
1 - MSA 개요  (0) 2026.02.23