개발
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이다.
Eureka Server는 REST 기반으로 동작하기 한다.
따라서 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