Zrozumienie samoobrony i progu odnowienia serwera Spring Cloud Eureka Server

83

Jestem nowy w rozwijaniu mikrousług, chociaż od jakiegoś czasu badam ten temat, czytając zarówno dokumentację Springa, jak i Netflix.

Rozpocząłem prosty projekt dostępny na Github . Zasadniczo jest to serwer Eureka (Archimedes) i trzy mikrousługi klienta Eureka (jeden publiczny interfejs API i dwa prywatne). Sprawdź plik readme github, aby uzyskać szczegółowy opis.

Chodzi o to, że gdy wszystko działa, chciałbym, aby w przypadku zabicia jednej z prywatnych mikrousług serwer Eureka zdał sobie z tego sprawę i usunął go z rejestru.

I znaleźć na to pytanie na Stackoverflow i roztwór przepływa przez zastosowanie enableSelfPreservation:falsew config Eureka Server. Robiąc to po chwili, zabita usługa znika zgodnie z oczekiwaniami.

Jednak widzę następujący komunikat:

TRYB SAMOOCHRONY JEST WYŁĄCZONY, TO MOŻE NIE ZABEZPIECZYĆ WYGASANIA INSTANCJI W PRZYPADKU SIECI / INNYCH PROBLEMÓW.

1. Jaki jest cel samozachowawczości? W doc stwierdza, że przy zachowaniu własnej sprawie „klienci mogą uzyskać instancje, które już nie istnieją” . Kiedy więc warto go włączać / wyłączać?

Ponadto, gdy autoochrona jest włączona, możesz otrzymać zaległą wiadomość w ostrzeżeniu konsoli Eureka Server:

NAGŁY WYPADEK! EUREKA MOŻE NIEPRAWIDŁOWO ZGŁOSIĆ SIĘ W PRZYPADKU WYSTĄPIENIA, JEŚLI NIE. ODNOWIENIA SĄ MNIEJSZE NIŻ PRÓG I PONIEWAŻ INSTANCJE NIE WYGASNĄ, TYLKO BY BYĆ BEZPIECZNE.

Teraz przejdźmy do konsoli Spring Eureka.

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

Natknąłem się na dziwne zachowanie liczby progów: kiedy uruchamiam sam serwer Eureka, próg wynosi 1.

2. Mam jeden serwer Eureka i skonfigurowałem go tak, registerWithEureka: falseaby uniemożliwić mu rejestrację na innym serwerze. Więc dlaczego pojawia się w liczbie progowej?

3. Dla każdego klienta rozpoczynam licznik progów rośnie o +2. Wydaje mi się, że to dlatego, że wysyłają 2 wiadomości odnowienia na minutę, prawda?

4. Serwer Eureka nigdy nie wysyła odnowienia, więc ostatnia minuta odnowienia jest zawsze poniżej progu. Czy to normalne?

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

Cfg serwera:

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

Klient 1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true
współzależny
źródło
3
Chcę poświęcić trochę czasu, aby odpowiedzieć na to pytanie. To skomplikowane. Niektóre odpowiedzi są w kodzie Netflix, a inne to konfiguracja. Chcę, aby moja odpowiedź znalazła się w dokumentacji Spring Cloud, ale prawdopodobnie nastąpi to po Święcie Dziękczynienia, chyba że moi koledzy odpowiedzą wcześniej.
spencergibb
To jest małe tło z Netflix: github.com/Netflix/eureka/wiki/ ...
spencergibb
Oto trochę więcej tła: github.com/spring-cloud/spring-cloud-netflix/issues/373
spencergibb
8
@spencergibb to zbliża się 9 miesięcy i brak odpowiedzi .. jakieś dane wejściowe?
Nick
1
@spencergibb Minął już ponad rok. Czy w każdej chwili jest jeszcze szansa na uzyskanie jasnej odpowiedzi? Jakiś świąteczny prezent :)
OcuS

Odpowiedzi:

63

Otrzymałem to samo pytanie, co @codependent spotkałem, dużo googlowałem i przeprowadziłem pewien eksperyment, tutaj przychodzę, aby podzielić się wiedzą na temat działania serwera i instancji Eureka.

Każda instancja musi odnowić swoją dzierżawę na serwerze Eureka z częstotliwością raz na 30 sekund, którą można zdefiniować w eureka.instance.leaseRenewalIntervalInSeconds.

Odnowienia (ostatnia minuta) : reprezentuje liczbę odnowień otrzymanych z instancji Eureka w ciągu ostatniej minuty

Próg odnowień : odnowienia, których oczekuje serwer Eureka, otrzymywane z instancji Eureka na minutę.

Na przykład, jeśli registerWithEurekama wartość false , eureka.instance.leaseRenewalIntervalInSecondsjest ustawiona na 30 i uruchamia 2 instancje Eureka. Dwie instancje Eureka wyślą 4 odnowienia do serwera Eureka w ciągu minuty, minimalny próg serwera Eureka to 1 (zapisany w kodzie), więc próg wynosi 5 (ta liczba zostanie pomnożona przez współczynnik, eureka.server.renewalPercentThresholdktóry zostanie omówiony później).

TRYB SAMOOCHRONY : jeśli Odnowy (ostatnia minuta) jest mniejszy niż próg Odnów , zostanie aktywowany tryb samozachowawczy.

Tak więc w górnym przykładzie TRYB SAMODZIELNEJ OCHRONY jest aktywowany, ponieważ próg wynosi 5, ale serwer Eureka może odbierać tylko 4 odnowienia / min.

  1. Pytanie 1:

TRYB SAMODZIELNEJ KONSERWACJI został zaprojektowany tak, aby uniknąć słabych awarii łączności sieciowej. Łączność między instancjami Eureka A i B jest dobra, ale B nie może odnowić dzierżawy na serwerze Eureka w krótkim okresie z powodu problemów z łącznością, w tej chwili serwer Eureka nie może po prostu wyrzucić instancji B. Jeśli tak, instancja A nie otrzyma dostępnej zarejestrowanej usługi z serwera Eureka, mimo że B jest dostępny. Taki jest więc cel TRYBU SAMOOCHRONY i lepiej go włączyć.

  1. Pytanie 2:

Minimalny próg 1 jest zapisany w kodzie. registerWithEurekama wartość false, więc nie będzie rejestrów instancji Eureka, próg wyniesie 1.

W środowisku produkcyjnym zazwyczaj wdrażamy dwa serwery Eureka i registerWithEurekazostanie to ustawione na true. Tak więc próg będzie wynosił 2, a serwer Eureka będzie odnawiać dzierżawę sobie dwa razy na minutę, więc RENEWALS ARE LESSER THAN THRESHOLDnie będzie problemu.

  1. Pytanie 3:

Tak masz rację. eureka.instance.leaseRenewalIntervalInSecondsokreśla, ile odnowień jest wysyłanych do serwera na minutę, ale pomnoży eureka.server.renewalPercentThresholdwspomniany powyżej współczynnik , wartość domyślna to 0,85.

  1. Pytanie 4:

Tak, to normalne, ponieważ początkowa wartość progu jest ustawiona na 1. Więc jeśli registerWithEurekajest ustawiona na fałsz, odnowienia są zawsze poniżej progu.

Mam na to dwie sugestie:

  1. Wdróż dwa serwery Eureka i włącz registerWithEureka.
  2. Jeśli chcesz wdrożyć tylko w środowisku demonstracyjnym / deweloperskim, możesz ustawić wartość eureka.server.renewalPercentThreshold0,49, więc po uruchomieniu samego serwera Eureka próg będzie wynosił 0.
Nie Xing
źródło
Cześć Nie Xing, czy wiesz, jakie jest znaczenie etykiety: "Wygaśnięcie dzierżawy włączone:"
jabrena
Cześć @jabrena, myślę, że oznacza to, że dzierżawa wygaśnie, jeśli instancja nie odnowi jej dzierżawy na serwerze eureka. Może być powiązany z plikiem eureka.instance.leaseExpirationDurationInSeconds, którego domyślna wartość to 90 sekund. Jeśli ustawisz tę wartość na 0 lub na liczbę ujemną, etykieta może zmienić się na „Wygaśnięcie dzierżawy włączone: Fałsz”. Możesz to wypróbować.
Nie Xing,
czy możesz odpowiedzieć na ten stackoverflow.com/questions/48437752/…
Ankit Bansal
Nie działa. Próg = 0, Odnowienia = 0 nadal wyzwala ostrzeżenie.
SledgeHammer
Wyłączyłem tryb samodzielnej rezerwacji, ale nadal otrzymuję tę wiadomość na Eureka - EUREKA MOŻE NIEPRAWIDŁOWO ZGŁOSIĆ SIĘ, GDY NIE SĄ. ODNOWIENIA SĄ MNIEJSZE NIŻ PRÓG I PONIEWAŻ INSTANCJE NIE WYGASNĄ, TYLKO BY BYĆ BEZPIECZNE. To nie powinno się wydarzyć, prawda?
DHRUV BANSAL
31

Utworzyłem blogu ze szczegółami Eureka tutaj , że wypełnia brakujące szczegółowo z wiosennym doc lub Netflix blogu. Jest wynikiem kilku dni debugowania i przekopywania się przez kod źródłowy. Rozumiem, że lepiej jest kopiować i wklejać niż linkować do zewnętrznego adresu URL, ale zawartość jest zbyt duża, aby uzyskać odpowiedź typu SO.

Abhijit Sarkar
źródło
2
Dziękuję za połączenie takiego wyjaśniającego posta. Zalecana lektura !!
współzależny
2
Cześć @Abhijit Sarkar, artykuł jest niesamowity. Rozwiązałem wiele wątpliwości konfiguracyjnych.
jabrena
0

Możesz spróbować ustawić próg odnowienia we właściwościach serwera eureka. Jeśli masz około 3 do 4 mikrousług do zarejestrowania się na eurece, możesz ustawić to tak:

eureka.server.renewalPercentThreshold=0.33
Vivek Sahu
źródło