Spring Cloud Eureka Sunucusunun kendini koruma ve yenileme eşiğini anlama


83

Mikro hizmetler geliştirme konusunda yeniyim, ancak bir süredir bu konuda araştırma yapmama rağmen hem Spring'in belgelerini hem de Netflix'in belgelerini okuyorum.

Github'da mevcut olan basit bir projeye başladım . Temelde bir Eureka sunucusu (Archimedes) ve üç Eureka istemci mikro hizmeti (bir genel API ve iki özel). Ayrıntılı bir açıklama için github'ın benioku dosyasına bakın.

Mesele şu ki, her şey çalışırken, özel mikro hizmetlerden biri öldürülürse, Eureka sunucusu bunu fark eder ve kayıt defterinden kaldırır.

Ben Stackoverflow üzerinde bu soruyu buldum ve çözüm kullanarak geçer enableSelfPreservation:falseEureka Sunucu yapılandırmasında. Bunu bir süre sonra yapmak, öldürülen servis beklendiği gibi kaybolur.

Ancak şu mesajı görebiliyorum:

KENDİ KENDİNİ KORUMA MODU KAPATILMIŞTIR. BU ŞEBEKE / DİĞER SORUNLAR DURUMUNDA KURULUMUN SONA ERMESİNİ KORUMAYABİLİR.

1. Kendini korumanın amacı nedir? Doc devletler bu konuda kendini koruma ile "müşteriler artık yok örneklerini alabilirsiniz" . Öyleyse ne zaman açıp kapatmanız önerilir?

Ayrıca, kendini koruma açıkken, Eureka Sunucu konsolunda olağanüstü bir mesaj alabilirsiniz uyarısı:

ACİL DURUM! EUREKA OLMADIĞINDA YANLIŞ BİR ŞEKİLDE İDDİA EDEN ANLAŞMALARI UZAYABİLİR. YENİLEMELER EŞİKTEN DAHA DAHA AZ OLDUĞUNDAN DOLAYI GÜVENLİ OLMAK İÇİN ÖRNEKLERİN SÜRESİ SONA ERMEMEKTEDİR.

Şimdi, Spring Eureka Konsolu ile devam ediyoruz.

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

Eşik sayısının garip bir davranışıyla karşılaştım: Eureka Sunucusunu tek başına başlattığımda eşik 1'dir.

2. Tek bir Eureka sunucum var ve registerWithEureka: falsebaşka bir sunucuya kaydolmasını önlemek için yapılandırıldım . O zaman neden eşik sayısında görünüyor?

3. Başladığım her müşteri için eşik sayısı +2 artar. Sanırım dakika başına 2 yenileme mesajı gönderdikleri için değil mi?

4. Eureka sunucusu asla bir yenileme göndermez, bu nedenle son dakika yenilenmeleri her zaman eşiğin altındadır. Bu normal mi?

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

Sunucu 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

İstemci 1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

3
Bu soruyu cevaplamak için zaman ayırmak istiyorum. Karmaşık. Cevaplardan bazıları Netflix kodunda, diğerleri ise yapılandırmadır. Cevabımın Spring Cloud belgelerinin bir parçası olmasını istiyorum, ancak meslektaşlarım daha önce cevap vermezse büyük olasılıkla Şükran Günü'nden sonra olacak.
spencergibb

Bu Netflix'ten küçük bir arka plan: github.com/Netflix/eureka/wiki/…
spencergibb


8
@spencergibb bu 9 ay yaklaşıyor ve cevap yok .. herhangi bir girdi?
Nick

1
@spencergibb Artık bir yıldan fazla oldu. Hala herhangi bir zamanda net bir cevap alma şansı var mı? Bir çeşit Noel hediyesi :)
OcuS

Yanıtlar:


63

@Codependent ile aynı soruyu aldım, Google'da çok araştırdım ve biraz deney yaptım, burada Eureka sunucusu ve örneğinin nasıl çalıştığı hakkında biraz bilgi vermeye geldim.

Her örnek, Eureka Sunucusuna kiralamasını, 30 saniyede bir kez olmak üzere, içinde tanımlanabilecek şekilde yenilemelidir eureka.instance.leaseRenewalIntervalInSeconds.

Yenilemeler (son dakika) : Eureka örneğinden son dakikada kaç yenileme alındığını gösterir

Yenileme eşiği : Eureka sunucusunun dakika başına Eureka örneğinden alınmasını beklediği yenilenmeler.

Örneğin, registerWithEurekaayarlanır FALSE , eureka.instance.leaseRenewalIntervalInSeconds30 olarak ayarlanır ve 2 Eureka örneği çalıştırılır. İki Eureka örneği gönderir 4 dakika 'Eureka sunucusuna YeniliyorNEW Eureka sunucusu en az bir eşiktir 1 (kodda yazılmış) eşik yani, 5 (bu sayı çoklu bir faktör olacaktır eureka.server.renewalPercentThresholddaha sonra ele alınacaktır).

KENDİNİ KORUMA MODU : Yenilemeler (son dakika) Yenileme eşiğinin altındaysa , kendini koruma modu etkinleştirilecektir.

Bu yüzden üst örnekte, KENDİNİ KORUMA MODU etkinleştirilir, çünkü eşik 5'dir, ancak Eureka sunucusu yalnızca 4 yenileme / dakika alabilir.

  1. Soru 1:

KENDİ KENDİNE KORUMA MODU, zayıf ağ bağlantısı arızalarını önlemek için tasarlanmıştır. Eureka örneği A ve B arasındaki bağlantı iyidir, ancak B, bağlantı kesintileri nedeniyle Eureka sunucusundaki kirasını kısa bir süre içinde yenileyemedi, şu anda Eureka sunucusu yalnızca örnek B'yi başlatamaz. Eğer öyleyse, örnek B mevcut olmasına rağmen A, Eureka sunucusundan kayıtlı hizmet alamayacaktır. Yani KENDİNİ KORUMA MODUNUN amacı budur ve onu açmak daha iyidir.

  1. Soru 2:

Minimum eşik 1 kodda yazılır. registerWithEurekayanlış olarak ayarlandığında Eureka örnek kaydı olmayacak, eşik 1 olacaktır.

Üretim ortamında, genellikle iki Eureka sunucusu kuruyoruz ve registerWithEurekadoğru olarak ayarlanacağız. Yani eşik 2 olacak ve Eureka sunucusu kira kontratını dakikada iki kez yenileyecek, bu yüzden RENEWALS ARE LESSER THAN THRESHOLDsorun olmayacak.

  1. Soru 3:

Evet haklısın. eureka.instance.leaseRenewalIntervalInSecondsSunucuya dakika başına kaç yenileme gönderildiğini tanımlar, ancak eureka.server.renewalPercentThresholdyukarıda belirtilen bir faktörü çarpacaktır , varsayılan değer 0.85'tir.

  1. Soru 4:

Evet, normaldir, çünkü eşik başlangıç ​​değeri 1'e ayarlanmıştır. Bu nedenle registerWithEurekayanlış olarak ayarlanırsa, yenilemeler her zaman eşiğin altındadır.

Bunun için iki önerim var:

  1. İki Eureka sunucusunu dağıtın ve etkinleştirin registerWithEureka.
  2. Demo / dev ortamında konuşlandırmak istiyorsanız, 0.49'a ayarlayabilirsiniz eureka.server.renewalPercentThreshold, böylece tek başına bir Eureka sunucusu başlattığınızda, eşik 0 olacaktır.

Merhaba Nie Xing, Etiketin anlamının ne olduğunu biliyor musunuz: "Kira süresi etkin:"
jabrena

Merhaba @jabrena, örneğin eureka sunucusuna kira sözleşmesini yenilemezse kira süresinin dolacağı anlamına geldiğini düşünüyorum. Varsayılan olarak 90 saniye olan eureka.instance.leaseExpirationDurationInSeconds ile ilgili olabilir. Bu değeri 0 veya negatif bir sayı olarak ayarlarsanız, etiket "Kira süresi etkin: Yanlış" olarak değişebilir. Deneyebilirsiniz.
Nie Xing


Çalışmıyor. Eşik = 0, Yenilemeler = 0 hala uyarıyı tetikler.
SledgeHammer

SelfPreservationMode'u devre dışı bıraktım ama yine de Eureka'da bu mesajı alıyorum - EUREKA OLMADIĞINDA YANLIŞ BİR ŞEKİLDE İDDİA EDİYOR OLABİLİR. YENİLEMELER EŞİKTEN DAHA DAHA AZ OLDUĞUNDAN DOLAYI GÜVENLİ OLMAK İÇİN ÖRNEKLERİN SÜRESİ SONA ERMEMEKTEDİR. Doğru olmamalı mı?
DHRUV BANSAL

31

Burada Eureka'nın ayrıntılarını içeren, Spring doc veya Netflix blogundaki bazı eksik ayrıntıları dolduran bir blog yazısı oluşturdum . Bu, birkaç günlük hata ayıklama ve kaynak kodu üzerinde araştırma yapmanın sonucudur. Harici bir URL'ye bağlantı vermek yerine kopyalayıp yapıştırmanın tercih edildiğini anlıyorum, ancak içerik SO yanıtı için çok büyük.


2
Böyle açıklayıcı bir gönderiyi bağladığınız için teşekkür ederiz. Önerilen bir okuma !!
bağlaşık

2
Merhaba @Abhijit Sarkar, makale harika. Birçok konfigürasyon şüphesini çözdüm.
jabrena

0

Eureka sunucu özelliklerinizde yenileme eşiği sınırını ayarlamayı deneyebilirsiniz. Eureka'ya kaydolmak için yaklaşık 3 ila 4 Mikro Hizmetiniz varsa, bunu şu şekilde ayarlayabilirsiniz:

eureka.server.renewalPercentThreshold=0.33
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.