[spring] Spring Cloud Eureka Server 자체 보존 및 갱신 임계 값 이해

나는 마이크로 서비스 개발에 익숙하지 않지만 Spring의 문서와 Netflix의 문서를 모두 읽으며 한동안 조사해 왔습니다.

Github에서 사용할 수 있는 간단한 프로젝트를 시작했습니다 . 기본적으로 Eureka 서버 (Archimedes)와 3 개의 Eureka 클라이언트 마이크로 서비스 (공용 API 1 개, 개인용 2 개)입니다. 자세한 설명은 github의 readme를 확인하십시오.

요점은 모든 것이 실행 중일 때 개인 마이크로 서비스 중 하나가 죽으면 Eureka 서버가이를 인식하고 레지스트리에서 제거하기를 원한다는 것입니다.

나는 유래에이 문제를 발견 하고, 솔루션을 사용하여 전달 enableSelfPreservation:false유레카 서버 설정에서. 잠시 후이 작업을 수행하면 종료 된 서비스가 예상대로 사라집니다.

그러나 다음 메시지를 볼 수 있습니다.

자체 보존 모드가 꺼져있어 네트워크 / 기타 문제 발생시 인스턴스 만료를 보호하지 못할 수 있습니다.

1. 자기 보존의 목적은 무엇입니까? 문서의 상태가에 자기 보존과 “클라이언트가 더 이상 존재하지 않는 인스턴스를 얻을 수 있습니다” . 그렇다면 언제 켜고 끄는 것이 좋습니까?

또한 자체 보존이 켜져 있으면 Eureka 서버 콘솔 경고에 미해결 메시지가 표시 될 수 있습니다.

비상 사태! EUREKA는 그렇지 않은 경우 인스턴스가 잘못 청구되었을 수 있습니다. 갱신은 임계 값보다 적으므로 인스턴스는 안전을 위해 만료되지 않습니다.

이제 Spring Eureka Console로 진행합니다.

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

임계 값 수의 이상한 동작을 발견했습니다. Eureka 서버 만 시작하면 임계 값이 1입니다.

2. 단일 Eureka 서버가 있고 registerWithEureka: false다른 서버에 등록하지 못하도록 구성되어 있습니다. 그러면 임계 값 개수에 왜 표시됩니까?

3. 모든 클라이언트에 대해 임계 값 카운트가 +2만큼 증가합니다. 분당 2 개의 갱신 메시지를 보내서 그런 것 같아요, 맞죠?

4. Eureka 서버는 갱신을 보내지 않으므로 마지막 갱신 시간은 항상 임계 값 미만입니다. 이것은 정상입니까?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

서버 cfg :

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

클라이언트 1 cfg :

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true



답변

@codependent가 만난 것과 같은 질문을 받았습니다. 저는 많은 검색을했고 몇 가지 실험을했습니다. 여기에 유레카 서버와 인스턴스가 어떻게 작동하는지에 대한 지식을 제공하기 위해 왔습니다.

모든 인스턴스는 30 초당 한 번의 빈도로 Eureka Server에 대한 임대를 갱신해야하며 eureka.instance.leaseRenewalIntervalInSeconds.

Renews (마지막 분) : 마지막 순간에 Eureka 인스턴스에서받은 갱신 횟수를 나타냅니다.

Renews threshold : Eureka 서버가 분당 Eureka 인스턴스에서 수신 할 것으로 예상하는 갱신 수입니다.

예를 들어, registerWithEureka로 설정 거짓 , eureka.instance.leaseRenewalIntervalInSeconds30로 설정하고 2 유레카 인스턴스를 실행됩니다. 두 개의 Eureka 인스턴스는 분당 4 개의 갱신을 Eureka 서버로 전송 하고 Eureka 서버 최소 임계 값은 1 (코드로 작성)이므로 임계 값은 5입니다 (이 숫자는 eureka.server.renewalPercentThreshold나중에 설명 할 요소 를 곱할 것입니다).

자체 보존 모드 : 갱신 (마지막 분)갱신 임계 값 미만일 경우 자체 보존 모드가 활성화됩니다.

따라서 위의 예에서는 임계 값이 5이기 때문에 SELF PRESERVATION MODE가 활성화되었지만 Eureka 서버는 분당 4 개의 갱신 만받을 수 있습니다.

  1. 질문 1:

SELF PRESERVATION MODE는 네트워크 연결 불량을 방지하기위한 것입니다. Eureka 인스턴스 A와 B 간의 연결은 좋지만 B는 연결 문제로 인해 단기간에 Eureka 서버에 대한 임대를 갱신하지 못했습니다. 현재 Eureka 서버는 단순히 인스턴스 B를 킥아웃 할 수 없습니다. A는 B를 사용할 수 있지만 Eureka 서버에서 등록 된 서비스를 사용할 수 없습니다. 그래서 이것이 SELF PRESERVATION MODE의 목적이며, 켜는 것이 좋습니다.

  1. 질문 2 :

최소 임계 값 1이 코드에 기록됩니다. registerWithEurekafalse로 설정되어 있으므로 Eureka 인스턴스 레지스터가 없으며 임계 값은 1이됩니다.

프로덕션 환경에서는 일반적으로 두 개의 Eureka 서버를 배포 registerWithEureka하며 true로 설정됩니다. 따라서 임계 값은 2가되고 Eureka 서버는 분당 2 회 자체 임대를 갱신하므로 RENEWALS ARE LESSER THAN THRESHOLD문제가되지 않습니다.

  1. 질문 3 :

그래 네가 맞아. eureka.instance.leaseRenewalIntervalInSeconds분당 서버로 전송되는 갱신 횟수를 정의하지만 eureka.server.renewalPercentThreshold위에서 언급 한 계수를 곱할 것이며 기본값은 0.85입니다.

  1. 질문 4 :

네, 정상입니다. 초기 임계 값이 1로 설정되어 있기 때문입니다. 따라서 registerWithEureka가 false로 설정되면 갱신 횟수가 항상 임계 값 미만입니다.

이에 대한 두 가지 제안이 있습니다.

  1. 두 개의 Eureka 서버를 배포하고 registerWithEureka.
  2. 데모 / 개발 환경에서 배포하려는 경우 eureka.server.renewalPercentThreshold0.49로 설정할 수 있으므로 Eureka 서버 만 시작하면 임계 값이 0이됩니다.


답변

여기 에 Eureka에 대한 세부 정보가 포함 된 블로그 게시물을 만들었습니다. Spring doc 또는 Netflix 블로그에서 누락 된 세부 정보를 채 웁니다. 며칠 동안 소스 코드를 디버깅하고 파헤친 결과입니다. 외부 URL에 연결하는 것보다 복사하여 붙여 넣는 것이 더 낫다는 것을 이해하지만 내용이 너무 커서 SO 답변에 적합하지 않습니다.


답변

유레카 서버 속성에서 갱신 임계 값 제한을 설정할 수 있습니다. 유레카에 등록 할 마이크로 서비스가 약 3 ~ 4 개있는 경우 다음과 같이 설정할 수 있습니다.

eureka.server.renewalPercentThreshold=0.33


답변