개발

Eureka - [Spring Cloud]

Loopy_SEOB 2022. 12. 29. 14:28

Eureka?

 

Cloud 환경의 다수의 서비스(ex. api server)들의 Load Balancing 및 Health check, 장애 조치 목적을 가진 Middleware Server.

  • Load Balance : 특정 서비스를 운영하는 서버들이 존재 할때 한 서버에 트래픽이 몰리지 않게 트래픽을 분산 시켜주는 기술
  • Middleware : 데이터를 주고받는 서비스와 서비스의 사이의 중간의 매개체 역할 

Eureka는 middleware 기능을 수행하기 위해 각 연결된 서비스의 IP, Port, Instance Id(host name)를 소유하고 있고,

REST방식으로 동작하며, MSA의 핵심 중 하나인 Service Discovery 역할을 수행한다 (지속적으로 변동하는 서비스의 IP,Port를 확인)

 

Client - Server방식으로 동작하며 Eureka Server에 등록된 서비스는 Eureka Client이다.

이미지 출처 https://coe.gitbook.io/guide/service-discovery/eureka

Eureka ServerREST 기반으로 동작하기 한다.

따라서 HTTP통신을 이용해 Eureka Client Register, Fetch, Heartbeats, Delete 등 다양한 기능을 수행할 수 있다.

Operation Http Action  Description
Client Register POST |  /eureka/apps/{appId} Input: JSON/XML payload, 아래 참조 HTTP Code: 204 on success
Client Delete DELETE | /eureka/apps/appId/InstanceId HTTP Code:
200 on success
Heartbeats(Renew) PUT | /eureka/apps/appId/InstanceId HTTP Code: 
* 200 on success 
* 404 if instanceID doesn’t exist
Client Fetch Registry  GET | /eureka/apps
GET | /eureka/apps/delta
HTTP Code: 200 on success Output: JSON/XML
  • Register
    • Eureka Client는 실행중인 Instance의 Ip, Port등 정보를 Eureka Server에 등록 한다. 
  • Delete
    • Eureka에 있는 본인의 Instance를 삭제한다. 서비스가 종료 될 때 Client에서 Server로 전송한다. 
  • HeartBeats(Renew)
    • Eureka Client는 30초를 주기로 Eureka Server에 HeartBeats를 보내고, Server는 Client로 부터 90초 동안 HeartBeat요청이 없으면 해당 Client를 제거한다
  • Fetch Registry
    • Eureka Client는 Server가 올라올 때 Eureka Server에 올라와 있는 모든 정보를 가져와 local cache에 저장한다. 이후 cache에 저장된 정보를 http 통신에 사용한다 (매 30초를 주기로 변경되는 부분에 대해 부분 업데이트를 진행한다 - delta update)

 

Eureka Server 구성

Gradle

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

Spring

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

application.yml

server:
  port: 8092

spring:
  application:
    name: discovery-service

eureka:
  client:
    register-with-eureka: false # Eureka server를 Registry 등록 여부
    fetch-registry: false       # Registry select 여부

 

Eureka Client 구성

Gradle

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

Spring

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

application.yml

spring:
  application:
    name: eureka-client-loo

server:
  port: 8081

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8092/eureka <-Eureka Server