Eureka

종원유·2022년 7월 11일
0

MSA

목록 보기
2/5
post-thumbnail

이번 포스팅은 Eureka에 대한 정리 포스트이다.

Eureka 등장배경

CI/CD를 수행하면서 각 모듈은 계속해서 업그레이드, 수정된다.
그 과정에서 연결 정보가 바뀌면 그 때마다 LB에 새롭게 등록해야 하는데 무척 번거로운 일이 아닐 수 없다.
이러한 문제를 해결하고자 Eureka가 등장하게 되었다.

Eureka ?

Eureka 프로세스

그림참조 : https://lion-king.tistory.com/12

Eureka는 Neflix에서 제공하는 MSA를 위한 클라우드 오픈 소스이다.
AWS와 같은 Cloud 시스템에서 서비스의 로드 밸런싱(LB)실패처리 등을 유연하게 가져가기 위해 각 서비스들의 IP/Port/InstanceId 를 가지고 있는 REST 기반의 미들웨어 서버이다.

LB ?

많은 트래픽(요청)을 여러 대의 서버에 골고루 분산하여 배분해주는 기술
LB는 MSA의 각 모듈에 대한 연결 정보(ip, port, hostname)를 알고있어야하므로, 각 모듈의 연결 정보를 LB에 등록해야 한다.

MSA?

Micro Service Architecture(마이크로 서비스 아키텍쳐)
참고 : https://velog.io/@yjw8459/MSAMicroService-Architecture

미들웨어 ?

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

Eureka는 마이크로 서비스 기반의 아키텍처의 핵심 원칙 중 하나인 Service Discovery의 역할을 수행한다.
MSA에서는 Service의 IP와 Port가 일정하지 않고 지속적으로 변화한다. 그렇기 때문에 Client에 Service의 정보를 수동으로 입력하는 것은 한계를 드러낸다. Service Discovery는 이러한 MSA의 상황에서 적합하다.

Service Discovery ?

MAS로 구성되어 있는 서비스들은 각자 다른 IP와 Port를 가지고 있다. 이러한 서로 다른 서비스들의 IP와 Port 정보에 대해서 저장하고 관리할 필요가 있는데 이것을 Service Discovery라고 한다.

Eureka는 Client-Server의 방식으로 Eureka-Client 서버들이 본인의 IP와 Port, InstanceId를 Eureka-Server로 전달한다.

Client -> Server

그리고 Eureka에 있는 정보를 fetch하여 Eureka-Client간 통신에 사용한다.

Server -> Client

Eureka Server와 Client

Eureka-Server와 Eureka-Client는 REST 통신으로 상호작용한다.
때문에, java Application이 아니더라도 통신할 수 있다.

Eureka 통신

  • appID : 서비스의 이름이다.
  • instanceID : 서비스 중 특정 서버의 id
  • Content-Type : application/xml, json 지원

Resister(등록)

Eureka Client는 실행중인 instance의 정보(IP, Port 등)를 Eureka Server로 새로 등록합니다. 최초 Heartbeats에 등록된다.

OpertaionHTTP actionDescription
RegisterPOST/eureka/apps/{appID}
HTTP/1.1
Input: JSON/XML payload,
HTTP Code: 204 on success

Renew(갱신)

Eureka Client는 30초를 주기로 Eureka Server에 Heartbeats를 보낸다.
Server가 90초 동안 Heartbeats를 받지 못하면 Server의 정보 저장소에서 제거된다.

OpertaionHTTP actionDescription
heartbeatPUT/eureka/apps/{appID}instanceIDHTTP Code:
200on success
404 if instanceID doesn't exist

Fetch Registry(등록 정보 획득)

Eureka Client는 서버가 올라올 때 eureka Server에 있는 모든 정보를 가져와 local Cache에 저장한다. 그 후 이 정보를 http 통신에 이용한다. 이 정보는 이 정보는 매 주기 30초 마다 변경점에 대해서 부분 업데이트(delta)를 진행한다.

처음 모든 정보 가져오는 요청

OpertaionHTTP actionDescription
전체 업데이트GET/eureka/appsHTTP Code : 200 on success
Output: JSON/XML

30초에 한 번씩 변경된 정보 가져오는 요청

OpertaionHTTP actionDescription
부분 업데이트GET/eureka/apps/deltaHTTP Code : 200 on success
Output: JSON/XML

Cancel(취소)

Calcel의 경우 Eureka에 있는 본인의 instance를 삭제한다.
서비스가 종료될 때 Eureka-Client에서 Eureka-Server로 전송한다.
그리고 evictionDurationInSecs를 설정해서 eureka-server에 해당 시간동안 renew가 없다면 자동적으로 삭제된다.

  • 일정 시간 응답이 없거나, 서비스가 종료될 때 Eureka-Server에 종료요청
OpertaionHTTP actionDescription
De-registerDELETE/eureka/apps/appID/instanceIDHTTP Code : 200 on success

Time Lag(지연)

새로운 서버의 등록 및 기존 서버의 삭제에 대해서 모든 Client가 알기 까지는 시간적인 지연이 발생한다.
eureka Server가 정보 변경에 대해서 push하는 것이 아닌 각 Client가 주기적으로 polling하기 때문이다.
Eureka 문서에서는 모든 서버에 전송되기 까지는 최대 2분정도 걸릴 수 있다고 말한다.

Eureka 실습

Eureka Server 프로젝트 생성

  • dependencies

build.gradle

  • implementation 'org.springframework.boot:spring-boot-starter-web'

  • implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'

  • 스프링부트 메인 클래스에 어노테이션 추가

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}
  • application.yml
server:
  port: 8761

spring:
  application:
    name: eurekaServer
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

Eureka Client 프로젝트 생성

  • dependencies

build.gradle

  • implementation 'org.springframework.boot:spring-boot-starter-web'
  • implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
  • 스프링부트 메인 클래스에 어노테이션 추가
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

}
  • application.yml
server:
  port: 0

spring:
  application:
    name: eurekaClient
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone : http://127.0.0.1:8761/eureka
    instance:
      instance-id:${spring.cloud.client.hostname}:${spring.application.instance_id: ${random.value}}

테스트

  1. EurekaServer 실행

  2. EurekaClient 실행

  3. 서비스 등록 확인

참조 : https://sabarada.tistory.com/61

profile
개발자 호소인

0개의 댓글