Grundlegendes zur Selbsterhaltung und Erneuerung von Spring Cloud Eureka Server

82

Ich bin neu in der Entwicklung von Microservices, obwohl ich eine Weile darüber recherchiert habe und sowohl die Dokumente von Spring als auch die von Netflix gelesen habe.

Ich habe ein einfaches Projekt gestartet, das auf Github verfügbar ist . Es handelt sich im Grunde genommen um einen Eureka-Server (Archimedes) und drei Eureka-Client-Microservices (eine öffentliche API und zwei private). Eine detaillierte Beschreibung finden Sie in der Readme-Datei von github.

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

Ich habe diese Frage bei Stackoverflow gefunden und die Lösung wird enableSelfPreservation:falsein der Eureka Server-Konfiguration verwendet. Wenn Sie dies nach einer Weile tun, verschwindet der getötete Dienst wie erwartet.

Ich kann jedoch die folgende Meldung sehen:

DER SELBSTERHALTUNGSMODUS WIRD AUSGESCHALTET. DIESES KANN IM FALL VON NETZWERKEN / ANDEREN PROBLEMEN KEINEN SOFORT-SCHUTZ SCHÜTZEN.

1. Was ist der Zweck der Selbsterhaltung? Das Dokument gibt an, dass mit Selbsterhaltung auf "Clients die Instanzen erhalten können, die nicht mehr existieren" . Wann ist es also ratsam, es ein- und auszuschalten?

Wenn die Selbsterhaltung aktiviert ist, wird in der Eureka Server-Konsolenwarnung möglicherweise eine ausstehende Meldung angezeigt:

NOTFALL! EUREKA KANN FALSCH ANFORDERN, DASS INSTANZEN VORHANDEN SIND, WENN SIE NICHT SIND. VERLÄNGERUNGEN SIND WENIGER ALS SCHWELLE UND DAHER LÄUFEN DIE INSTANZEN NICHT AB, UM SICHER ZU SEIN.

Nun geht es weiter mit der Spring Eureka Console.

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

Ich bin auf ein seltsames Verhalten der Schwellenwertanzahl gestoßen: Wenn ich den Eureka-Server alleine starte, ist der Schwellenwert 1.

2. Ich habe einen einzelnen Eureka-Server und bin so konfiguriert registerWithEureka: false, dass er sich nicht auf einem anderen Server registriert. Warum wird es dann in der Schwellenwertanzahl angezeigt?

3. Für jeden Client, den ich starte, erhöht sich der Schwellenwert um +2. Ich denke, das liegt daran, dass sie 2 Erneuerungsnachrichten pro Minute senden. Stimmt das?

4. Der Eureka-Server sendet niemals eine Verlängerung, sodass die letzten Minuten der Erneuerung 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
codependent
quelle
3
Ich möchte mir Zeit nehmen, um diese Frage zu beantworten. Es ist kompliziert. Einige der Antworten befinden sich im Netflix-Code, andere in der Konfiguration. Ich möchte, dass meine Antwort als Teil der Spring Cloud-Dokumentation endet, aber es wird wahrscheinlich nach Thanksgiving sein, es sei denn, meine Kollegen antworten vorher.
spencergibb
Dies ist ein kleiner Hintergrund von Netflix: github.com/Netflix/eureka/wiki/…
spencergibb
Hier noch ein paar Hintergrundinformationen: github.com/spring-cloud/spring-cloud-netflix/issues/373
spencergibb
8
@spencergibb dies nähert sich 9 Monaten und keine Antwort .. irgendwelche Eingaben?
Nick
1
@spencergibb Es ist jetzt mehr als ein Jahr her. Gibt es noch eine Chance, jederzeit eine klare Antwort zu bekommen? Eine Art Weihnachtsgeschenk :)
OcuS

Antworten:

62

Ich habe die gleiche Frage wie @codependent getroffen, ich habe viel gegoogelt und einige Experimente durchgeführt. Hier komme ich, um etwas Wissen darüber beizutragen, wie Eureka-Server und -Instanz funktionieren.

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

Erneuerungen (letzte Minute) : Gibt an, wie viele Erneuerungen in letzter Minute von der Eureka-Instanz erhalten wurden

Erneuerungsschwellenwert : Die Erneuerungen , die der Eureka-Server pro Minute von der Eureka-Instanz erwartet.

Wenn zum Beispiel registerWithEurekaeingestellt ist falsch , eureka.instance.leaseRenewalIntervalInSecondswird auf 30 und 2 Eureka - Instanz ausgeführt. Zwei Eureka-Instanzen senden 4 Erneuerungen pro Minute an den Eureka-Server. Der minimale Schwellenwert für den Eureka-Server beträgt 1 (in Code geschrieben), daher beträgt der Schwellenwert 5 (diese Zahl multipliziert einen Faktor, eureka.server.renewalPercentThresholdder später erläutert wird).

SELBSTERHALTUNGSMODUS : Wenn der Erneuerungswert (letzte Minute) unter dem Erneuerungsschwellenwert liegt , wird der Selbsterhaltungsmodus aktiviert.

Im oberen Beispiel ist der SELBSTERHALTUNGSMODUS aktiviert, da der Schwellenwert 5 beträgt, der Eureka-Server jedoch nur 4 Erneuerungen / min empfangen kann.

  1. Frage 1:

Der SELBSTERHALTUNGSMODUS wurde entwickelt, um einen schlechten Ausfall der Netzwerkverbindung zu vermeiden. Die Konnektivität zwischen Eureka-Instanz A und B ist gut, aber B kann seine Lease für den Eureka-Server aufgrund von Konnektivitätsproblemen nicht in kurzer Zeit erneuern. Derzeit kann der Eureka-Server Instanz B nicht einfach rauswerfen. Wenn dies der Fall ist, Instanz A erhält keinen registrierten Dienst vom Eureka-Server, obwohl B verfügbar ist. Dies ist also der Zweck des SELBSTERHALTUNGSMODUS, und es ist besser, ihn einzuschalten.

  1. Frage 2:

Der minimale Schwellenwert 1 wird in den Code geschrieben. registerWithEurekaist auf false gesetzt, damit keine Eureka-Instanzregister vorhanden sind. Der Schwellenwert ist 1.

In der Produktionsumgebung stellen wir im Allgemeinen zwei Eureka-Server bereit und registerWithEurekawerden auf true gesetzt. Der Schwellenwert liegt also bei 2, und der Eureka-Server erneuert den Mietvertrag zweimal RENEWALS ARE LESSER THAN THRESHOLDpro Minute, sodass dies kein Problem darstellt.

  1. Frage 3:

Ja, du hast recht. eureka.instance.leaseRenewalIntervalInSecondsDefiniert, wie viele Erneuerungen pro Minute an den Server gesendet werden. Dabei wird jedoch ein eureka.server.renewalPercentThresholdoben genannter Faktor multipliziert. Der Standardwert ist 0,85.

  1. Frage 4:

Ja, es ist normal, da der Anfangswert des Schwellenwerts auf 1 gesetzt ist. Wenn registerWithEurekaalso false festgelegt ist, liegt die Erneuerung immer unter dem Schwellenwert.

Ich habe zwei Vorschläge dafür:

  1. Stellen Sie zwei Eureka-Server bereit und aktivieren Sie sie registerWithEureka.
  2. Wenn Sie nur in einer Demo- / Entwicklungsumgebung bereitstellen möchten, können Sie eureka.server.renewalPercentThreshold0,49 festlegen. Wenn Sie also einen Eureka-Server alleine starten, liegt der Schwellenwert bei 0.
Nie Xing
quelle
Hallo Nie Xing, wissen Sie, was die Bedeutung des Labels ist: "Ablauf des Mietvertrags aktiviert:"
Jabrena
Hallo @jabrena, ich denke, es bedeutet, dass der Mietvertrag abläuft, wenn die Instanz ihren Mietvertrag für den eureka-Server nicht erneuert. Möglicherweise hängt es mit eureka.instance.leaseExpirationDurationInSeconds zusammen, deren Wert standardmäßig 90 Sekunden beträgt. Wenn Sie diesen Wert auf 0 oder eine negative Zahl setzen, wird die Bezeichnung möglicherweise "Lease-Ablauf aktiviert: False". Sie können es ausprobieren.
Nie Xing
können Sie diese stackoverflow.com/questions/48437752/…
Ankit Bansal
Funktioniert nicht Threshold = 0, Renews = 0 löst weiterhin die Warnung aus.
SledgeHammer
Ich habe den selfPreservationMode deaktiviert, erhalte aber dennoch diese Meldung auf Eureka - EUREKA KANN FEHLERHAFT ANFORDERN, DASS INSTANZEN ANGEGEBEN SIND, WENN SIE NICHT SIND. VERLÄNGERUNGEN SIND WENIGER ALS SCHWELLE UND WENN DIE INSTANZEN NICHT ABGELAUFEN SIND, SIND SIE NUR SICHER. Es sollte nicht richtig passieren?
DHRUV BANSAL
31

Ich habe eine Blog - Post mit den Details von Eureka erstellt hier , dass Füllungen in einigem fehlt Detail aus Spring doc oder Netflix Blog. Es ist das Ergebnis mehrerer Tage des Debuggens und Durchsuchens des Quellcodes. Ich verstehe, dass es vorzuziehen ist, zu kopieren und einzufügen, anstatt auf eine externe URL zu verlinken, aber der Inhalt ist zu groß für eine SO-Antwort.

Abhijit Sarkar
quelle
2
Vielen Dank, dass Sie einen solchen Beitrag verlinkt haben. Eine empfohlene Lektüre !!
Codependent
2
Hallo @Abhijit Sarkar, der Artikel ist unglaublich. Ich habe viele Konfigurationsprobleme gelöst.
Jabrena
0

Sie können versuchen, den Erneuerungsschwellenwert in den Eigenschaften Ihres Eureka-Servers festzulegen. Wenn Sie ungefähr 3 bis 4 Microservices haben, um sich bei eureka zu registrieren, können Sie dies wie folgt einstellen:

eureka.server.renewalPercentThreshold=0.33
Vivek Sahu
quelle