微服務 Eureka

Eureka的自我保護模式及註冊中心群集

Terry 2020/11/30 22:13:55
1553

Eureka的自我保護模式及註冊中心群集

 

是否常看到Eureka Server註冊中心的首頁顯示如下的紅色警告訊息呢?

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

如果有看到,就表示Eureka已經進入了自我保護模式,下面來說明Eureka的自我保護模式。

 

Eureka的自我保護模式

當服務註冊到註冊中心後,會定期(預設為30)Server發送一個心跳(heartbeat),告知註冊中心此服務還活著,如果這時實際收到心跳數的比小於閥值(預設85%)時,就會觸發Eureka的自我保護模式。

 

以下圖為例子

Renews threshold: 註冊中心期望收到的心跳數

Renews (last min): 最後一分鐘註冊中心實際收到的心跳數

當後一分鐘註冊中心實際收到的心跳數小於期望收到的心跳數閥值,所以啟動了自我保護模式。

 

自我保護模式的作用

預設情況下,如果Eureka server在一定的時間內(預設為90)沒有收到服務的心跳,Eureka會刪除該服務的註冊,但是如果因為網路不穩定的緣故,會造成服務還活著,但是Eureka server沒有收到服務所發出的心跳的情況,這時啟動護機制會保存服務的註冊表,避免服務的被Eureka server刪除,這種狀態是考慮到服務跟註冊中心之間是因網路問題而非服務本身出問題,而在網路故障恢復後,Eureka server會自動退出自我保護模式。

 

自我保護模式的問題

雖然自我保護模式會讓Eureka server較為穩定,但是如果在自我保護模式的期間,服務真的非正常的下線了,此時就會拿到無效的服務,導致服務失敗。此時可以調整自我保護模式的相關參數,或使用註冊中心群集來提升整體可靠度。

 

自我保護模式的相關參數

(1) Eureka Server端:

eureka.server.enable-self-preservation #自我保護模式,預設為true,設為false可關閉自我保護模式

eureka.server.renewalPercentThreshold #開啟自我保護的係數,預設0.85

eureka.server.eviction-interval-timer-in-ms #服務的清理間隔,預設60*1000(毫秒)

(2) Eureka Client端:

eureka.instance.lease-renewal-interval-in-seconds #續約更新時間間隔,預設30秒,向server發出心跳,表示此服務存活

eureka.instance. lease-expiration-duration-in-seconds #續約到期時間,預設90秒,若超過此時間server都沒有收到心跳,則註銷此服務

開發時,可依照實際情況及需求來調整對應參數。

 

註冊中心群集

單點服務的風險較高,所以使用註冊中心群集,可以降低單點故障的風險。

 

原來的註冊中心(port8761)application.yml設定中加入

eureka:

  client:

    service-url:

      default-zone: http://localhost:8762/eureka/

 

新的註冊中心(port8762)則在application.yml設定中加入

eureka:

  client:

    service-url:

      default-zone: http://localhost:8761/eureka/

註冊中心群集的基本概念就是「互相註冊」,這時就已經完成註冊中心群集了!

 

接下來修改所有的客戶(服務)端,因為要向群集註冊,所以要註冊地址改成如下

eureka:

  client:

    service-url:

      default-zone: http://localhost:8761/eureka/, http://localhost:8762/eureka/ #Eureka Server的位址

 

演示註冊中心群集的效果

啟動後連到http://localhost:8761/ http://localhost:8762/ ,都會看到eureka-client-service-1服務已註冊,此時不論關閉註冊中心87618762,另一個註冊中心也能持續提供服務。

 

結語

在微服務的開發中,常常碰到微服務的狀態沒有及時反映在註冊中心的狀況,所以去網路上搜尋了一下相關的資訊,匯總成本篇文章,本篇文章前半段說明了Eureka server的自我保護模式啟動的機制及原理,以及帶來的效果及影響,並且講解相關可調整的參數,後半演示了簡單的註冊中心群集實作方法以及其效果。

 

Terry