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:false
in 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
quelle
Antworten:
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
registerWithEureka
eingestellt ist falsch ,eureka.instance.leaseRenewalIntervalInSeconds
wird 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.renewalPercentThreshold
der 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.
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.
Der minimale Schwellenwert 1 wird in den Code geschrieben.
registerWithEureka
ist 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
registerWithEureka
werden auf true gesetzt. Der Schwellenwert liegt also bei 2, und der Eureka-Server erneuert den Mietvertrag zweimalRENEWALS ARE LESSER THAN THRESHOLD
pro Minute, sodass dies kein Problem darstellt.Ja, du hast recht.
eureka.instance.leaseRenewalIntervalInSeconds
Definiert, wie viele Erneuerungen pro Minute an den Server gesendet werden. Dabei wird jedoch eineureka.server.renewalPercentThreshold
oben genannter Faktor multipliziert. Der Standardwert ist 0,85.Ja, es ist normal, da der Anfangswert des Schwellenwerts auf 1 gesetzt ist. Wenn
registerWithEureka
also false festgelegt ist, liegt die Erneuerung immer unter dem Schwellenwert.Ich habe zwei Vorschläge dafür:
registerWithEureka
.eureka.server.renewalPercentThreshold
0,49 festlegen. Wenn Sie also einen Eureka-Server alleine starten, liegt der Schwellenwert bei 0.quelle
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.
quelle
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
quelle