Spring Cloud Eureka

박다현·2022년 3월 14일
3
post-thumbnail

MSA가 여러 서비스 간의 호출로 이루어지고 한 서비스가 다른 서비스를 호출할 때 서비스의 위치를 알아낼 수 있는 기능이 필요하다고 이 포스트에서 알아보았다. Service Discovery
이를 Service Discovery 라고 한다고 했는데, Client-Side-Discovery 의 한 예가 Eureka 였다.

Eureka

Eureka 는 Register, Discovery, Loadbalancing 등을 담당하여 서비스 디스커버리 패턴을 구현할 수있도록 도와준다 서비스들의 IP, Port, Instance ID를 가지고 있는 REST 기반의 미들웨어 서버이다 클라이언트쪽 loadbalancing 을 위해 내부적으로 Ribbon 을 사용하므로 별도로 Ribbon 을 사용하지 않는다

Eureka 는 서버와 클라이언트로 이루어져 있다

  • Eureka Server
    • 모든 마이크로 서비스가 자신의 위치정보를 등록하는 레지스트리
    • 등록되는 정보는 서비스 id와 url을 포함
  • Eureka Client
    • 등록된 다른 마이크로 서비스를 호출할 때 client 를 통해 discovery
    • 유레카 서버를 client 로 등록한다면 여러 유레카 서버 운영 시에 서로의 상태를 동기화 함

Eureka Server-Client 간 통신

Register

  • 서비스 부트시에 Eureka Client는 실행중인 instance의 정보(IP, Port) 등을 Eureka Server 로 등록

Renew

  • Eureka Client는 30초 주기로 Eureka Server 에 heartbeats 를 보냄
  • Eureka Server 가 90초 동안 heartbeats를 받지 못하면 server의 registry에서 제거

Fetch Registry

  • Eureka Client는 Eureka Server가 새로 부트업이 될 때, Server의 모든 정보를 가져와 local Cache에 저장
  • 이 정보는 매 주기 30초마다 변경점에 대해서만 부분업데이터(delta) 진행

Cancel

  • 서비스가 종료될 때 Eureka Client 에서 Eureka Server 로 본인의 instance 삭제 요청
  • evitctionDuratioInSecs를 설정되어 있으면 해당 시간동안 renew가 없다면 자동적으로 삭제

Time Lag

  • 새로운 서버의 등록 및 기존 서버의 삭제에 대해 모든 Client가 알기 까지는 시간적인 지연 발생
  • Client가 정보 변경에 대해 polling 하기 때문
  • 최대 2분 소요

Eureka Client Graceful Shutdown

  • Spring Boot Actuator
    • 어플리케이션의 상태와 여러지표들을 API로 제공
    • 어플리케이션 조작(shutdown, restart, pause)
  • Eureka Client 는 Actuator 에 /actuator/shutdown API가 호출될 시 Eureka Server에 알리는 기능 존재
  • Actuator Shutdown 는 default 가 disable 이므로 활성화시킴

Eureka Configuration

유레카 설정은 세 부분으로 나뉜다.

Server Config

  • enable-self-preservation
    • 자기 보존 모드
    • default = true
    • client 가 자신의 상태를 제 시간에 갱신하지 않는 수가 일정 수가 넘게 되면 등록 만료를 멈춤
    • 네트워크 장애가 발생 시 등록된 모든 서비스가 해제되는 것 방지
    • 활성화 시 registry에서 해당 instance 를 정해진 기간동안 제거하지 않음
    • 활성화 여부는 Expected heartbeats 와 actual heartbeats 수를 비교하여 결정
  • eviction-interval-time-in-ms
    • client로 부터 heartbeat가 없으면 제거하는 시간
    • default = 60 * 1000, 즉 60초
  • response-cache-update-interval-ms
    • Eureka REST API에서 응답을 캐시하는 시간
    • default = 30 * 1000, 즉 30초
    • 해당 시간이 지나야만 REST API에서 client 등록 정보가 바뀐 것을 표시한다

Client Config

  • register-with-eureka
    • 유레카에 등록 여부
    • default = true
  • fetch-registry
    • 유레카에서 조회하는지 여부
    • default = true
  • registry-fetch-interval-seconds
    • client 쪽에서 eureka registry를 캐싱하는 시간
    • default = 30, 즉 30초

Instance Config

  • lease-renewal-interval-in-seconds
    • heartbeat를 server 에 보내는 시간
    • default = 30, 즉 30초
    • client 에서 설정
  • lease-expiration-duration-in-seconds
    • 해당시간동안 heartbeat가 수신되지 않으면 eureka 에서 해당 instance 제거
    • default = 90, 즉 90초
    • client 에서 설정
  • prefer-ip-address
    • 유레카 등록 시 host name 대신 ip 주소 사용
    • default = false
    • 컨테이너 기반 배포에서 컨테이너는 DNS 엔트리가 없는 임의의 생성된 host name 을 부여받아 시작하므로 해당 값이 false 인 경우에는 hostname 위치를 얻지 못함
    • 이 때, 한 서버에 2개 이상의 네트워크 인터페이스가 있는 경우 문제 발생
      • 이럴 때는 네트워크 인터페이스를 선택하거나 원하는 네트워크 주소를 정의

  • intance-id
    • eureka에 등록되는 id 값
    • 중복되는 경우 마지막 instance
    • default = ${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:$server.port}}}

Reference

https://sabarada.tistory.com/61
https://www.4te.co.kr/931
https://authentication.tistory.com/24
https://github.com/spring-cloud/spring-cloud-netflix

0개의 댓글