web-dev-qa-db-fra.com

Comprendre la préservation de soi et le seuil de renouvellement d'Eureka Server de Spring Cloud

Je suis novice dans le développement de microservices, bien que je fasse des recherches à ce sujet depuis un moment, en lisant à la fois la documentation de Spring et celle de Netflix.

J'ai commencé un projet simple disponible sur Github . Il s’agit essentiellement d’un serveur Eureka (Archimedes) et de trois microservices de clients Eureka (une API publique et deux privées). Vérifiez le readme de github pour une description détaillée.

Le fait est que lorsque tout est en marche, j'aimerais que si l'un des microservices privés soit tué, le serveur Eureka le réalise et le supprime du registre.

I trouvé cette question sur Stackoverflow , et la solution passe en utilisant enableSelfPreservation:false dans la configuration du serveur Eureka. Après un certain temps, le service tué disparaît comme prévu.

Cependant, je peux voir le message suivant:

LE MODE AUTO-CONSERVATION IS ÉTEINT. IL PEUT NE PAS PROTÉGER L'EXPIRATION D'INSTANCE EN CAS DE PROBLÈME RÉSEAU/AUTRE.

1. Quel est le but de la conservation de soi? Le doc indique qu'avec la conservation automatique sur "les clients peuvent obtenir les instances qui n'existent plus". Alors, quand est-il conseillé de l'activer/le désactiver?

De plus, lorsque la fonction de conservation automatique est activée, un message en attente peut apparaître dans l'avertissement de la console Eureka Server:

URGENCE! EUREKA PEUT ÊTRE INCORRECTEMENT LES RÉCLAMATIONS SONT RÉGULIÈRES LORSQUE CELLES-CI NE SONT PAS. LES RENOUVELLEMENTS SONT INFERIEURS AU SEUIL ET, PAR CONSEQUENT, LES INSTANCES NE SONT PAS EXPIRÉES JUSTE POUR ÊTRE EN SÉCURITÉ.

Passons maintenant à la console Spring Eureka.

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

J'ai rencontré un comportement étrange du nombre de seuils: lorsque je lance le serveur Eureka seul, le seuil est 1.

2. J'ai un seul serveur Eureka et est configuré avec registerWithEureka: false pour l'empêcher de s'inscrire sur un autre serveur. Alors, pourquoi apparaît-il dans le nombre de seuils?

3. Pour chaque client, le nombre de seuils augmente de +2. Je suppose que c’est parce qu’ils envoient 2 messages renouvelés par minute, est-ce que j’ai raison?

4. Le serveur Eureka n'envoie jamais de renouvellement, donc le dernier min renouvelé est toujours inférieur au seuil. Est-ce normal?

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

Serveur 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

Client 1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

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

J'ai eu la même question que @codependent rencontrée, j'ai beaucoup cherché sur Google et fait quelques expériences. Je viens ici apporter quelques connaissances sur le fonctionnement du serveur Eureka et de l'instance.

Chaque instance doit renouveler son bail avec Eureka Server à une fréquence d'une fois par 30 secondes, ce qui peut être défini dans eureka.instance.leaseRenewalIntervalInSeconds.

Renews (last min): représente le nombre de renouvellements reçus d'instance Eureka à la dernière minute

seuil de renouvellement: le nombre de renouvellements attendus par le serveur Eureka à partir d'une instance d'Eureka, par minute.

Par exemple, si registerWithEureka est défini sur false, eureka.instance.leaseRenewalIntervalInSeconds est réglé sur 30 et exécute 2 instance Eureka. Deux instances Eureka envoient 4 renouvelle au serveur Eureka toutes les minutes, le seuil minimal du serveur Eureka est 1 (écrit en code), le seuil est donc 5 = (ce nombre sera multiplié par un facteur eureka.server.renewalPercentThreshold qui sera discuté plus tard).

MODE DE CONSERVATION AUTOMATIQUE: si Renouvelle (dernière minute) est inférieur à Seuil de renouvellement, le mode de conservation automatique sera activé.

Ainsi, dans l'exemple ci-dessus, le MODE SELF PRESERVATION est activé, car le seuil est 5, mais le serveur Eureka ne peut recevoir que 4 renouvellements/min.

  1. Question 1:

Le MODE SELF PRESERVATION est conçu pour éviter les problèmes de connectivité réseau. La connectivité entre les instances Eureka A et B est bonne, mais B n’est pas en mesure de renouveler son bail avec le serveur Eureka dans un bref délai en raison de problèmes de connectivité. À ce stade, le serveur Eureka ne peut pas simplement renvoyer l’instance B. Si tel est le cas, A n'obtiendra pas un service enregistré disponible du serveur Eureka, bien que B soit disponible. C’est donc l’objet du MODE SELF PRESERVATION, et il est préférable de l’activer.

  1. Question 2:

Le seuil minimal 1 est écrit dans le code. registerWithEureka est défini sur false, il n'y aura donc aucun registre d'instance Eureka, le seuil sera 1.

En environnement de production, nous déployons généralement deux serveurs Eureka et registerWithEureka sera défini sur true. Le seuil sera donc 2 et le serveur Eureka renouvellera son bail deux fois par minute, donc RENEWALS ARE LESSER THAN THRESHOLD ne sera pas un problème.

  1. Question 3:

Oui, tu as raison. eureka.instance.leaseRenewalIntervalInSeconds définit le nombre de renouvellements envoyés au serveur par minute, mais multiplie le facteur eureka.server.renewalPercentThreshold mentionné ci-dessus, la valeur par défaut est 0,85.

  1. Question 4:

Oui, c'est normal, car la valeur initiale du seuil est définie sur 1. Ainsi, si registerWithEureka est défini sur false, les renouvellements sont toujours inférieurs au seuil.

J'ai deux suggestions pour cela:

  1. Déployez deux serveurs Eureka et activez registerWithEureka.
  2. Si vous souhaitez simplement déployer dans un environnement démo/dev, vous pouvez définir eureka.server.renewalPercentThreshold à 0,49. Ainsi, lorsque vous démarrez un serveur Eureka seul, le seuil sera 0.
54
Nie Xing

J'ai créé un article de blog avec les détails d'Eureka ici , qui complète certains détails manquants du doc ​​Spring ou du blog Netflix. C'est le résultat de plusieurs jours de débogage et de fouille dans le code source. Je comprends qu'il est préférable de copier-coller plutôt que de créer un lien vers une URL externe, mais le contenu est trop volumineux pour une réponse SO.

26
Abhijit Sarkar

Vous pouvez essayer de définir une limite de renouvellement dans les propriétés de votre serveur eureka. Si vous avez environ 3 à 4 microservices à enregistrer sur eureka, vous pouvez le définir comme suit:

eureka.server.renewalPercentThreshold=0.33
0
Vivek Sahu