Soy nuevo en el desarrollo de microservicios, aunque he estado investigando al respecto durante un tiempo, leyendo los documentos de Spring y Netflix.
Comencé un proyecto simple disponible en Github . Es básicamente un servidor Eureka (Archimedes) y tres microservicios 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 está funcionando me gustaría que si uno de los microservicios privados se mata, el servidor Eureka se dé cuenta y lo elimine del registro.
Me encontré con esta pregunta en StackOverflow , y la solución pasa por utilizar enableSelfPreservation:false
en la configuración del servidor de Eureka. Al hacer esto después de un tiempo, el servicio desactivado desaparece como se esperaba.
Sin embargo, puedo ver el siguiente mensaje:
EL MODO DE AUTO CONSERVACIÓN ESTÁ APAGADO. ESTO PUEDE NO PROTEGER LA CADUCIDAD DE LA INSTANCIA EN CASO DE PROBLEMAS DE RED U OTROS.
1. ¿Cuál es el propósito de la autoconservación? El documento establece que con la autopreservació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, es posible que reciba un mensaje pendiente en la advertencia de la consola del servidor Eureka:
¡EMERGENCIA! EUREKA PUEDE ESTAR RECLAMANDO INCORRECTAMENTE QUE LAS INSTANCIAS ESTÁN ACTIVADAS CUANDO NO LO ESTÁN. LAS RENOVACIONES SON MENORES QUE EL UMBRAL Y POR LO TANTO LAS INSTANCIAS NO SE ESTÁN EXPIRANDO SÓLO PARA SER SEGURO.
Ahora, continúe con Spring Eureka Console.
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 solo servidor Eureka y está configurado registerWithEureka: false
para evitar que se registre en otro servidor. Entonces, ¿por qué aparece en el recuento de umbral?
3. Por cada cliente que empiezo, el recuento del umbral aumenta en +2. Supongo que es porque envían 2 mensajes de renovación por minuto, ¿verdad?
4. El servidor Eureka nunca envía una renovación, por lo que la última renovación mínima siempre está por debajo del umbral. ¿Esto es normal?
renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4
Cfg del servidor:
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
fuente
Respuestas:
Recibí la misma pregunta que conocí en @codependent, busqué en Google mucho e hice algunos experimentos, aquí vengo a contribuir con algunos conocimientos sobre cómo funcionan el servidor y la instancia de Eureka.
Cada instancia debe renovar su arrendamiento a Eureka Server con una frecuencia de una vez cada 30 segundos, que se puede definir en
eureka.instance.leaseRenewalIntervalInSeconds
.Renovaciones (último minuto) : representa la cantidad de renovaciones recibidas 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 código), por lo que el umbral es 5 (este número se multiplicará por un factoreureka.server.renewalPercentThreshold
que se discutirá más adelante).MODO DE AUTO CONSERVACIÓN : si Renova (último minuto) es menor que el umbral de Renovación , se activará el modo de autoconservación.
Entonces, en el ejemplo superior, el MODO DE SELF PRESERVATION está activado, porque el umbral es 5, pero el servidor Eureka solo puede recibir 4 renovaciones / min.
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 pudo renovar su arrendamiento al servidor Eureka en un período corto debido a problemas de conectividad, en este momento el servidor Eureka no puede simplemente expulsar la instancia B. Si lo hace, instancia A no obtendrá el servicio registrado disponible del servidor Eureka a pesar de que B esté disponible. Así que este es el propósito del MODO DE AUTOCONSERVACIÓN, y es mejor activarlo.
El umbral mínimo 1 está escrito en el código.
registerWithEureka
se establece en falso, por lo que no habrá registros de instancias de Eureka, el umbral será 1.En el entorno de producción, generalmente implementamos dos servidores Eureka y
registerWithEureka
lo configuramos como verdadero. Por lo tanto, el umbral será 2 y el servidor Eureka renovará la concesión para sí mismo dos veces por minuto, porRENEWALS ARE LESSER THAN THRESHOLD
lo que no será un problema.Sí, tiene usted razón.
eureka.instance.leaseRenewalIntervalInSeconds
define cuántas renovaciones se envían al servidor por minuto, pero multiplicará un factoreureka.server.renewalPercentThreshold
mencionado anteriormente, el valor predeterminado es 0.85.Sí, es normal, porque el valor inicial del umbral se establece en 1. Entonces, si
registerWithEureka
se establece en falso, las renovaciones siempre están por debajo del umbral.Tengo dos sugerencias para esto:
registerWithEureka
.eureka.server.renewalPercentThreshold
en 0.49, por lo que cuando inicie un servidor Eureka solo, el umbral será 0.fuente
He creado una publicación de blog con los detalles de Eureka aquí , que completa algunos detalles que faltan del documento de Spring o del blog de Netflix. Es el resultado de varios días de depuración y búsqueda en el 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.
fuente
Puede intentar establecer un límite de umbral de renovación en las propiedades de su servidor eureka. Si tiene entre 3 y 4 microservicios para registrarse en eureka, puede configurarlo así:
eureka.server.renewalPercentThreshold=0.33
fuente