2015-11-25 9 views
49

Ich bin neu in der Entwicklung von Microservices, obwohl ich seit einiger Zeit darüber recherchiere und sowohl die Dokumentation von Spring als auch die von Netflix gelesen habe. Ich habe ein einfaches Projekt available on Github gestartet. Es ist im Grunde ein Eureka Server (Archimedes) und drei Eureka Client Microservices (eine öffentliche API und zwei private). Eine ausführliche Beschreibung finden Sie in der Readme-Datei von Github.Spring Cloud verstehen Eureka Server Selbstschutz und Erneuerungsschwellenwert

Der Punkt ist, dass, wenn alles läuft, ich möchte, dass, wenn einer der privaten Microservices getötet wird, der Eureka Server realisiert und entfernt es aus der Registrierung.

I found this question on Stackoverflow, und die Lösung übergibt enableSelfPreservation:false in der Eureka Server-Konfiguration. Nach einer Weile verschwindet der getötete Dienst wie erwartet.

Allerdings kann ich die folgende Meldung:

DIE MODE Selbsterhaltung gedreht off.This NICHT INSTANZ ABLAUF BEI NETZ/ANDERE PROBLEME SCHÜTZEN.

1. Was ist der Zweck der Selbsterhaltung? Die doc besagt, dass mit Selbsterhaltung auf "Clients die Instanzen abrufen können, die nicht mehr vorhanden sind". Wann ist es ratsam, es ein-/auszuschalten?

Wenn darüber hinaus Selbsterhaltung eingeschaltet ist, können Sie eine hervorragende Nachricht in der Server-Konsole Warnung Eureka erhalten:

NOT! EUREKA KANN UNBEFUGT WERDEN, WENN SIE NICHT BEWORFEN WERDEN. ERNEUERUNGEN SIND NIEDRIGER ALS SCHWELLE UND DAMIT DIE INSTANZEN SIND NICHT NUR ABGELAUFEN, SICHER ZU SEIN.

Jetzt geht es weiter mit der Spring Eureka Console.

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

Ich habe über eine seltsame Verhalten der Schwellenzahl kommen: wenn ich die Eureka Server allein zu starten, ist die Schwelle 1.

2. ich einen einzelnen Eureka-Server und ist so konfiguriert, mit registerWithEureka: false um zu verhindern, dass es sich auf einem anderen Server registriert. Warum erscheint es dann in der Schwellenzählung?

3. Für jeden Client, den ich beginne, wird der Schwellenwert um +2 erhöht. Ich schätze, weil sie 2 Nachrichten pro Minute senden, habe ich recht?

4. Der Eureka-Server sendet niemals eine Erneuerung, so dass die letzten min Erneuerungen immer unter dem Schwellenwert liegen. Ist das normal?

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

Server 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 
+2

Ich möchte Zeit nehmen, um diese Frage zu beantworten. Es ist kompliziert. Einige der Antworten sind in Netflix-Code und andere sind Konfiguration. Ich möchte, dass meine Antwort als Teil der Spring Cloud-Dokumentation endet, aber es wird wahrscheinlich nach Thanksgiving sein, wenn meine Kollegen nicht vorher antworten. – spencergibb

+0

Dies ist ein kleiner Hintergrund von Netflix: https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication – spencergibb

+0

Hier ist ein paar Hintergrund: https://github.com/spring- Cloud/Spring-Cloud-Netflix/Probleme/373 – spencergibb

Antwort

33

bekam ich die gleiche Frage wie @codependent traf, gegoogelt ich viel und habe einige Experimentieren, hier komme ich dazu, etwas über die Funktionsweise von Eureka Server und Instanz zu berichten.

Jede Instanz muss ihre Pacht an Eureka Server mit einer Häufigkeit von einmal pro 30 Sekunden erneuern, die in eureka.instance.leaseRenewalIntervalInSeconds definiert werden kann.

Renews (letzte min): darstellt, wie viele von Eureka-Instanz in letzter Minute

Renews Schwellenwert empfangenen fortschreibt: die Renews die Eureka-Server von Eureka Instanz pro Minute empfangen erwartet.

Wenn beispielsweise registerWithEureka zu falschen gesetzt ist, wird eureka.instance.leaseRenewalIntervalInSeconds bis 30 und Lauf 2 Eureka Instanz festgelegt. Zwei Eureka Instanz erneuert zu Eureka-Server pro Minute Eureka-Server minimale Schwelle ist (geschrieben in Code) senden, so dass der Schwellenwert (diese Zahl multiplizieren, einen Faktor eureka.server.renewalPercentThreshold die später erörtert wird).

Selbsterhaltung MODE: if Renews (last min) kleiner als Renews Schwelle wird Selbsterhaltung Modus aktiviert werden.

Im oberen Beispiel ist der SELF PRESERVATION MODE aktiviert, da der Schwellenwert 5 ist, aber der Eureka Server kann nur 4 Erneuerungen/min empfangen.

  1. Frage 1:

Die Selbsterhaltung MODE ist Design schlechten Netzwerk-Konnektivitätsfehler zu vermeiden. Connectivity zwischen Eureka-Instanz A und B ist gut, aber B ist es nicht gelungen, seine Miete an Eureka-Server in kurzer Zeit wegen Konnektivität Schluckauf zu erneuern, zu diesem Zeitpunkt Eureka-Server kann nicht einfach nur Instanz B rausstoßen. Wenn ja, Instanz Ein registrierter Dienst von Eureka Server wird nicht verfügbar sein, obwohl B verfügbar ist. Dies ist also der Zweck des SELBSTERHALTUNGSMODUS, und es ist besser, ihn einzuschalten.

  1. Frage 2:

Die minimale Schwelle 1 im Code geschrieben wird. registerWithEureka wird auf falsch gesetzt, so dass es keine Eureka-Instanzregister gibt, der Schwellenwert ist 1.

In der Produktionsumgebung stellen wir im Allgemeinen zwei Eureka-Server bereit und registerWithEureka wird auf true gesetzt.Also wird der Schwellenwert 2 sein, und der Eureka-Server wird sich selbst zweimal pro Minute erneuern, so dass RENEWALS ARE LESSER THAN THRESHOLD kein Problem sein wird.

  1. Frage 3:

Ja, Sie haben Recht. eureka.instance.leaseRenewalIntervalInSeconds definiert, wie viele Erneuerungen pro Minute an den Server gesendet werden, aber es wird ein Faktor eureka.server.renewalPercentThreshold wie oben erwähnt multipliziert, der Standardwert ist 0,85.

  1. Frage 4:

Ja, es ist normal, weil der Schwellenwert Anfangswert auf 1. So wird gesetzt, wenn registerWithEureka auf false gesetzt ist, erneuert wird immer unterhalb der Schwelle .

Ich habe zwei Vorschläge dafür:

  1. Deploy zwei Eureka-Server und registerWithEureka ermöglichen.
  2. Wenn Sie nur in Demo/dev Umgebung bereitstellen möchten, können Sie eureka.server.renewalPercentThreshold auf 0,49, so eingestellt, wenn Sie allein ein Eureka-Server zu starten, wird Schwelle 0.
+0

Hallo Nie Xing, wissen Sie, was die Bedeutung des Etiketts bedeutet: "Lease Ablauf aktiviert:" – jabrena

+0

Hi @jabrena, denke ich es bedeutet, dass die Verpachtung abläuft, wenn die Instanz ihren Mietvertrag nicht verlängert. Es könnte mit eureka.instance.leaseExpirationDurationInSeconds in Verbindung stehen, welcher Wert standardmäßig 90 Sekunden beträgt. Wenn Sie diesen Wert auf 0 oder eine negative Zahl setzen, ändert sich die Beschriftung möglicherweise in "Lease expiration enabled: False". Sie können es ausprobieren. –

+0

können Sie diese https://stackoverflow.com/questions/48437752/eureka-renews-threshold-renews-last-min beantworten –

16

ich einen Blog-Eintrag erstellt haben mit den Details von Eureka here, die einige fehlende Details aus Spring Doc oder Netflix Blog ausfüllen. Es ist das Ergebnis von mehreren Tagen Debuggen und Durchsuchen von Quellcode. Ich verstehe, dass das Kopieren und Einfügen besser ist als das Verknüpfen mit einer externen URL, aber der Inhalt ist zu groß für eine SO-Antwort.

+1

Vielen Dank für die Verknüpfung einer solchen klärenden Beitrag. Eine empfehlenswerte Lektüre !! – codependent

+1

Hallo @Abhijit Sarkar, der Artikel ist erstaunlich. Ich habe viele Konfigurations Zweifel gelöst. – jabrena

Verwandte Themen