tutorial - Comprender el umbral de renovación y renovación de Spring Cloud Eureka Server
spring-cloud-starter-zuul (3)
He creado una publicación de blog con los detalles de Eureka here , que completa algunos detalles faltantes de Spring doc o el blog de Netflix. Es el resultado de varios días de depuración y excavación a través del código fuente. Entiendo que es preferible copiar y pegar en lugar de vincular a una URL externa, pero el contenido es demasiado grande para una respuesta SO.
Soy nuevo en el desarrollo de microservicios, aunque lo he estado investigando durante un tiempo, leyendo tanto los documentos de Spring como los de Netflix.
He comenzado un proyecto simple disponible en Github . Básicamente es un servidor Eureka (Arquímedes) y tres microservicios de cliente Eureka (una API pública y dos privadas). Consulte el archivo Léame de github para obtener una descripción detallada.
El punto es que cuando todo se está ejecutando, me gustaría que si se mata uno de los microservicios privados, el servidor Eureka se da cuenta y lo elimina del registro.
Encontré esta pregunta en Stackoverflow
, y la solución pasa usando
enableSelfPreservation:false
en la configuración del servidor Eureka.
Al hacer esto después de un tiempo, el servicio asesinado desaparece como se esperaba.
Sin embargo, puedo ver el siguiente mensaje:
EL MODO DE AUTO CONSERVACIÓN ESTÁ APAGADO. ESTO NO PUEDE PROTEGER LA VENCIMIENTO DE LA INSTANCIA EN CASO DE PROBLEMAS DE RED / OTROS.
1. ¿Cuál es el propósito de la autoconservación? El doc establece que con la autoconservación en "los clientes pueden obtener las instancias que ya no existen" . Entonces, ¿cuándo es aconsejable tenerlo encendido / apagado?
Además, cuando la autoconservación está activada, puede recibir un mensaje sobresaliente en la advertencia de la consola del servidor Eureka:
¡EMERGENCIA! EUREKA PUEDE ESTAR RECLAMANDO INCORRECTAMENTE LAS INSTANCIAS QUE ESTÁN ARRIBA CUANDO NO ESTÁN. LAS RENOVACIONES SON MENORES QUE UMBRAL Y POR LO TANTO LAS INSTANCIAS NO SE VENCIAN SOLO PARA SER SEGURAS.
Ahora, continúa con la consola Spring Eureka.
Lease expiration enabled true/false
Renews threshold 5
Renews (last min) 4
Me he encontrado con un comportamiento extraño del recuento de umbral: cuando inicio el servidor Eureka solo, el umbral es 1.
2. Tengo un único servidor Eureka y estoy configurado con
registerWithEureka: false
para evitar que se registre en otro servidor.
Entonces, ¿por qué aparece en el recuento de umbral?
3. Para cada cliente que comienzo, el recuento de umbral aumenta en +2. Supongo que es porque envían 2 mensajes de renovación por minuto, ¿estoy en lo cierto?
4. El servidor Eureka nunca envía una renovación, por lo que el último minuto de renovación siempre está por debajo del umbral. ¿Esto es normal?
renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4
Servidor 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
Cliente 1 cfg:
spring:
application:
name: random-image-microservice
server:
port: 9999
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
healthcheck:
enabled: true
Puede intentar establecer el límite de umbral de renovación en las propiedades de su servidor eureka. Si tiene alrededor de 3 a 4 microservicios para registrarse en eureka, puede configurarlo así:
eureka.server.renewalPercentThreshold=0.33
Recibí la misma pregunta que @codependent se reunió, busqué mucho en Google e hice algunos experimentos, aquí vengo a aportar algunos conocimientos sobre cómo funcionan el servidor Eureka y la instancia.
Cada instancia debe renovar su contrato de arrendamiento con Eureka Server con una frecuencia de una vez cada 30 segundos, que se puede definir en
eureka.instance.leaseRenewalIntervalInSeconds
.
Renovaciones (último minuto) : representa cuántas renovaciones recibió de la instancia de Eureka en el último minuto
Umbral de renovaciones: las renovaciones que el servidor de Eureka espera recibir de la instancia de Eureka por minuto.
Por ejemplo, si
registerWithEureka
se establece en
falso
,
eureka.instance.leaseRenewalIntervalInSeconds
se establece en 30 y ejecuta 2 instancias de Eureka.
Dos instancias de Eureka enviarán
4
renovaciones al servidor de Eureka por minuto, el umbral mínimo del servidor de Eureka es
1
(escrito en el código), por lo que el umbral es
5
(este número multiplicará un factor
eureka.server.renewalPercentThreshold
que se discutirá más adelante).
MODO DE AUTO CONSERVACIÓN : si Renovar (último minuto) es inferior al umbral de Renovación , se activará el modo de autoconservación.
Entonces, en el ejemplo superior, se activa el MODO DE AUTO CONSERVACIÓN, porque el umbral es 5, pero el servidor Eureka solo puede recibir 4 renovaciones / min.
- Pregunta 1:
El MODO DE AUTO CONSERVACIÓN está diseñado para evitar fallas en la conectividad de la red. La conectividad entre la instancia A y B de Eureka es buena, pero B no puede renovar su contrato de arrendamiento con el servidor Eureka en un corto período debido a problemas de conectividad, en este momento el servidor Eureka no puede simplemente echar la instancia B. Si lo hace, la instancia A no obtendrá el servicio registrado del servidor Eureka a pesar de que B esté disponible. Así que este es el propósito del MODO DE AUTO CONSERVACIÓN, y es mejor encenderlo.
- Pregunta 2:
El umbral mínimo 1 se escribe en el código.
registerWithEureka
se establece en false para que no haya registros de instancia de Eureka, el umbral será 1.
En el entorno de producción, generalmente implementamos dos servidores Eureka y
registerWithEureka
se establecerá en verdadero.
Por lo tanto, el umbral será 2, y el servidor Eureka renovará el contrato de arrendamiento para sí mismo dos veces / minuto, por lo que las
RENEWALS ARE LESSER THAN THRESHOLD
no serán un problema.
- Pregunta 3:
Sí, tiene usted razón.
eureka.instance.leaseRenewalIntervalInSeconds
define cuántas renovaciones se envían al servidor por minuto, pero multiplicará un factor
eureka.server.renewalPercentThreshold
mencionado anteriormente, el valor predeterminado es 0.85.
- Pregunta 4:
Sí, es normal, porque el valor inicial del umbral se establece en 1. Por lo tanto, si
registerWithEureka
se establece en falso, las renovaciones siempre están por debajo del umbral.
Tengo dos sugerencias para esto:
-
Implemente dos servidores Eureka y habilite
registerWithEureka
. -
Si solo desea implementar en un entorno de demostración / desarrollo, puede establecer
eureka.server.renewalPercentThreshold
en 0.49, por lo que cuando inicie un servidor Eureka solo, el umbral será 0.