분산 아키텍처에서는 시스템의 물리적 위치 주소를 찾아야 하는데, 공식적으로는 서비스 디스커버리(service discovery)라고 합니다.
서비스 디스커버리는 다음 두 가지 핵심적 이유로 마이크로서비스 및 클라우드 기반 애플리케이션에서 매우 중요합니다.
1. 디스커버리를 사용해 해당 환경에서 실행하는 서비스 인스턴스 개수를 신속하게 수평 확장하거나 축소할 수 있음
서비스 디스커버리를 통해 서비스의 물리적 위치는 소비자에게 드러나지 않음. 서비스 디스커버리는 배포가 서비스 소비자와 별개로 진행되도록 추상화하는데 도움이 됨.
2. 애플리케이션 회복성을 향상하는 데 도움이 됨
마이크로서비스 인스턴스가 비정상이거나 가용하지 않다면 대부분의 서비스 디스커버리 엔진은 내부의 가용 서비스 목록에서 해당 인스턴스를 제거.
이러한 서비스 디스커버리 패턴을 스프링 클라우드와 넷플릭스의 유레카 엔진을 사용하여 구현해 보려고 합니다.
유레카는 Server
와 Client
로 구성됩니다.
각 서비스를 Eureka Server
에 등록하게 되면 Eureka Server
는 각 Eureka Client
의 정보를 저장합니다.
서비스가 Eureka Server
에 등록될 때 자신이 살아있다는 상태값을 보냅니다.
이후 30초(Default)마다 Eureka Server
에 Heartbeates 요청을 보내고, Eureka Server
는 90초 안에 Headerbeats가 도착하지 않으면 해당 Eureka Client
를 제거합니다.
ecommerce_eureka라는 서버를 만들고,
ecommerce_catalogs, ecommerce_customer 서비스를 등록해 보겠습니다~
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
@SpringBootApplication
@EnableEurekaServer
public class EcommerceEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EcommerceEurekaApplication.class, args);
}
}
server.port=8761
# spring
spring.application.name=ecommerce-eureka
# eureka
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
# 유레카 서비스에 자신을 등록하지 않는다
eureka.client.register-with-eureka=false
# 레지스트리 정보를 로컬에 캐싱하지 않는다
eureka.client.fetch-registry=false
# host명 대신에 ip로 서비스 접근
eureka.instance.prefer-ip-address=true
서버를 구동하고 http://localhost:8761
에 접속하면 Eureka Dashboard를 확인할 수 있습니다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
@SpringBootApplication
@EnableEurekaClient
public class EcommerceCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(EcommerceCustomerApplication.class, args);
}
}
server.port=8076
server.servlet.context-path=/ecommerce/customer
spring.application.name=ecommerce-customer
# DB 연동
...
# eureka
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
# 유레카 서비스에 자신을 등록한다
eureka.client.fetch-registry=true
# 레지스트리 정보를 로컬에 캐싱한다
eureka.client.register-with-eureka=true
# host명 대신에 ip로 서비스 접근
eureka.instance.prefer-ip-address=true
...
각 서비스 서버를 실행하면 Eureka 서버에 등록된 걸 확인할 수 있습니다!