03. 서비스 디스커버리
- 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리하고 찾아주는 기능
- 각 서비스는 등록 서버에 자신의 위치를 등록, 다른 서비스는 이를 조회하여 통신
- 주요 기능 : 서비스 등록, 서비스 조회, 헬스 체크 등
Eureka
- Eureka 서버 설정
- Eureka 클라이언트 설정
서비스 등록 및 디스커버리
- 헬스 체크 및 장애 처리
Eureka의 고가용성 구성
- 클러스터 구성
Eureka란 (서버 및 클라이언트 설정)
- 넷플릭스가 개발한 서비스 디스커버리 서버, 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리
- 모든 서비스 인스턴스의 위치를 저장하는 중앙 저장소 역할을 하며, 서비스 인스턴스의 상태를 주기적으로 확인하여 가용성을 보장(헬스체크)
- 여러 인스턴스를 지원하여 고가용성을 유지할 수 있음
Eureka 서버 설정
- Eureka 서버는 서비스 레지스트리를 구성하는 중앙 서버
-- yaml --
server:
port: 8761
eureka:
client:
register-with-eureka: false # 다른 Eureka 서버에 이 서버를 등록하지 않음
fetch-registry: false # 다른 Eureka 서버의 레지스트리를 가져오지 않음
server:
enable-self-preservation: false # 자기 보호 모드 비활성화
-- yaml --
server:
port: 8761
eureka:
client:
register-with-eureka: false # 다른 Eureka 서버에 이 서버를 등록하지 않음
fetch-registry: false # 다른 Eureka 서버의 레지스트리를 가져오지 않음
server:
enable-self-preservation: false # 자기 보호 모드 비활성화
- 해당 설정을 통해 Eureka 서버를 구성하고, 클라이언트가 등록할 수 있도록 준비
Eureka 클라이언트 설정
- 각 서비스는 Eureka 서버에 자신을 등록해야 함
- spring-cloud-starter-netflix-eureka-client 의존성을 사용하고, 애플리케이션 이름만 설정파일에 있으면 Eureka에 등록됨
spring:
application:
name: my-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka 서버 URL
register-with-eureka: true # Eureka 서버에 등록
fetch-registry: true # Eureka 서버로부터 레지스트리 정보 가져오기
instance:
hostname: localhost # 클라이언트 호스트 이름
prefer-ip-address: true # IP 주소 사용 선호
lease-renewal-interval-in-seconds: 30 # 리스 갱신 간격
lease-expiration-duration-in-seconds: 90 # 리스 만료 기간
서비스 등록 및 디스커버리
서비스 등록
- 각 서비스 애플리케이션은 Eureka 서버에 자신의 위치를 등록
- spring-cloud-starter-netflix-eureka-client 의존성을 사용하고, 애플리케이션 이름만 설정파일에 있으면 Eureka에 등록됨
서비스 디스커버리
- 클라이언트 애플리케이션은 Eureka 서버에서 필요한 서비스의 위치를 조회
- RestTemplate을 사용하는 경우 ( 알아두자 )
- 클라이언트 애플리케이션은 Eureka 서버에서 필요한 서비스의 위치조회
- Spring Boot 애플리케이션에서 @LoadBalanced 애노테이션을 사용하여 RestTemplate에 로드 밸런싱 기능 추가
@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() { String serviceUrl = "<http://my-service/api/data>"; return restTemplate.getForObject(serviceUrl, String.class); } } - FeignClient를 사용하는 경우 (실습)
- 클라이언트 애플리케이션은 Eureka 서버에서 필요한 서비스의 위치를 조회
- Spring Boot 애플리케이션에서 FeignClient를 사용하여 간편하게 서비스 호출 수행
@SpringBootApplication @EnableFeignClients 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(); } }
헬스 체크 및 장애 처리
- 헬스 체크
- Eureka 서버가 주기적으로 서비스 인스턴스의 상태를 확인하여 가용성을 유지
- 기본 헬스 체크 엔드포인트 /actuator/health 를 사용
- 장애 처리
- 서비스 장애 시 Eureka 서버는 해당 인스턴스를 레지스트리에서 제거하여 다른 서비스의 접근을 차단
Eureka의 고가용성 구성
클러스터 구성
- Eureka 서버의 고가용성을 위해 여러 인스턴스를 구성할 수 있음 (호출 분산)
- 다중 인스턴스로 구성하여 고가용성을 유지하며, 각 인스턴스는 서로를 피어로 등록하여 상호 백업
-- yaml --
eureka:
client:
service-url:
defaultZone: http://eureka-peer1:8761/eureka/,http://eureka-peer2:8761/eureka/
- Eureka 서버를 다중 인스턴스로 구성할 때 각 서버의 피어 설정을 통해 서로를 인식하고 백업할 수 있음
실습 - FeignClient를 사용

Eureka server

Run

http://localhost:19090/ 으로 접속하면 두개의 인스턴스가 있는것을 확인할 수 있음
'인프라 기술 및 아키텍처' 카테고리의 다른 글
| 04. MSA - 클라이언트 사이드 로드 밸런싱 (FeignClient와 Ribbon) (0) | 2025.03.13 |
|---|---|
| SQL Query 문법 (0) | 2025.02.11 |
| 02. MSA - Spring Cloud (0) | 2025.02.08 |
| 01. MSA - 오리엔테이션 + MSA란 (TIL) (4) | 2025.02.05 |