Eureka란?
Spring Cloud Eureka는 넷플릭스에서 개발한 서비스 디스커버리 시스템이다.
마이크로서비스 아키텍처(MSA) 환경에서 동적으로 서비스 등록 및 검색을 가능하게 해준다.
서비스 디스커버리란?
마이크로서비스 환경에서는 서비스들이 동적으로 변경될 수 있으므로, 각 서비스의 IP 및 포트를 관리하는 중앙 레지스트리가 필요하다.
- Eureka Server: 서비스들의 정보를 저장하고 관리하는 레지스트리 서버 역할
- Eureka Client: 유레카 서버에 자신의 정보를 등록하고, 필요할 때 다른 서비스의 정보를 조회
유레카 서버에 등록만 잘 해놓으면 다른 서버의 IP를 알 필요가 없다 => 필요할 때 유레카 서버에서 받아가면 된다.
서버가 아무리 많아도 각자의 서비스를 개발하는 개발팀에서 유레카 서버에 등록만 잘 해놓으면
등록해놓은 이름을 통해 IP 주소와 포트를 받아오면 된다.
스프링 부트에서 Eureka 설정
build.gradle 설정
스프링 클라우드 버전 추가
ext {
set('springCloudVersion', '2024.0.0')
}
dependencyManagement {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
}
}
Eureka Client
Eureka Client 라이브러리 추가
board-api, user-api, gateway 등 클라이언트에 라이브러리 추가
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
application.yml 설정
클라이언트를 유레카 서버에 등록해주는 설정을 추가해준다.
application.yml 설정 파일에 이름을 설정해준다.
이름 설정을 안 해주면 유레카에 UNKNOWN으로 뜬다.
eureka:
instance:
prefer-ip-address: true # 서비스 등록 시 호스트명이 아닌 IP 주소를 사용 (다른 서비스가 접근하기 쉽게 설정)
lease-renewal-interval-in-seconds: 10 # Eureka 클라이언트가 서버에 자신의 상태를 갱신하는 주기 (초 단위)
lease-expiration-duration-in-seconds: 30 # Eureka 서버가 클라이언트의 갱신이 없을 때 인스턴스를 만료 처리하기까지의 시간 (초 단위)
client:
service-url:
defaultZone: http://localhost:8001/eureka/ # Eureka 서버의 주소 (여러 개일 경우 ,로 구분)
register-with-eureka: true # 현재 서비스(User API)를 Eureka 서버에 등록
fetch-registry: true # Eureka 서버에서 다른 서비스 정보를 주기적으로 가져옴 (서비스 디스커버리 활성화)
spring:
application:
name: user-api # Eureka에 등록될 서비스 이름 (서비스 식별용)
Eureka Server
Eureka Server 라이브러리 추가
유레카 서버로 사용할 모듈 하나를 만들어준다. (discovery)
모듈의 build.gradle에 유레카 서버 라이브러리를 추가해준다.
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}
application.yml 설정
server:
port: 8001 # Eureka 서버가 실행될 포트
spring:
application:
name: service-discovery # Eureka 서버의 애플리케이션 이름
eureka:
server:
eviction-interval-timer-in-ms: 60000 # 서비스 헬스 체크 주기 (기본값: 60초)
renewal-percent-threshold: 0.85 # 최소 허용 갱신 비율 (기본값: 0.85, 85%)
instance:
hostname: localhost # Eureka 서버의 호스트명 (기본값: 현재 서버의 호스트명)
client:
register-with-eureka: false # Eureka 서버가 자체적으로 Eureka에 등록하지 않도록 설정 (Eureka 클러스터가 아니라 단독 서버일 경우 false)
fetch-registry: false # Eureka 서버가 자체적으로 다른 서비스 정보를 가져오지 않도록 설정 (Eureka 클러스터가 아니라면 false)
@EnableEurekaServer 어노테이션 추가
해당 모듈이 Eureka Server로 동작하도록 설정하는 어노테이션을 추가해준다.
어노테이션이 없으면 Eureka Server 기능이 활성화되지 않음!
@EnableEurekaServer
@SpringBootApplication
public class ServiceDiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceDiscoveryApplication.class, args);
}
}
유레카 서버 주소 접속
위에서 서버 설정한대로 8001 포트로 접속해준다.
API Gateway에 유레카 이름으로 등록
gateway 모듈의 application.yml에서 주소를 유레카에서 등록해준 애플리케이션 이름으로 지정해준다.
server:
port: 8000
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:8001/eureka/
register-with-eureka: true
fetch-registry: true
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: user-api
uri: lb://user-api # Eureka에 등록된 서비스 이름
predicates:
- Path=/user/**
- id: board-api
uri: lb://board-api # Eureka에 등록된 서비스 이름
predicates:
- Path=/board/**
게이트웨이의 IP 주소로 HTTP 요청을 보내면 응답이 온다.
'BE > Spring Boot' 카테고리의 다른 글
[Spring Boot] CQRS (0) | 2025.03.29 |
---|---|
[Spring Boot] Gateway에서 인가 처리 (Filter) (0) | 2025.03.21 |
[Spring Boot] 멀티 모듈 프로젝트 생성 / API Gateway 연결 (0) | 2025.03.18 |
[Spring Boot] Spring Cloud란? / Spring Cloud Gateway (0) | 2025.03.18 |
[Spring Boot] STOMP란? / 간단한 채팅방 구현 (0) | 2025.03.18 |