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 |