Spring Cloud系列教程第九篇-Eureka自我保護機制
本文主要內容:
1:自我保護介紹
2:導致原因分析
3:怎麼禁止自我保護
本文是由凱哥(凱哥Java:kagejava)釋出的《spring cloud系列》教程的總第九篇:
本文是幾個維度中的第一個維度:註冊與發現維度配置中心管理之Eureka相關教程第六篇。
一:Eureka的自我保護機制是什麼?
保護模式主要用於一組客戶端和Eureka Server之間存在網路分割槽場景下的保護。一旦進入保護模式,Eureka Server將會嘗試保護其服務登錄檔中的資訊,不再刪除服務登錄檔中的資料,也就是不會登出任何微服務。
簡單一句話:
用電視劇新三國中,劉備說的:“寧可天下人負我,我不負天下人”。即:Eureka服務端,進入自我保護模式,就算所有的微服務真的都出問題了,也不會裡面刪除它們的。
二:為什麼會出現自我保護機制?
一句話:某時刻某一個微服務不可用了,Eureka不會立刻清理,依舊會對該服務的資訊進行儲存。屬於CAP裡面的AP分支,也即是:保證可用性、分割槽容錯性。
PS:CAP原則:分散式系統中,C:一致性;A:可用性;P:分割槽容錯性。
我們來看看百度百科對CAP原則的詳細介紹,如下圖:
為什麼會產生Eureka自我保護機制?
為例防止EurekaClient可以正常執行,但是與Eureka Server網路不通情況下,EurekaServer 不會立刻將EurekaClient服務剔除
預設情況下,如果EurekaServer在一定時間內沒有收到某個微服務例項的心跳,EurekaServer將會登出該例項(預設90s).但是當網路分割槽故障發生(延時、卡頓、擁擠)時候,微服務與EurekaServer之間無法正常通訊,以上行為可能變得非常危險了--因為微服務本身其實是健康的。此時本不應該登出這個微服務的。Eureka通過"自我保護模式"來解決這個問題--當EurekaServer節點在短時間內丟失過多客戶端時候(可能發生了網路分割槽故障),那麼這個節點就會進入自我保護模式了。
綜上,自我保護是一種應對網路異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的、不健康的微服務都會保留),也不盲目登出任何健康的微服務。
職用自我保護模式,可以讓Eureka叢集更加的健壯和穩定
三:怎麼禁止Eureka的自我保護?
出廠預設,自我保護機制是開啟的:eureka.server.enable-self-preservation=true
3.1:來看看開啟自我保護模式的時候,Eureka服務端提示:
3.2:修改服務導關閉自我保護
修改Eureka Server專案:7001專案的yml配置:
關閉自我保護機制,同時修改心跳時間為2s.如下圖:
重啟Eureka服務專案,來看看關閉自我保護模式後提示:
我們來修改客戶端(payment8001專案)的yml配置檔案:
Eureka客戶端向服務端傳送心跳的時間間隔。單位秒。預設30s。修改為1s.
Eureka服務導在收到最後一次心跳後等待時間上限,超時將剔除服務。單位秒,預設90s,修改值為2s.如下圖:
測試關閉自我保護機制:
啟動服務端7001專案,再啟動客戶端8001專案,我們可以在頁面檢視客戶端成功註冊到服務端了。如下圖:
我們關閉客戶端8001專案後,間隔2秒+以後,在重新整理頁面.可以看到客戶端被移除了。如下圖:
當出現這個效果,說明,我們測試成功了。
當eureka關閉自我保護模式後,只要檢查到客戶端沒有傳送心跳檢測,就將客戶端從註冊列表中移除了。這是很危險的。
用一句話來形容,關閉自我保護模式的Eureka服務:曹孟德曰:寧可我負天下人,不可天下人負我。
為什麼說,沒有了自我保護機制很危險?
有可能因為網路原因,沒有傳送心跳成功,但是實際上客戶端是正常執行的。如果這個時候,直接移除掉客戶端,可能造成服務大面積不能使用。是很危險的一個操作。所以,最好別關閉自我保護機制
《spring cloud系列教程》: