Comprendre le nuage de printemps Eureka Server self preservation et renew threshold

je suis nouveau dans le développement de microservices, bien que j'ai fait des recherches à ce sujet pendant un certain temps, en lisant les docs de Spring et Netflix.

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

le fait est que quand tout fonctionne I j'aimerais que si l'un des microservices privés est tué, le serveur Eureka le réalise et le supprime du registre.

je trouve cette question sur Stackoverflow , et la solution passe par l'utilisation de enableSelfPreservation:false dans l'Eureka la configuration du Serveur. Faire cela après un certain temps le service tué disparaît comme prévu.

cependant je peux voir le message suivant:

THE SELF PRESERVATION MODE EST DÉSACTIVÉ.CELA PEUT NE PAS PROTÉGER INSTANCE EXPIRATION EN CAS DE PROBLÈMES DE RÉSEAU/AUTRES.

1. Quel est le but de l'auto-préservation? Le doc , avec auto-préservation "les clients peuvent obtenir les instances qui n'existent plus" . Alors, quand est-il conseillé de l'allumer ou de l'éteindre?

en outre, lorsque l'auto-préservation est en cours, vous pouvez obtenir un message en suspens dans la console du serveur Eureka avertissement:

urgence! EUREKA PEUT AFFIRMER À TORT QUE DES INSTANCES SONT EN HAUSSE LORSQUE ILS NE SONT PAS. LES RENOUVELLEMENTS SONT INFÉRIEURS AU SEUIL ET, PAR CONSÉQUENT, LES LES INSTANCES NE SONT PAS EXPIRÉES JUSTE POUR ÊTRE SÛRES.

continue avec la Console de Spring Eureka.

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

j'ai rencontré un comportement étrange du nombre de seuil: quand je commence le Eureka Server seul, le seuil est de 1.

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

3. Pour chaque client je commence le nombre de seuil augmente de +2. Je suppose que c'est parce qu'ils envoient 2 messages de renouvellement par minute, est-ce que j'ai raison?

4. Le serveur Eureka n'envoie jamais de renouvellement, donc la dernière minute de renouvellement est toujours en dessous du 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
60
demandé sur Community 2015-11-25 19:24:28

2 réponses

j'ai eu la même question que @codependent a rencontré, j'ai beaucoup cherché sur Google et j'ai fait quelques expériences, ici j'en viens à apporter quelques connaissances sur le fonctionnement D'Eureka server et instance.

chaque instance doit renouveler sa location à Eureka Server avec une fréquence d'une fois par 30 secondes, qui peut être définie dans eureka.instance.leaseRenewalIntervalInSeconds .

Renews (last min) : représente le nombre de renouvellements reçus D'Eureka instance en dernier minute

Renouvelle seuil : la renouvelle cette Eureka serveur attend reçu de Eureka instance par minute.

par exemple, si registerWithEureka est défini à false , eureka.instance.leaseRenewalIntervalInSeconds est défini à 30 et exécute 2 instance Eureka. Deux Eureka instance envoyer 4 renouvelle à Eureka serveur par minutes, Eureka serveur seuil minimal est 1 (écrit en code), donc le seuil est 5 (ce nombre sera multiplié par un facteur eureka.server.renewalPercentThreshold qui sera discuté plus tard).

AUTO PRÉSERVATION de la MODE : si Renouvelle (dernière min) est inférieur à Renouvelle seuil , autonome préservation de la mode sera activé.

ainsi, dans l'exemple supérieur, le MODE D'auto-préservation est activé, parce que le seuil est de 5, mais Eureka server ne peut recevoir que 4 renouvellements / min.

  1. Question 1:

le MODE D'auto-préservation est la conception pour éviter une mauvaise défaillance de la connectivité réseau. La connectivité entre les instances A et B D'Eureka est bonne, mais B n'a pas réussi à renouveler sa location à Eureka server dans un court laps de temps en raison de problèmes de connectivité, à ce moment-là Eureka server ne peut pas simplement lancer l'instance B. Si c'est le cas, l'instance a ne sera pas disponible le service enregistré D'Eureka server malgré B est disponible. Donc c'est le but du MODE D'auto-préservation, et c'est mieux de l'allumer.

  1. Question 2:

le seuil minimal 1 est écrit dans le code. registerWithEureka est défini à false de sorte qu'il n'y aura pas de registres D'instance Eureka, le seuil sera de 1.

en environnement de production, Généralement nous déployons deux serveurs Eureka et registerWithEureka sera mis à true. Donc le seuil sera 2, et Eureka server se renouvellera deux fois / minute, donc RENEWALS ARE LESSER THAN THRESHOLD ne sera pas un problème.

  1. Question 3:

Oui, vous avez raison. eureka.instance.leaseRenewalIntervalInSeconds définit combien de renouvellements envoyés au serveur par minute, mais il multipliera un facteur eureka.server.renewalPercentThreshold mentionné ci-dessus, la valeur par défaut est 0.85.

  1. Question 4:

Oui, c'est normal, parce que la valeur initiale du seuil est fixée à 1. Donc si registerWithEureka est mis à false, renews est toujours en dessous du seuil.

j'ai deux suggestions pour ceci:

  1. déployer deux serveurs Eureka et activer registerWithEureka .
  2. si vous voulez simplement vous déployer dans un environnement demo/dev, vous pouvez définir eureka.server.renewalPercentThreshold à 0.49, donc quand vous démarrez un serveur Eureka seul, threshold être 0.
39
répondu Nie Xing 2016-12-19 07:35:02

j'ai créé un billet de blog avec les détails D'Eureka ici , qui remplit certains détails manquants de Doc de printemps ou Netflix blog. Il est le résultat de plusieurs jours de débogage et de fouiller 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 grand pour une réponse SO.

21
répondu Abhijit Sarkar 2017-01-21 04:31:31