Spring Cloud Netflix Eureka
- 마이크로 서비스의 정보를 Registry에 등록할 수 있도록 하고 동적인 탐색과 로드 밸런싱을 제공
- AWS와 같은 Cloud 시스템에서 서비스의 로드 밸런싱과 실패 처리 등을 유연하게 가져가 위해
각 서비스들의 IP / Port / InstanceId를 가지고 있는 REST 기반의 미들웨어 서버 - 유레카는 Middle-Tier Load Balancer로 정의
- 전통적인 로드밸런싱의 경우 서비스의 위치가 고정되어 있었지만 AWS와 같은 클라우드 환경에서는 서버의 위치가 동적으로 변동되기 때문에 개발자가 직접 이를 컨트롤 하기는 어려움
→ 하지만, AWS에서는 middle-tier load balancer를 제공하지 않기 때문에 유레카는 더 많은 관심을 받는다고 함
MSA에서의 Eureka
- 마이크로서비스 아키텍처에서 유레카는 Client Side Discovery
- 시스템은 트래픽에 따라 동적으로 증가하거나 감소할 수 있는데, 이러한 환경에서 서비스의 Host와 Port가 동적으로 변하더라도 서비스 인스턴스를 호출할 수 있도록 해주는 Service Registry를 제공 및 관리
Discovery
- 각 서비스의 위치가 등록된 서버에서 특정 작업을 위한 서버의 위치를 파악하는 작업
- 즉, 각 서비스 인스턴스들이 동적으로 확장, 축소 되어도 인스턴스 상태를 하나의 서비스로 관리할 수 있는 서비스로 생각하면 됨
- MSA에선 Service의 IP와 Port가 일정하지 않고 지속적을 변화하기 때문에 Client에 Service의 정보를 수동으로 입력하는 것은 한계가 분명함
- 즉, Service Discovery는 MSA의 상황에 적합
- 이때, MSA의 핵심 원칙 중 하나인 Service Discovery의 역할을 수행하기 위해 Eureka Server를 사용
Registry
- 각 서비스가 자신의 위치(IP) 정보를 특정 서버에 등록하는 작업
- 이때, MSA의 핵심 원칙 중 하나인 Service Discovery의 역할을 수행하기 위해 Eureka Client를 사용
Eureka Client
- 각각의 서비스에 해당하는 모듈로 생각
- 스스로 Eureka Server에 등록 (IP, PORT, InstanceId)
- Eureka Server로부터 저장된 Registry 정보를 수신하여 자신의 로컬에 저장
→ 다른 Client의 정보를 알 수 있음 - 처음 모든 정보를 로컬에 저장하고 일정 시간마다 변경되어 정보를 Eureka Server로 요청
Eureka Server
- Eureka Client를 관리하는 서버
- Eureka Client의 정보를 Registy에 등록
- Eureka Client의 Heartbeat Client를 수신하여 해당 Client를 Health Check
- Heartbeat가 정상적으로 수신되지 않은 경우엔 Server는 Client가 수행 중이지 않다고 판단해 해당 Client Registry 정보를 삭제
- 여러 인스턴스를 클러스터로 구성해 가용성을 높이기 위해 Peering 지원
Eureka의 흐름
- Eureka Client 서비스가 시작될 때 Service Registry 기능을 할 Eureka Server에 자신의 정보를 등록
- Eureka Client는 Eureka Server로부터 다른 Client의 연결 정보가 등록된 Registry를 받아 자신의 로컬에 저장
- 주기적으로 Eureka Server로부터 변경 사항을 갱신
- 일정 시간 마다 Ping을 통해 자신이 동작하고 있다는 신호 전송
- 신호를 보내지 못하면 Eureka Server가 보내지 못한 Client를 Registry에서 제외
용어 정리
- Service Registration
- Client(마이크로 서비스)가 자신의 정보를 유레카에 등록하는 행동
- Service Registry
- Client의 정보들을 저장하는 위치
- Service Discovery
- 클라이언트가 Service Registry에서 요청을 보내야하는 대상을 찾는 과정
- 요청에 맞는 Service를 찾는 과정으로 이해 됨
- Eureka Client
- 다른 서비스의 위치 정보를 알아내기 위해 유레카 서버에 질의하는 서비스
- Eureka Server
- 유레카 서비스가 자기 자신을 등록(Service Registration)하고 Eureka Client가 Eureka Service를 찾기 위해 가용 서비스 목록(Service Registry)를 요청하는 서버
- 즉, Eureka Service들이 저장된 위치로 이해 됨
- Eureka Service
- 유레카 Client가 요청하였을 때 발견의 대상이 되는 서비스
- 즉, 유레카에 등록된 Service
- Eureka Instance
- 유레카에 등록되어 Service Registry에서 조회 가능한 Eureka Service
- Fetch Registry
- Client는 Server로 부터 Service Registry 정보를 가져와 로컬 캐시로 저장하고 일정 주기마다 업데이트
- Cancel
- Client가 종료될 때 유레카 서버로 Cancel 요청을 보내서 Service Registry에서 즉시 제거
- Time Lag
- 유레카 서버의 Service Registry가 변경된 후 Client가 새로 Fetch 하기 전까지의 데이터의 차이
- Renew
- Client는 유레카에 등록된 이후 설정된 주기마다 heartbeat를 전송하여 자신의 존재를 알리는데, 유레카 서버는 설정된 시간동안 heartbeat를 받지 못하면 Eureka Instance를 Service Registry에서 제거
- Renew Interval은 서버 내부적으로 유레카 클라이언트를 관리하는 로직이 있기 때문에 변경하는 것을 권장하지 않음
- Peering
- 여러 대의 유레카 서버를 사용할 경우 서로 통신할 수 있도록 구성 필요
→ Peering 구성
- 여러 대의 유레카 서버를 사용할 경우 서로 통신할 수 있도록 구성 필요
- Self-Preservation Mode
- 유레카 인스턴스가 요청을 처리할 수는 있지만 단순 Heartbeat를 전송하지 못하는 상황을 대비하여 self-preservation을 사용
- 이는 registry에서 문제된 인스턴스를 지정한 시간동안 제거하지 않을 수 있음
멀티모듈을 사용한 Eureka 사용 예제
1. 프로젝트 생성
2. src 삭제
- 루트 프로젝트는 하위 모듈만 담당하기 때문에 src 삭제
3. 새 모듈 추가
- 루트 프로젝트(eureka-example) 마우스 우클릭 - New(Alt + Insert) → module 클릭
- 의존성 Eureka Server 추가
4. 새 모듈 추가
- 의존성 Eureka Discovery Client, Spring Web 추가
5. 루트 프로젝트의 settings.gradle에 새로 추가된 모듈 포함
6. eureka-server 모듈 application.yml 설정
spring:
application:
name: eureka-server
server:
port: 8888
# Eureka Server Setting
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone : http://localhost:8888/eureka
register-with-eureka: false
fetch-registry: false
- eureka.client.serve-url.defaultZone
- eureka는 여러 instance를 두고 여러 서버를 둘 수 있음
- 이 부분의 역할은 이 여러 인스턴스를 연동해서 하나의 유레카 서버가 다운 될 경우 다른 유레카 서버의 정보를 사용하여 각 client들의 기본 정보등을 불러 올 수 있게 함
- eureka.client.register-with-eureka
- 클라이언트 단으로 등록 할 지 여부를 묻는 것
- Eureka Server이기 때문에 false (기본값 true)
- eureka.client. fetch-registry
- 서버로 부터 registry 정보를 30초마다 수신하여 캐싱
- 클라이언트가 Server에게 받는 것이기 때문에 false (기본값 true)
7. @EnableEurekaServer 어노테이션 추가
- Application에 EurekaServer를 쓴다고 알려줌
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
8. eureka-client 모듈 application.yml 설정
spring:
application:
name: api-gateway
# Eureka Server Setting
eureka:
client:
service-url:
defaultZone : http://localhost:8888/eureka
register-with-eureka: true
fetch-registry: true
- spring.application.name
- 유레카에 등록될 이름
- eureka.client.serve-url.defaultZone
- 유레카 서버에 등록 ⇒ registry
9. @EnableDiscoveryClient 어노테이션 추가
- @EnableDiscoveryClient는 굳이 적지 않아도 기본적으로 지원한다고 함
- 즉, application.yml 파일만 설정해도 무관
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
10. 두 모듈 모두 실행 후 localhost:8888 접속
- Eureka Client에 설정한 이름인 api-gateway로 등록(registry)가 된 것 확인
11. Eureka Client 강제 종료
- Eureka Client를 종료하자마자 유레카 서버를 새로 고침
- API-GATEWAY가 정상 실행(UP) 상태가 아니게 되어 상태가 DOWN으로 변경
- 다시 새로 고침 시 어떠한 인스턴스도 등록되지 않음
'MicroService Architecture' 카테고리의 다른 글
FeignClient(OpenFeign) 사용 이유, 예제 (0) | 2024.08.21 |
---|---|
Feign Client / Web Client / RestTemplate (0) | 2024.08.21 |
Service Discovery 개념, 종류, 특징 (0) | 2024.08.20 |
Spring Cloud란? (0) | 2024.08.20 |
API Gateway란? (0) | 2024.08.20 |