나는 마이크로 서비스 개발에 익숙하지 않지만 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.leaseRenewalIntervalInSeconds
30로 설정하고 2 유레카 인스턴스를 실행됩니다. 두 개의 Eureka 인스턴스는 분당 4 개의 갱신을 Eureka 서버로 전송 하고 Eureka 서버 최소 임계 값은 1 (코드로 작성)이므로 임계 값은 5입니다 (이 숫자는 eureka.server.renewalPercentThreshold
나중에 설명 할 요소 를 곱할 것입니다).
자체 보존 모드 : 갱신 (마지막 분) 이 갱신 임계 값 미만일 경우 자체 보존 모드가 활성화됩니다.
따라서 위의 예에서는 임계 값이 5이기 때문에 SELF PRESERVATION MODE가 활성화되었지만 Eureka 서버는 분당 4 개의 갱신 만받을 수 있습니다.
- 질문 1:
SELF PRESERVATION MODE는 네트워크 연결 불량을 방지하기위한 것입니다. Eureka 인스턴스 A와 B 간의 연결은 좋지만 B는 연결 문제로 인해 단기간에 Eureka 서버에 대한 임대를 갱신하지 못했습니다. 현재 Eureka 서버는 단순히 인스턴스 B를 킥아웃 할 수 없습니다. A는 B를 사용할 수 있지만 Eureka 서버에서 등록 된 서비스를 사용할 수 없습니다. 그래서 이것이 SELF PRESERVATION MODE의 목적이며, 켜는 것이 좋습니다.
- 질문 2 :
최소 임계 값 1이 코드에 기록됩니다. registerWithEureka
false로 설정되어 있으므로 Eureka 인스턴스 레지스터가 없으며 임계 값은 1이됩니다.
프로덕션 환경에서는 일반적으로 두 개의 Eureka 서버를 배포 registerWithEureka
하며 true로 설정됩니다. 따라서 임계 값은 2가되고 Eureka 서버는 분당 2 회 자체 임대를 갱신하므로 RENEWALS ARE LESSER THAN THRESHOLD
문제가되지 않습니다.
- 질문 3 :
그래 네가 맞아. eureka.instance.leaseRenewalIntervalInSeconds
분당 서버로 전송되는 갱신 횟수를 정의하지만 eureka.server.renewalPercentThreshold
위에서 언급 한 계수를 곱할 것이며 기본값은 0.85입니다.
- 질문 4 :
네, 정상입니다. 초기 임계 값이 1로 설정되어 있기 때문입니다. 따라서 registerWithEureka
가 false로 설정되면 갱신 횟수가 항상 임계 값 미만입니다.
이에 대한 두 가지 제안이 있습니다.
- 두 개의 Eureka 서버를 배포하고
registerWithEureka
. - 데모 / 개발 환경에서 배포하려는 경우
eureka.server.renewalPercentThreshold
0.49로 설정할 수 있으므로 Eureka 서버 만 시작하면 임계 값이 0이됩니다.
답변
여기 에 Eureka에 대한 세부 정보가 포함 된 블로그 게시물을 만들었습니다. Spring doc 또는 Netflix 블로그에서 누락 된 세부 정보를 채 웁니다. 며칠 동안 소스 코드를 디버깅하고 파헤친 결과입니다. 외부 URL에 연결하는 것보다 복사하여 붙여 넣는 것이 더 낫다는 것을 이해하지만 내용이 너무 커서 SO 답변에 적합하지 않습니다.
답변
유레카 서버 속성에서 갱신 임계 값 제한을 설정할 수 있습니다. 유레카에 등록 할 마이크로 서비스가 약 3 ~ 4 개있는 경우 다음과 같이 설정할 수 있습니다.
eureka.server.renewalPercentThreshold=0.33