2016-07-20 92 views
1

我在使用Docker的Spring Cloud環境中使用Netflix Eureka和Zuul時目前遇到問題。Zuul和Eureka的Spring雲無法處理服務實例正在關閉

我目前的設置如下:3個Docker容器:

  • 一個尤里卡服務器
  • 使用尤里卡映射路由服務和負載同一服務的多個容器之間平衡一個Zuul服務器。
  • 服務(目前只返回一個簡單的字符串)

這種設置工作正常,但是當我開始與服務的比例打麻煩開始了。 當我擴大規模時,Zuul會在30秒後拿起新服務器。那個我能接受。但是,當我關閉服務容器時,由於Zuul仍認爲服務器在活動池中,因此對Zuul的調用可能會失敗(HTTP錯誤代碼爲200!)。

我使用Spring 1.3.6引導和Spring 1.1.2雲

我的問題:

  • 可以Zuul被配置爲重試通話?
  • 有沒有辦法強制Zuul使用REST調用對所有服務器執行ping操作?據我所見,這沒有Spring Cloud端點。發佈到/路線不會做我想要的。
  • 如果這是不可能的,當服務器沒有及時響應時,Zuul是否可以配置爲實際發送除200之外的其他內容?
+0

幾個問題... 你究竟是什麼意味着對Zuul的調用失敗,錯誤代碼爲200?你能提供一個示例迴應嗎? 另外,當您將實例上/下時,Zuul(或其他Eureka客戶端)需要一段時間才能知道,因爲客戶端需要刷新Eureka服務器的數據。 Zuul在刷新了Eureka的數據之後是否最終發現實例不再起作用? –

+0

當我關閉容器時,對路由到服務器的現在無法訪問的Zuul調用將返回一個HTTP響應代碼爲200的空白頁面。所以客戶無法知道他可能需要重試。我預計會有504或503. Zuul確實在ping時間間隔(即30秒)後確定某些服務器不再可用,並將它們從LB中刪除。但在這30秒內,電話正在返回空白頁面,這沒有意義。 –

+0

另一方面,Eureka知道服務器何時從註冊表中移除,所以我想知道是否有辦法將該事件掛接到Zuul,以便如果服務器取消註冊,Zuul會得到一個需要刷新的信號其服務器列表。如果在LB中沒有立即提供新服務器,這並不是真正的問題,但是如果您縮減基礎服務並且需要30秒才能趕上LB,那麼這是一個問題,特別是如果有一個系統知道它(尤里卡)。 –

回答

0

您不必告知zuul服務器列表中的更改,如下所示。真正的問題在於,尤里卡決定將這些實例保存在其註冊表中。 有一條規則:如果少於85%的服務響應健康檢查,則eureka認爲它是由於網絡故障/分區並將所有服務保留在註冊表中。例如,如果您僅有3個服務實例,則很可能會發生這種情況。正如你可以想象的那樣,如果一個關閉(三個實例中的33.3%),尤里卡將忽略它並仍然將這個實例提供給客戶端。

如果你有100個服務器,它可能是一個很好的功能:)它的netflix工具主要是爲了他們的需要而調整的。

你可以嘗試切換自保持關閉:

eureka.server.enable-self-preservation=false 

或調整門檻,一些較低值:

eureka.server.renewal-percent-threshold=0.85 

http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_appendix_compendium_of_configuration_properties

相關問題