MSA 아키텍처에서 client-side service discovery
역할을 한다.
컨테이너 pod는 언제든 꺼졌다가 켜졌다가 할 수 있으므로 host와 port가 동적으로 변하더라도 서비스 인스턴스를 관리할 수 있어야 한다.
이를 도와주는 것이 Spring Cloud의 Eureka Server인 것이다.
유레카는 middle-tier load balancer
로 정의된다.
middle-tier load balancer
는 로드밸런싱과 장애복구가 가능한 서비스 환경을 구성했을 때 클라이언트에게 사용 가능한 서비스의 위치 정보를 동적으로 제공해야한다.
클라우드 환경에서는 서버의 위치가 동적으로 변하고 있기에 더욱 주목받는 기술이다.
Service Registration
: Client(마이크로서비스)가 자신의 정보를 유레카에 등록하는 행동을 의미한다.
Service Registry
: Client의 정보들(목록, 가용 Client의 위치)을 저장하는 위치
Service Discovery
: 클라이언트가 Service Registry에서 요청을 보내야하는 대상을 찾는 과정
Eureka Client
: 다른 서비스의 위치 정보를 알아내기 위해 유레카 서버에 질의하는 서비스
Eureka Service
: 유레카 Client가 요청하였을 때 발견의 대상이 되는 서비스 즉, 유레카에 등록되어 있는 Service라고 볼 수 있다.
Eureka Server
: 유레카 서비스가 자기 자신을 등록(Service Registration)하고 Eureka Client가 Eureka Service를 찾기 위해 가용 서비스 목록(Service Registry)를 요청하는 서버다.
Eureka Instance
: 유레카에 등록되어 Service Registry에서 조회 가능한 Eureka Service를 의미한다.
Renew
:
Client는 유레카에 등록된 이후 설정된 주기마다 heartbeat를 전송하여 자신의 존재를 알린다. (eureka.instance.lease-renewal-interval-in-seconds(default: 30))
유레카 서버는 설정된 시간동안 heartbeat를 받지 못하면 heartbeat를 전송하지 않은 Eureka Instance를 Service Registry에서 제거한다. (eureka.instance.lease-expiration-duration-in-seconds(default: 90))
Renew Interval은 서버 내부적으로 유레카 클라이언트를 관리하는 로직이 있기 때문에 변경하는 것을 권장하지 않는다.
Fetch Registry
: Client는 Server로 부터 Service Registry 정보를 가져와서 로컬 캐시로 저장해두고 일정 주기마다 업데이트 한다. (eureka.client.registryFetchIntervalSeconds(default: 30))
Time Lag
: 유레카 서버의 Service Registry가 변경되어도 Client가 새로 Fetch 하기 전까지는 데이터의 차이가 있을 수 있다. 이러한 차이를 Time Lag라고 부른다.
프로젝트를 만들 때 spring discovoery에서 eureka server
를 체크해주고 만들어준다.
동적 변경 확인을 위해 actuator 설정을 넣어준다.
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
spring:
cloud:
config:
uri: http://localhost:8888
name: eureka
profile: default
management:
endpoints:
web:
exposure:
include: health, refresh
Config Server에서 설정값을 가져오기 위해 우선적으로 리딩되는 bootstrap.yml
에 Config Server를 바라보게 하는 설정을 넣어주고, running-server.com/actuator/refresh
에 post요청을 해 변경된 설정 파일을 바로 적용하기 위해 management 설정을 넣어주었다. actuator 부분에 대해선 다음 포스팅에서 자세히 다루어보도록 하겠다.