該章節緊接第三章,主要是對一些理論上的指導,幫助更好的理解服務治理。
基礎架構
eureka服務治理的基礎架構包含三個要素:
1)服務注冊中心:eureka提供服務端,提供服務的注冊與發現功能。
注:在配置注冊中心時,記得避免注冊中心向自己注冊,需要在配置文件中添加:
eureka.client.register-with-eureka=false(這個是避免eureka向自己進行注冊)
eureka.client.fetch-registry=false(這個是避免eureka查找服務列表)
2)服務提供者:提供服務的應用,可以是springboot應用,也可以是其他技術平台且遵循Eureka通信機制的應用,可以將自己的服務注冊到Eureka上。
3)服務消費者:消費者應用從服務注冊中心獲取服務列表,從而使消費者知道去哪調用所需要的服務。
服務治理機制
服務提供者
服務注冊:
“服務提供者”在啟動的時候會發送REST請求將自己注冊到Eureka Server上,並帶上一些元信息。
Eureka Server接收到REST請求,將元信息存儲在一個雙層Map中,第一層key是服務名,第二層key是具體服務的實例名。
注:在服務注冊時,需要確認一下eureka.client.register-with-eureka=true是否正確,如果為false是禁止向Eureka Server注冊的。
服務同步:
不同的服務提供者分別注冊到了一個注冊中心集群上的不同的注冊中心上。他們的信息被不同的注冊中心維護。
由於在集群中,一個注冊中心互為其他注冊中心的服務,當服務提供者請求到一個服務注冊中心后,它會將請求轉發到其他服務注冊中心,實現注冊中心之間的服務同步。
通過服務同步,服務提供者的服務信息可以通過集群中的任何一個注冊中心獲取。
服務續約:
在注冊完成后。服務提供者會維護一個心跳告訴注冊中心服務政策,防止注冊中心剔除服務,該過程稱為服務續約。
eureka.instance.lease-renewal-interval-in-seconds參數用於定義:服務續約任務的調用間隔時間,默認30s。
eureka.instance.lease-expiration-duration-in-seconds參數用於定義:服務失效時間,默認30s。
服務消費者
獲取服務:
啟動服務消費者后,會發送一個REST請求給服務注冊中心,來獲取上面注冊的服務清單。
Eureka Server會維護一份只讀清單返回給消費者客戶端,該緩存清單30s更新一次。
注:在服務獲取時,確定eureka.client.fetch-registry=true,設置成false,服務客戶端不會再向注冊中心發送請求。
緩存清單的時間配置:eureka.client.registry-fetch-internal-seconds=30s
服務調用:
消費者獲取服務清單后,可以通過服務名獲取到具體服務實例與實例的元數據信息。在Ribbon中默認采用輪詢的方式進行調用,從而實現負載均衡。
服務下線:
當服務實例進行正常的關閉操作時,它會觸發一個服務下線的REST請求給Eureka Server。注冊中心接收到請求后,將該服務狀態置為DOWN,並把下線時間傳播出去。
服務注冊中心
失效剔除:
Eureka Server啟動時會創建定時任務,默認60s一次,將當前清單中超時(90s)沒有續約的服務剔除。
自我保護:
本地調試Eureka的程序時,會出現: 
該警告是觸發了Eureka Server的自我保護機制。
Eureka Server在運行期間,會統計心跳失敗的比例在15分鍾之內是否低於85%,如果低於,就會將當前實例注冊信息保護起來,讓實例不會過期,盡可能保護這些注冊信息。
但是如果在保護期間,實例出現問題,那么客戶端很容易拿到實際已經不存在的服務實例,會出現調用失敗。這個時候客戶端的容錯機制就很重要了。(重新請求,斷路器)
保護機制,可能會導致服務實例不能夠被正確剔除。
在本地開發時,可使用:eureka.server.enable-self-preservation=false關閉保護機制,使不可用實例能夠正常下線。
