Eureka

미미·2025년 9월 19일

MSA

목록 보기
2/5
post-thumbnail

Eureka란?

넷플릭스가 개발한 서비스 디스커버리 서버로, 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리합니다.

💡 서비스 디스커버리란?

서비스 디스커버리는 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리하고 찾아주는 기능입니다.
각 서비스는 등록 서버에 자신의 위치를 등록하고, 다른 서비스는 이를 조회하여 통신합니다.
주요 기능으로는 서비스 등록, 서비스 조회, 헬스 체크등이 있습니다.

  • 모든 서비스 인스턴스의 위치를 저장하는 중앙저장소 역할을 하며, 서비스 인스턴스의 상태를 주기적으로 확인하여 가용성을 보장합니다. (헬스 체크)
  • 여러 인스턴스를 지원하여 고가용성을 유지할 수 있습니다.

설정

Eureka 서버 설정

server:
  port: 8761

eureka:
  client:
    register-with-eureka: false  # 다른 Eureka 서버에 이 서버를 등록하지 않음
    fetch-registry: false  # 다른 Eureka 서버의 레지스트리를 가져오지 않음
  server:
    enable-self-preservation: false  # 자기 보호 모드 비활성화

해당 설정을 통해 Eureka 서버를 구성하고, 클라이언트가 등록할 수 있도록 준비합니다.

Eureka 클라이언트 설정

  • 각 서비스는 Eureka 서버에 자신을 등록해야 함
  • 의존성 추가 : spring-cloud-starter-netflix-eureka-client
  • yml
spring:
  application:
    name: my-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # Eureka 서버 URL
    register-with-eureka: true  # Eureka 서버에 등록
    fetch-registry: true  # Eureka 서버로부터 레지스트리 정보 가져오기
  instance:
    hostname: localhost  # 클라이언트 호스트 이름
    prefer-ip-address: true  # IP 주소 사용 선호
    lease-renewal-interval-in-seconds: 30  # 리스 갱신 간격
    lease-expiration-duration-in-seconds: 90  # 리스 만료 기간

더 많은 추가 설정은 공식문서를 참고해주세요.

서비스 등록 및 디스커버리

서비스 등록

  • 각 서비스 애플리케이션은 Eureka 서버에 자신의 위치를 등록
  • spring-cloud-starter-netflix-eureka-client 의존성을 사용하고, 애플리케이션 이름만 설정파일에 있으면 Eureka에 등록됨

서비스 디스커버리

클라이언트 애플리케이션은 Eureka 서버에서 필요한 서비스의 위치를 조회합니다.
Spring Boot 애플리케이션에서 FeignClient를 사용하여 간편하게 서비스 호출을 수행합니다.

@SpringBootApplication
@EnableFeignClients //어노테이션 선언
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • client 인터페이스

@FeignClient(name = "my-service") 
public interface MyServiceClient {

    @GetMapping("/api/data") // http://my-service/api/data
    String getData();
}

- controller

@RestController
public class MyFeignClientController {

    @Autowired
    private MyServiceClient myServiceClient;

    @GetMapping("/get-data-feign")
    public String getDataWithFeignClient() {
        return myServiceClient.getData();
    }
}

헬스 체크 및 장애처리

  • 헬스 체크 : Eureka 서버가 주기적으로 서비스 인스턴스의 상태를 확인하여 가용성을 유지합니다. (기본 헬스 체크 엔드포인트 /actuator/health)
  • 장애 처리 : 서비스 장애 시 Eureka 서버는 해당 인스턴스를 레지스트리에서 제거하여 다른 서비스의 접근을 차단합니다.

Eureka의 클러스터 구성

  • Eureka 서버의 고가용성을 위해 여러 인스턴스를 구성할 수 있습니다.
  • 다중 인스턴스로 구성하여 고가용성을 유지하며, 각 인스턴스는 서로를 피어로 등록하여 상호 백업합니다.
  • 설정 파일 예시:
    
    eureka:
      client:
        service-url:
          defaultZone: http://eureka-peer1:8761/eureka/,http://eureka-peer2:8761/eureka/
    
  • Eureka 서버를 다중 인스턴스로 구성할 때 각 서버의 피어 설정을 통해 서로를 인식하고 백업할 수 있습니다.


실습

유레카 서버 하나에 같은 기능을 하는 인스턴스 2개를 연결해보겠습니다.

프로젝트 생성

유레카 서버를 만들기 위해 spring initializr 사이트를 통해 프로젝트를 생성해보겠습니다.
패키지 이름은 com.spring-cloud.eureka.server로 지정하고 dependencies에 eureka server를 추가하여 생성하도록 하겠습니다.

다음으로 유레카 서버에서 관리하는 유레카 클라이언트 어플리케이션을 만들어보겠습니다.
패키지 이름은 com.spring-cloud.eureka.client.first로 지정하고 dependencies에는 eureka discovery client , spring web 를 추가하여 생성하도록 하겠습니다.
(같은 방식으로 com.spring-cloud.eureka.client.second도 생성합니다)

위의 3가지 프로젝트를 하나의 창에서 관리하기 위해 server를 먼저 인텔리제이에서 실행시켜주고 나머지 client는 gradle에서 추가해줍니다.

위의 gradle +버튼을 사용하여 모두 추가해주면 위의 처럼 gradle에 3가지 프로젝트를 확인할수있습니다.

설정

eurka 서버 설정을 해주겠습니다.

spring:
  application:
    name: server

server:
  port: 19090

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:19090/eureka/
  instance:
    hostname: localhost

src-main-resources에 application.yml 파일을 추가해주고 다음과 같이 설정합니다.

eurka 서버 설정을 마쳤으니 클라이언트 설정을 해보겠습니다.

spring:
  application:
    name: first

server:
  port: 19091

eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/

첫번째 클라이언트 이름은 first라 지정하고 port는 19091로 지정했습니다.
(같은 방식으로 두번째 클라이언트 이름은 second로 지정하고 port는 19092로 지정하면 됩니다)

실행

모든 설정을 마쳤으므로 실행을 보겠습니다.
먼저 server Application을 실행 후 로컬에서 접속(http://localhost:19090/)해보면 다음과 같은 사이트가 나타납니다.

빨간 박스 안을 보면 현재 해당 서버에 이용가능한 인스턴스가 없다고 뜹니다.
이제 first 클라이언트를 실행시키고 다시 로드해보겠습니다.

FIRST 인스턴스가 들어간것을 확인할수있습니다.
이제 second 클라이언트도 실행시키고 다시 로드해보겠습니다.

두 개의 클라이언트 모두 설정이 잘 된것을 확인할수있습니다.

(빨간 경고 메시지는 유레카 서버가 클라이언트의 상태를 확인하는 갱신 타임이 조절되지않아서 실시간성이 좀 떨어진다는 메시지입니다.
-> 프로젝트 상황에 맞춰 설정파일에 추가해주면 메시지가 뜨지않음 )

0개의 댓글