서비스 디스커버리
서비스 디스커버리 : 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리하고 찾아주는 기능.
각 서비스는 등록 서버에 자신의 위치를 등록하고, 다른 서비스는 이를 조회하여 통신.
주요 기능으로는 서비스 등록, 서비스 조회, 헬스 체크 등이 있음.
Eureka
Eureka : 넷플릭스가 개발한 서비스 디스커버리 서버로, 마이크로 서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리.
모든 서비스 인스턴스의 위치를 저장하는 중앙 저장소 역할을 하며, 서비스 인스턴스의 상태를 주기적으로 확인하여 가용성 보장.
Eureka 서버 설정
Eureka 서버는 서비스 레지스트리를 구성하는 중앙 서버
서버 설정 파일 예시 >
server:
port: 8761
eureka:
client:
register-with-eureka: false # 다른 Eureka 서버에 이 서버를 등록하지 않음
fetch-registry: false # 다른 Eureka 서버의 레지스트리를 가져오지 않음
server:
enable-self-preservation: false # 자기 보호 모드 비활성화
해당 설정을 통해 Eureka 서버를 구성하고, 클라이언트가 등록할 수 있도록 준비
Eureka 클라이언트 설정
각 서비스는 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 # 리스 만료 기간
서비스 등록
spring-cloud-starter-netflix-eureka-client 의존성을 사용하고, 애플리케이션 이름만 설정 파일에 있다면 Eureka에 등록됨.
서비스 디스커버리
클라이언트 애플리케이션은 Eureka 서버에서 필요한 서비스의 위치를 조회
- 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);
}
}
클라이언트 애플리케이션은 Eureka 서버에서 필요한 서비스의 위치를 조회 함.
Spring boot 애플리케이션에서 @LoadBalanced 애노테이션을 사용하여 RestTemplate에 로드 밸런싱 기능 추가.
- 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 서버에서 필요한 서비스의 위치를 조회.
Spring boot 애플리케이션에서 FeignClient 사용하여 간편하게 서비스 호출 수행.
Eureka 실습
Eureka 서버 하나에 같은 기능의 인스턴스 2개 연결하기
👉🏻 https://start.spring.io/ 접속해서 server와 client 프로젝트 생성
Server > dependencies 에서 Eureka Server 추가
Client > dependencies 에서 Eureka Discovery Client, Spring Web 추가
Intellij에서 오픈 후 Gradle을 사용하여 위와 같이 한 프로젝트 안에 띄우기.
Eureka 서버 설정하기
application.properties
spring.application.name=server
// 포트번호
server.port=19090
// 기본값은 true. 유레카 서버에 등록되어야 하는 것은 서버가 아니라 클라이언트이므로 false
eureka.client.register-with-eureka=false
// 유레카 서버로부터 레지스트리를 가져올지 말지 정함 false
eureka.client.fetch-registry=false
eureka.instance.hostname=localhost
// eureka 클라이언트가 eureka 서버와 통신할 때 사용할 url 지정
eureka.client.service-url.defaultZone=http://localhost:19090/eureka/
ServerApplication.java
ServerApplication 위에 어노테이션으로 @EnableEurekaServer를 추가해야 유레카 서버로 동작된다.
Client 설정하기
first client의 application.properties
spring.application.name=first
server.port=19091
eureka.client.service-url.defaultZone=http://localhost:19090/eureka/
second client의 application.properties
spring.application.name=second
server.port=19092
eureka.client.service-url.defaultZone=http://localhost:19090/eureka/
위와 같은 설정을 마치고 ServerApplication을 Run 한 뒤 localhost:19090으로 들어가보면 다음과 같은 창을 볼 수 있다.
Instance currently registered with Eureka 칸을 보면 아무것도 등록되어있지 않은데 이 부분은 FirstClient와 SeconClient를 실행시키고 새로고침을 하면 아래와 같이 잘 등록됨을 확인 할 수 있다.
헬스 체크
헬스 체크 : Eureka 서버가 주기적으로 서비스 인스턴스의 상태를 확인하여 가용성을 유지.
기본 헬스 체크 엔드포인트인 /actuator/health 사용
장애 처리 > 서비스 장애 시 Eureka 서버는 해당 인스턴스를 레지스트리에서 제거하여 다른 서비스의 접근을 차단 함.
'Spring' 카테고리의 다른 글
서킷 브레이커 Resilience4j와 API 게이트웨이 이해하기 (1) | 2024.08.17 |
---|---|
클라이언트 사이드 로드 밸런싱 FeignClient와 Ribbon 이해하기 (0) | 2024.08.17 |
MSA와 Spring Cloud 이해하기 (0) | 2024.08.17 |
Spring의 RestTemplate 이해하기 (0) | 2024.08.17 |
Spring 데이터 검증 (Validation)하기 (0) | 2024.08.17 |