1. Eureka란?
Netfilx에서 개발한 서비스 디스커버리 서버로,
MSA 환경에서 각 서비스들의 위치를 동적으로 관리하는 핵심 컴포넌트이다.
2. 서비스 디스커버리(Service Discovery)?
서비스 디스커버리는 마이크로서비스 환경에서 각각의 서비스 인스턴스들의 위치(호스트, 포트)를 자동으로 등록, 검색, 관리하는 시스템이다. 클라우드 환경에서 서비스의 위치가 동적으로 변경됨에 따라, 수동으로 서비스 위치를 관리하기 어렵다. 자동화된 서비스 등록과 발견(discovery)가 필요하다. 서비스 디스커버리를 통해 MSA 환경에서 각 서비스들이 서로를 쉽게 찾고 통신할 수 있게 된다.
3. Eureka의 구성요소
3 - 1. Eureka Server
- 모든 마이크로서비스의 정보를 등록하고 관리하는 레지스트리 서버
- 서비스의 등록, 해제, 상태 모니터링 담당
- 대시보드를 통한 등록된 서비스 현황 확인 가능
3 - 2. Eureka client
- 서비스가 시작될 때 자신의 정보를 Eureka 서버에 등록
- 30초마다 하트비트(heartbeat)를 전송하여 가용성 유지
- 다른 서비스 위치 정보 조회 가능
4. Eureka의 주요 기능
4 - 1. 서비스 등록(Service Registration)
- 서비스 이름
- 호스트명과 포트
- 상태 정보
- 메타데이터
4 - 2. 서비스 발견(Service Discovery)
- 등록된 서비스 목록 조회
- 서비스 위치 정보 실시간 업데이트
- 부하 분산을 위한 여러 인스턴스 관리
5. 실무 적용시 고려사항
- 적절한 하트비트(heartbeat) 주기 설정
- 서비스 등록/해제 정책 수립
- 장애 복구 전략 수립
- 보안 설정 고려
6. 실습
eureka-server와 두 개의 eureka-client로 구성된 시스템을 만들어보자
6 - 1. gradle 에서 eureka-client 추가하기
처음에 eureka-server를 인텔리제이로 실행시키고
gradle 탭에서 '+' 버튼을 눌러 eureka-client 들을 등록한다.
여기서 first와 second가 eureka-client 이다.
first와 second가 들어와 있음을 확인한다.
6 - 2. eureka-server의 build.gradle 과 application.properties, ServerApplication
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.spring-cloud.eureka'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2023.0.3")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.named('test') {
useJUnitPlatform()
}
eureka-server 는 dependencies 에 spring-cloud-starter-netflix-eureka-server가 있어야한다.
spring.application.name=server
server.port=19090
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.instance.hostname=localhost
eureka.client.service-url.defaultZone=http://localhost:19090/eureka/
1. eureka.client.register-with-eureka=false
- Eureka 서버를 자신의 레지스트리에 등록하지 않도록 설정
- 서버 자신은 서비스로 등록될 필요가 없기 때문에 false로 설정
2. eureka.client.fetch-registry=false
- 레지스트리 정보를 로컬에 캐싱하지 않도록 설정
- 서버이기 때문에 다른 서비스의 정보를 가져올 필요가 없어 false로 설정
3. eureka.instance.hostname=localhost
- Eureka 서버의 호스트 이름을 지정
4. eureka.client.service-url.defaultZone=http://localhost:19090/eureka/
- Eureka 서버의 URL 주소를 지정
- 다른 Eureka 클라이언트들이 이 주소로 서비스를 등록하고 검색
이러한 설정들은 Eureka 서버로서의 역할을 수행하기 위한 기본적인 설정들이다.
ServerApplication
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
`@EnableEurekaServer` 어노테이션이 있어야 Eureka Server로 동작한다.
6 - 3. eureka-client의 build.gradle 과 application.properties
first와 second 중에 first만 다루기로 한다.
둘의 차이점은 포트가 19091, 19092 라는 것 말고는 없다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.spring-cloud.eureka'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2023.0.3")
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.named('test') {
useJUnitPlatform()
}
eureka-client 는 web 과 spring-cloud-starter-netflix-eureka-client가 필요하다.
eureka-client는 HTTP 엔드포인트를 통해 자신의 상태를 Eureka Server에 보고 하기 때문이다.
spring.application.name=first
server.port=19091
eureka.client.service-url.defaultZone=http://localhost:19090/eureka/
name을 지정해줘야 하며
eureka.client.service-url.defaultZone에 지정된 url로 서비스를 등록하고 검색한다.
6 - 4. 서버 실행
eureka-server만 실행시켰을 때
Application 란을 보면 사용가능한 instance가 없다고 되어 있다.
firstApplication 실행시켰을 때
Application 란에 FIRST 가 보인다.
secondApplication 도 추가적으로 실행시켰을 때
7. 결론
MSA 환경에서 Eureka 서버를 사용하면 동적으로 변화하는 서비스들의 위치 정보를 자동으로 관리할 수 있어, 개발자가 수동으로 서비스 위치를 관리할 필요가 없다. 또한, 서비스의 헬스 체크를 통해 장애가 발생한 서비스를 자동으로 감지하고 제거함으로써 시스템의 안정성을 높일 수 있다. 특히 클라우드 환경에서 서비스의 스케일 인/아웃이 발새할 떄도 자동으로 서비스 위치가 업데이트 되어 무중단 서비스가 가능해진다.
'MSA' 카테고리의 다른 글
2024 11 28 TIL - Spring Cloud Config (1) | 2024.11.28 |
---|---|
2024 11 27 TIL - API Gateway, Spring Cloud Gateway (0) | 2024.11.27 |
2024 11 26 TIL - CircuitBreaker(Resilience4j) (0) | 2024.11.26 |
2024 11 25 TIL - 로드 밸런싱, Netflix Ribbon (0) | 2024.11.25 |
2024 11 21 TIL - MSA란? (1) | 2024.11.21 |