Spring Cloud Eureka로 서비스 등록과 발견 설정
Spring Cloud Eureka를 이용한 서비스 등록과 발견 설정 절차, 주요 설정값, 예제 코드와 운영 시 유의사항을 실무 관점에서 정리한 참고자료
목차
소개
마이크로서비스 환경에서는 서비스 인스턴스를 자동으로 등록하고 찾아가는 기능이 필수적이다. Spring Cloud Eureka는 서비스 레지스트리 역할을 하며, 클라이언트는 자신을 등록하고 다른 서비스를 조회할 수 있다. 이 글에서는 eureka server와 eureka client를 구성하는 방법을 예제와 함께 설명한다. 처음 접하는 사람도 이해하기 쉽게 차근차근 설명하고, 운영 시 고려해야 할 사항도 함께 다룬다.
Eureka 개념과 동작 원리
Eureka는 서비스 레지스트리로 동작한다. 레지스트리는 실행 중인 서비스 인스턴스 정보를 보관한다. 각 클라이언트는 주기적으로 상태를 갱신(heartbeat)하고, 레지스트리는 만료된 인스턴스를 제거한다. 클라이언트는 레지스트리에서 다른 서비스의 위치를 조회해 통신을 시작한다. 기본적으로 클라이언트는 서버에 등록(register)하고, 서버는 등록 정보를 캐시로 유지한다.
기본 구성
구성은 크게 두 부분으로 나뉜다. 하나는 Eureka Server, 다른 하나는 Eureka Client(서비스). 아래 절차에 따라 프로젝트를 생성하고 설정하면 된다.
Eureka Server 생성
먼저 Spring Boot 애플리케이션을 만든다. Maven 의존성과 애플리케이션 설정이 필요하다.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
application.yml 예제:
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: false
fetch-registry: false
server:
wait-time-in-ms-when-sync-empty: 0
메인 클래스에 서버 활성화 어노테이션을 추가한다.
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Eureka Client 설정
각 마이크로서비스는 클라이언트로 설정된다. 필요한 의존성을 추가하고 애플리케이션 설정을 한다.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
application.yml 예제(서비스 A):
server:
port: 8081
spring:
application:
name: service-a
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
register-with-eureka: true
fetch-registry: true
메인 클래스에는 클라이언트 활성화 어노테이션 사용.
package com.example.servicea;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceAApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
}
}
등록 확인과 기본 사용법
서버를 띄운 뒤 브라우저에서 http://localhost:8761 을 열면 등록된 인스턴스를 볼 수 있다. 또는 curl로 조회할 수 있다.
curl http://localhost:8761/eureka/apps
서비스 간 호출은 여러 방식으로 할 수 있다. 간단한 방법은 DiscoveryClient 또는 LoadBalanced RestTemplate을 사용하는 것이다.
RestTemplate + @LoadBalanced 예
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// 사용 예시: restTemplate.getForObject("http://service-b/api", String.class);
DiscoveryClient 사용 예
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
@Service
public class DiscoveryService {
private final DiscoveryClient discoveryClient;
public DiscoveryService(DiscoveryClient discoveryClient) {
this.discoveryClient = discoveryClient;
}
public List<String> getInstances(String serviceId) {
return discoveryClient.getInstances(serviceId)
.stream()
.map(si -> si.getUri().toString())
.collect(Collectors.toList());
}
}
운영 시 고려사항
- 고가용성: 단일 Eureka 서버는 단점이므로 두 개 이상을 클러스터로 구성하는 것이 권장된다.
- 캐시와 동기화: 서버 간 동기화 지연으로 일시적인 불일치가 발생할 수 있다.
- 보안: 레지스트리 접근 제어와 HTTPS 적용을 고려한다.
- TTL과 heartbeat 간격: 네트워크 상황에 맞춰 조정해야 한다.
- 메트릭과 모니터링: 등록 상태와 응답성을 지속적으로 수집한다.
문제 해결 체크리스트
- 클라이언트 로그에 등록 오류가 있는지 확인한다.
- 서버의 eureka 서비스 URL이 클라이언트 설정과 일치하는지 점검한다.
- 방화벽과 포트 개방 여부를 확인한다.
- 유효하지 않은 헬스체크로 인해 인스턴스가 제거되는 경우 헬스 엔드포인트를 검토한다.
결론
Spring Cloud Eureka는 서비스 레지스트리와 서비스 디스커버리를 간단하게 구현하게 해준다. 서버와 클라이언트의 기본 설정만으로도 자동 등록과 조회가 가능하다. 실무에서는 고가용성 구성, 보안, 모니터링을 추가로 적용해야 안정적으로 운영할 수 있다. 본문 예제를 따라하면 eureka server spring boot 기반의 환경에서 service discovery spring boot eureka 구현이 가능하다.