본문 바로가기

개발(합니다)/Java&Spring

[spring boot 설정하기-17] spring cloud eureka(1) 설정 및 테스트 소스

반응형

동적으로 변하는 클라우드 환경에서 클라이언트가 여러개의 서비스 인터스턴스 중에서 원하는 인스턴스를 호출할 수 있도록 IP / Port / Instance ID를 보유하는 REST 기반 미들웨어 서버로 Service Registry입니다.

개요

AWS ELB(Elastic load Balancer)가 서버 사이드 디스커버리 패턴의 좋은 예입니다.

용어

  • Service Registration : 서비스가 자신의 정보를 Eureka 서버에 등록
  • Service Registry : 등록된 서비스들의 정보 목록
  • Service Discovery : 클라이언트가 요청을 보내려는 대상을 Service Registry를 통해 발견

구성

https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication

  • Eureka Client : 서비스들의 위치 정보를 Eureka에 정보를 요청
  • Eureka Service : Eureka Server에 등록을 요청
  • Eureka Server : 자기 자신을 등록하는 Server이고, 서비스 가능한 인스턴스 정보를 가지는 Server

클라이언트 사이드 디스커버리와 서버 사이드 디스커버리

클라이언트 사이드 디스커버리는 직접 서비스의 위치를 찾아서 호출하는 방식

서버 사이드 디스커버리는 proxy 서버인 로드 밸런서로 요청하는 방식

동작 흐름

  1. Register : 인스턴스는 자신의 정보를 서비스 레지스트리(Eureka Server)에 등록
  2. Renew : 서비스 레지스트리는 등록된 서비스 인스턴스의 상태를 30초마다 Heartbeat를 지속적으로 보내 lease를 갱신 및 체크
  3. Fetch Registry : 클라이언트는 로드밸런싱으로 서비스 레지스트리에 등록 된 인스턴스 중 하나와 통신
  4. Cancel : 인스턴스 종료 시 레지스트리는 인스턴스 정보 삭제

클라이언트 사이드 디스커버리와 서버 사이드 디스커버리

서비스 레지스트리

각 서비스 인스턴스의 네트워크 위치 정보를 항상 최신 정보로 유지해야 하고 고가용성이 필요합니다.

Eureka는 REST 기반 API를 제공하고 최초제 POST로 자신의 위치를 등록하고 30초마다 PUT 요청으로 갱신합니다.
DELETE나 time out으로 삭제되고 정보 조회는 GET으로 합니다.

서비스 등록

서비스 레지스트리에 등록하는 방법은 두 가지가 있습니다.

  • 셀프 등록 패턴 : 스스로 서비스에 등록을 관리
    등록과 삭제 등 관리를 스스로 하는 방식으로 주기적으로 자신이 살아 있다는 신호(Heartbeat)를 지속적으로 전송합니다.
    @EurekaClient가 해당됩니다.
  • 써드 파티 등록 패턴 : 제 3의 시스템에서 등록을 관리
    외부에 의해 등록과 삭제 등 관리를 위임하는 방식으로 각 인스턴스의 변화를
    폴링(Polling)이나 이벤트 구독으로 감지해서 서비스 레지스트리에 갱신합니다.

EurekaClient와 DiscoveryClient 차이

  • com.netflix.discovery.EurekaClient
    넷플릭스 유레카에서 제공하는 기능이며 유레카 서버가 노출하는 모든 HTTP API를 구현합니다.
  • org.springframework.cloud.client.discovery.DiscoveryClient
    넷플릭스 EurekaClient를 대체하는 스프링 클라우드의 구현체이며 모든 디스커버리 클라이언트용으로 사용합니다.
    getInstances(serviceId) 메소드를 통해서 특정 서비스ID를 이용하는 모든 서버 정보 조회
    getServices()를 통해 모든 서비스 ID값을 조회

Eureka 설정

Peering

여러대의 eureka server들을 peering 구성이 가능합니다.
Eureka server는 설정에 정의된 perr nodes를 찾고 Registry 정보를 Sync 합니다.

  • eureka.client.register-with-eureka: false // Standalone으로 구성
  • eureka.server.registry-sync-retrirs : 5 // Peer nodes로부터 registry를 갱신할 수 없는 경우 재시도 횟수
  • eureka.server.wait-time-in-ms-when-sync-empty : 3000 // Peer nodes로부터 registry를 갱신할 수 없는 경우 기다리는 밀리초

Self-Preservation-Mode(자가보존모드)

Eureka로 네트워크가 단절되었지만, 서비스 API를 호출하는데 문제가 없는 경우에는
self-preservation으로 registry에 문제된 instance를 정해진 기간 동안 제가하지 않습니다.
Eviction Task가 매분 마다 Expected heartbeats 수와 actual heartbeats 수를 비교하여
self-preservation 모드 여부를 결정합니다.

  • eureka.server.eviction-interval-timer-in-ms : 60 * 1000

Expected heartbeats updating scheduler

15분마다(renewal-threshold-update-interval-ms) 수행되며 perservation mode로 가기 위한 임계값을 계산합니다.

  • eureka.instance.lease-renewal-interval-in-seconds : 30
  • eureka.server.renewal-percent-threshold : 0.85
  • eureka.server.renewal-threshold-update-interval-ms : 15 60 1000 // scheduler 수행 주기 설정

Eureka registry caching

https://blogs.asarkar.com/technical/netflix-eureka/

  • eureka.server.response-cache-update-interval-ms: 3000 // server가 빠르게 자신의 registry 정보를 제공 시 사용하는 cache
  • eureka.client.registryFetchIntervalSeconds: 3 // client가 서비스 요청 시 사용하는 cache
  • ribbon.ServerListRefreshInterval: 3000 // Zuul, Feign에서 다른 서비스 호출 시 사용하는 cache

Eureka Server Setting

기본적으로 사용되는 설정

  • eureka.client.register-with-eureka: false -> Eureka Service에 자신을 등록하지 않는다
  • eureka.client.fetch-registry: false -> Registry 정보를 로컬에 캐싱하지 않는다
  • eureka.client.prefer-ip-address: true -> 서비스의 호스트 이름이 아닌 IP 주소를 Eureka에 등록하도록 지정

호스트가 아닌 IP 주소로 설정하는 이유

기본 값으로 Eureka는 호스트 이름으로 서비스에 등록하는데
DNS가 지원되는 서버 환경에서는 정상적으로 동작하지만
컨테이너 기반의 서버 환경에서는 임의로 생성된 호스트 이름을
부여받아 동작하기 때문에 정상적인 위치를 찾지 못해 문제가 됩니다.

또한, 한대의 서버에 하나 이상의 네트워크 인터페이스가 있는 경우 무시할 패턴을 작성해주저야 합니다.

spring:
  cloud:
    inetutils:
      ignored-interfaces: 
        - eth1*
      preferred-networks:
      - 192.168

레지스트 갱신

  • eureka.instance.lease-renewal-interval-in-seconds: 30 // 디스커버리한테 하트비트 전송 초
  • eureka.instance.lease-expiration-duration-in-seconds: 90 // 등록 해제 전 마지막 하트비트에서 기다린 후 등록 해제

인스턴스 식별자

서버에 전송해야 하는 고유 인스턴스 ID를 자동으로 생성할 수 있습니다.
아래와 같은 형태로 구성하면 됩니다.
${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:$server.port}}}

eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}

Eureka 클라이언트 HTTP API설명

POST /eureka/apps/appID 레지스트리에 새로운 서비스 인스턴스를 등록
DELETE /eureka/apps/appID/instanceID 레지스트리에서 서비스 인스턴스를 제거
PUT /eureka/apps/appID/instanceID 서버에 하트비트를 전송
GET /eureka/apps 등록된 모든 서비스 인스턴스의 상세 정보를 조회
GET /eureka/apps/appID 특정 서비스의 모든 인스턴스의 상세 정보를 조회
GET /eureka/apps/appID/instanceID 특정 서비스의 특정 인스턴스의 상세 정보를 조회
GET /eureka/apps/appID/instanceID/metadata?key=value 메타 정보 입력값을 갱신
GET /eureka/instances/instanceID 특정 ID를 사용하는 모든 등록된 인스턴스의 상세 정보를 조회
PUT /eureka/apps/appID/instanceID/status?value=DOWN 인스턴스의 상태를 갱신

관련 정보는 아래 사이트에서 확인할 수 있십니다.
cloud.spring.io/spring-cloud-static/Dalston.SR5/multi/multi__appendix_compendium_of_configuration_properties.html

cloud.spring.io/spring-cloud-netflix/multi/multi__service_discovery_eureka_clients.html

https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-eureka-server.html

반응형