모르는게 많은 개발자

[Spring Cloud] Eureka 개념 및 예제 본문

스프링

[Spring Cloud] Eureka 개념 및 예제

Awdsd 2021. 9. 13. 21:58
반응형

최근 Spring Cloud에 대해 학습한 것을 정리하고자한다.

이번 글에서는 Eureka개념과 Eureka Server 생성 예제를 정리한다.


Eureka는 무엇인가?

Eureka는 클라우드 환경의 다수의 서비스(예: API 서버)들의 로드 밸런싱 및 장애 조치 목적을 가진 미들웨어서버이다.

로드 밸런싱 : 특정 서비스를 제공하는 서버가 여러대가 있을 때 트래픽을 한 서버에 몰리지 않게 분산해주는 기술이다.

미들웨어 : 데이터를 주고 받는 양쪽의 서비스(웹의 예로 클라이언트와 API 서버)의 중간에 위치해 매개 역할을 하는 소프트웨어다.

Eureka는 이러한 미들웨어 기능을 하기 위해 각 연결된 서비스의 IP / PORT /InstanceId를 가지고 있고 REST기반으로 작동한다.

Eureka는 Client-Sever 방식으로 Eureka Server에 등록된 서비스는 Eureka Client로 불린다.

Eureka 프로세스

위 그림은 Eureka Server와 Eureka Client의 프로세스다.

각 서비스를 Eureka Server에 등록하게 되면 Eureka Server는 각 Eureka Client의 IP / PORT / InstanceId를 저장한다.

이후 Eureka Client가 다른 Eureka Client에게 요청을 보낼 때 Eureka에서 받아온 정보를 가지고 요청을 보낼 수 있다.

서비스가 Eureka Server에 등록될 때 자신이 살아있다는 상태값을 보낸다.
그리고 Eureka Server는 다른 Eureka Client의 정보들을 제공하고 서비스는 Local Cache에 저장한다.
이후 30초(Default)마다 Eureka Server에 Heartbeats 요청을 보내고 Eureka Server는 90초 안에 Headerbeats가 도착하지 않으면 해당 Eureka Client를 제거한다.

 

Eureka Server는 REST 기반이기에

Eureka Client 등록 / Eureka Client 정보 가져오기 / Heartbeats / Eureka Client 삭제 등 다양한 기능을 HTTP를 이용해 사용할 수 있다.

 

다음은 위 기능에 해당한는 HTTP Endpoint다.

Operation HTTP Action Description
Eureka Client 등록 POST /eureka/apps/appID Input: JSON/XML payload HTTP Code: 204 on success
Eureka Client 삭제 DELETE /eureka/apps/appID/instanceID HTTP Code: 200 on success
Heartbeats PUT /eureka/apps/appID/instanceID HTTP Code: * 200 on success * 404 if instanceID doesn’t exist
Eureka Client 목록 GET /eureka/apps HTTP Code: 200 on success Output: JSON/XML

이제부터 Eureka Server와 Eureka Client 예제를 만들고 위 API중 몇개를 실습해보자.


Eureka Server

먼저 Eureka Server를 구축해보자.

 Gradle 의존성은 다음과 같다.

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}

설치후 다음과 같이 메인 클래스에 @EnableEurekaServer 어노테이션을 붙여 Eureka Server임을 알려준다.

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryApplication.class, args);
    }
}

application.yml은 다음과 같다.

server:
  port: 8761

spring:
  application:
    name: discovery-service

eureka:
  client:
    register-with-eureka: false #eureka server를 registry에 등록할지 여부
    fetch-registry: false       #registry에 있는 정보들을 가져올지 여부

이게 Eureka Server 기본적인 설정이 끝이다.

이제 서버를 구동하고 http://localhost:8761을 입력하면 다음과 같은 Eureka Dashboard가 출력된다.

Eureka Server Dashboard

현재 Eureka Server에는 등록된 Eureka Client가 없기 때문에 Instances가 없다고 출력된다. 이제 Eureka Client로 등록할 서비스를 하나 만들어보자.


Eureka Client

Eureka Client로 등록하기 위해서는 아래와 같은 의존성을 추가해야한다.

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}

Eureka Server와 똑같이 메인 클래스에 Eureka Client라는 것을 알리는 @EnableDiscoveryClient 어노테이션을 사용한다.

@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

application.yml은 다음과 같다.

spring:
  application:
    name: eureka-client-ex

server:
  port: 8080

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka #Eureka Server 명시

이제 서버를 실행하면 위에서 작동한 Eureka Server에 등록되어 다음과 같이 instance에 표시되는걸 확인할 수 있다.


Eureka API

이제 Postman을 사용해 위에서 봤던 Eureka Server API중 Eureka Instance 조회, 삭제를 해보자.

조회

GET /eureka/apps

Eureka Instance 조회

 

현재 등록된 Instance Eureka-Client-Ex의 정보가 출력되는 것을 볼 수 있다.

참고로 Json으로 보고 싶을 땐 HTTP 요청헤더에 Accept: application/json을 달고 보내야한다.

 

삭제

DELETE /eureka/apps/{appID}/{instanceID}

appID 같은 경우 위의 목록에서 "app"에 해당되는 부분이고 instanceID는 "instanceID"에 해당되는 값이다.

Instacne 삭제

DELETE를 통해 Instance 목록에서 삭제된 것을 확인할 수 있다.

 

다음 포스팅에서는 Spring Cloud Gateway에 대해 알아보자.

 

 

참조

https://sabarada.tistory.com/61

https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

https://netflixtechblog.com/netflix-shares-cloud-load-balancing-and-failover-tool-eureka-c10647ef95e5

반응형
Comments