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:false
w 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: false
aby 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
źródło
Odpowiedzi:
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
registerWithEureka
ma wartość false ,eureka.instance.leaseRenewalIntervalInSeconds
jest 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.renewalPercentThreshold
któ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.
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ć.
Minimalny próg 1 jest zapisany w kodzie.
registerWithEureka
ma 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
registerWithEureka
zostanie 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ęcRENEWALS ARE LESSER THAN THRESHOLD
nie będzie problemu.Tak masz rację.
eureka.instance.leaseRenewalIntervalInSeconds
określa, ile odnowień jest wysyłanych do serwera na minutę, ale pomnożyeureka.server.renewalPercentThreshold
wspomniany powyżej współczynnik , wartość domyślna to 0,85.Tak, to normalne, ponieważ początkowa wartość progu jest ustawiona na 1. Więc jeśli
registerWithEureka
jest ustawiona na fałsz, odnowienia są zawsze poniżej progu.Mam na to dwie sugestie:
registerWithEureka
.eureka.server.renewalPercentThreshold
0,49, więc po uruchomieniu samego serwera Eureka próg będzie wynosił 0.źródło
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.
źródło
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
źródło