하나의 애플리케이션을 여러 독립적인 서비스로 분리
MSA구축 위한 스프링 확장 기능
서비스 인스턴스의 레지스트리 구성하는 중앙 서버
server:
port: 8761
eureka:
client:
register-with-eureka: false # 다른 Eureka 서버에 이 서버를 등록하지 않음
fetch-registry: false # 다른 Eureka 서버의 레지스트리를 가져오지 않음
server:
enable-self-preservation: false # 자기 보호 모드 비활성화
여러 eureka 중앙 서버를 사용가능
각 인스턴스는 서로를 피어로 등록하여 상호 백업
eureka:
client:
service-url:
defaultZone: http://eureka-peer1:8761/eureka/,http://eureka-peer2:8761/eureka/
spring-cloud-starter-netflix-eureka-client 의존성을 사용
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 # 리스 만료 기간
msa에서 각 서비스의 위치를 동적으로 관리/맵핑하는 기능
@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);
}
}
@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();
}
}
네트워크 통신상의 문제등으로 인해, 실제 서비스 인스턴스 장애가 아니지만 잠깐 헬스 체크가 안되는지 자동 확인하는 기능
-> 개발/테스트 환경등에선 장애등을 빨리 파악하기 좋게 비활성화
작동 방식
heartbeat 수신율이 감소시, eureka 레지스트리에서 서비스 인스턴스를 바로 삭제하지 않고 유지
좀 더 오랜시간 관찰, 다시 신호 오면 재등록없이 정상상태 간주
일정시간 지나도 안오면 서비스 장애로 간주
eureka.instance.lease-expiration-duration-in-seconds 설정에 따라 이 시간 결정 (default:90초)