[Spring Cloud] Netflix Eureka
Netflix Eurka란?
Netflix Eureka는 Netflix에서 개발한 서비스 디스커버리(Service Discovery) 솔루션이다. 마이크로서비스 아키텍처에서 각각의 서비스 인스턴스가 어디에 위치하고 있는지를 알 수 있게 해주는 중요한 컴포넌트이다. 해당 서비스 디스커버리 솔루션은 key/value 테이블로 구성되어 있으며, 해당 테이블에 사용하려는 인스턴스를 등록해서 사용하게 된다.
구성
Eureka는 크게 두 부분으로 구성된다.
- Eureka Server: 서비스 디스커버리의 중심 역할을 한다. 서비스 인스턴스들이 자신의 정보를 등록하고, 다른 서비스 인스턴스의 정보를 조회할 때 사용된다.
- Eureka Client: 각 마이크로서비스 인스턴스에 포함되며, Eureka Server에 자신의 정보를 등록하고, 다른 서비스 인스턴스의 정보를 조회하는 역할을 한다.
특징
- 자가 보존 모드(Self Preservation Mode): Eureka 서버는 네트워크 문제 등의 일시적인 문제로 인해 클라이언트들로부터 갱신 정보가 오지 않을 경우를 대비해, 일정 시간 동안 클라이언트로부터 갱신 정보가 들어오지 않으면 자동으로 자신을 보존 모드로 전환한다. 이 모드에서는 Eureka 서버는 어떠한 서비스 인스턴스도 제거하지 않는다.
- 존 기반의 서비스 디스커버리: Eureka는 여러 존에 걸쳐 서비스 디스커버리를 제공할 수 있다. 이를 통해 가용성과 내구성이 향상된다.
Springboot를 사용한 Netflix Eurka 서버 구성
Eureka 서버 구성을 위해 discoveryservice라는 이름을 가진 SpringBoot 프로젝트를 생성한다.
build.gradle에 netflix eureka 의존성 추가 및 기본 세팅
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
application.yml 구성
server:
port: 8761
spring:
application:
name: discoveryservice
# 자기 자신을 클라이언트로 등록하지 않는 설정. 즉 서버로서의 역할로만 기동
eureka:
client:
register-with-eureka: false
fetch-registry: false
최상위 어플리케이션 클래스에 @EnableEurekaServer 추가한다.
package com.example.discoveryservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryserviceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryserviceApplication.class, args);
}
}
서버 가동 후 127.0.0.1:8761을 통해 접속하여 확인.
아직 클라이언트로 등록된 것이 없기에 Application에 아무 내용도 뜨지 않는다.
클라이언트 등록
클라이언트로 사용할 서비스 생성 후 application.yml 파일을 구성한다.
예제에서는 user-service라는 이름으로 생성하였으며, 포트는 랜덤 포트 사용을 선언하였다.
이후 이전 생성하였던 유레카 서버와 연결하는 작업을 진행한다.
# 랜덤포트 사용 선언
server:
port: 0
# 인스턴스 이름
spring:
application:
name: user-service
# Eureka 클라이언트 설정
eureka:
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eu
이후 UserServiceApplication에 @EnableDiscoveryClient 어노테이션을 선언해준다.
package com.example.userservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
서버 가동 후 127.0.0.1:8761에 접속하여 user-service가 유레카 서버에 정상적으로 등록되었는지 확인한다.