Spring Eureka는 Spring Cloud의 구성 요소 중 하나로, 서비스 디스커버리 기능을 제공합니다. 즉, 마이크로서비스 아키텍처에서 서비스들이 서로를 동적으로 인식하고 통신할 수 있도록 도와줍니다. Eureka는 Netflix의 Eureka 서버를 기반으로 하며, 이를 사용하면 마이크로서비스 간의 통신을 효율적으로 관리할 수 있습니다.
1. Eureka의 역할
Eureka는 두 가지 주요 역할을 합니다:
Eureka 서버 (Service Registry): 클라이언트 서비스가 자신을 등록하고, 다른 서비스의 정보를 검색할 수 있는 중앙 저장소 역할을 합니다.
Eureka 클라이언트 (Service Discovery): 서비스가 Eureka 서버에 자신을 등록하고, 다른 서비스에 대한 정보를 찾기 위해 Eureka 서버에 요청을 보냅니다.
2. 구성 요소
Eureka Server: 서비스들이 등록될 중앙 서비스 디스커버리 서버입니다. Eureka 서버는 모든 서비스 정보를 관리하며, 클라이언트가 요청할 수 있도록 정보를 제공합니다.
Eureka Client: 서비스가 Eureka 서버에 등록되거나, 다른 서비스를 찾을 때 사용되는 클라이언트입니다. 클라이언트는 자신을 Eureka 서버에 등록하고, 다른 서비스들의 정보를 조회할 수 있습니다.
3. Eureka 서버 설정
Eureka 서버는 Spring Cloud Netflix에 포함되어 있으며, @EnableEurekaServer 어노테이션을 사용하여 활성화합니다.
Eureka 서버 설정 예시
1. application.yml 설정
server:
port: 8761 # Eureka Server 포트
eureka:
client:
registerWithEureka: false # 이 서버는 클라이언트가 아니므로 false
fetchRegistry: false # 다른 서버의 레지스트리를 가져오지 않음
server:
waitTimeInMsWhenSyncEmpty: 0 # 초기화 대기 시간 설정
2. EurekaServerApplication.java
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4. Eureka 클라이언트 설정
서비스가 Eureka 서버에 자신을 등록하려면, @EnableEurekaClient 어노테이션을 사용하여 Eureka 클라이언트로 설정합니다.
Eureka 클라이언트 설정 예시
1. application.yml 설정
spring:
application:
name: my-service # 이 서비스의 이름
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/ # Eureka Server URL
2. EurekaClientApplication.java
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
5. 서비스 등록 및 검색
서비스 등록: Eureka 클라이언트는 애플리케이션이 시작될 때 자동으로 Eureka 서버에 자신의 정보를 등록합니다. 이때, spring.application.name 속성이 서비스의 이름이 됩니다.
서비스 검색: 다른 서비스는 Eureka 서버에 등록된 서비스 목록을 조회하여 특정 서비스의 위치를 동적으로 찾을 수 있습니다. 예를 들어, RestTemplate을 사용해 @LoadBalanced와 함께 서비스 검색을 할 수 있습니다.
서비스 검색 예시
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
이렇게 하면 RestTemplate을 사용하여 Eureka 서버에 등록된 서비스의 이름을 통해 자동으로 서비스 인스턴스를 찾아서 통신할 수 있습니다.
Heartbeat: Eureka 클라이언트는 일정 간격으로 Eureka 서버에 생존 신호를 보냅니다. 클라이언트가 일정 시간 동안 생존 신호를 보내지 않으면 Eureka 서버는 해당 클라이언트를 "down" 상태로 표시하고, 다른 서비스들이 이 정보를 통해 해당 서비스를 호출하지 않게 됩니다.
Self-Registration: 클라이언트는 자체적으로 서비스를 등록하며, 이는 Spring Cloud에서 기본적으로 제공됩니다. 다른 서비스가 실패할 경우 자동으로 대체 서비스를 선택할 수 있습니다.
서비스 상태 관리: Eureka는 각 서비스의 상태를 UP, DOWN, STARTING, OUT_OF_SERVICE 등으로 관리할 수 있으며, 서비스의 상태를 기반으로 서비스들을 선택적으로 호출할 수 있습니다.
7. Eureka와 로드 밸런싱
Eureka와 함께 사용되는 @LoadBalanced 어노테이션은 클라이언트에서 로드 밸런싱을 제공하는 Ribbon과 통합됩니다. 이를 통해 여러 인스턴스가 있는 서비스 중 하나를 자동으로 선택하여 호출할 수 있습니다.
8. 장애 처리
Eureka 클라이언트는 장애가 발생한 서비스를 자동으로 제거하고, 다른 가용한 서비스를 선택하도록 설계되어 있습니다. 클라이언트가 등록된 서비스의 상태를 감시하고, 문제가 생기면 해당 서비스의 정보를 제거하여, 다른 서비스가 호출될 수 있도록 합니다.
Eureka의 장점
자동 서비스 등록과 발견: 마이크로서비스 아키텍처에서 서비스 간의 동적인 연결을 자동으로 처리할 수 있습니다.
가용성 관리: 서비스 상태를 모니터링하고, 장애가 발생한 서비스를 제외하여 다른 서비스에 트래픽을 전송합니다.
로드 밸런싱: 여러 인스턴스를 가진 서비스에서 자동으로 로드 밸런싱을 처리할 수 있습니다.
Eureka의 단점
중앙 집중식 서비스 관리: Eureka 서버가 다운되면 서비스 디스커버리 기능이 중단될 수 있습니다. 이를 보완하기 위해 Eureka 서버의 복제나 다중 서버 설정이 필요할 수 있습니다.
성능 문제: 서비스가 많아질수록 서버의 부하가 커질 수 있기 때문에 Eureka 서버의 성능을 고려한 설정이 필요합니다.
결론
Spring Eureka는 서비스 디스커버리 및 자동화된 서비스 등록 기능을 제공하여, 마이크로서비스 아키텍처에서 서비스를 동적으로 관리할 수 있게 해줍니다. 클라이언트는 자신을 Eureka 서버에 등록하고, 다른 서비스들의 위치를 쉽게 찾을 수 있습니다. 이 기능은 Spring Cloud와 잘 통합되어 마이크로서비스 환경을 구축하는 데 중요한 역할을 합니다.