BE/Spring Boot

[Spring Boot] Eureka란? / 스프링 부트에서 Eureka, Gateway 설정

셰욘 2025. 3. 19. 17:48
728x90

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 요청을 보내면 응답이 온다.

 

 

 

 

728x90