spring-cloud-eureka是spring-cloud-nettfix微服務套件中的一部分, 它基於nettfix-eureka作了二次封裝,主要負責微服務架構中的服務治理功能。
須要JAVA Spring Cloud大型企業分佈式微服務雲構建的B2B2C電子商務平臺源碼一七九一七四三三八零
若是瞭解dubbo的朋友應該知道,dubbo就是一個服務治理的框架,dubbo是基於zookeeper實現服務治理功能的。至於dubbo和nettfix-eureka的區別這裏很少說,網上有很多這類文章。
服務治理通常都會有兩個功能:服務註冊、服務發現。一般會有一個註冊中心,每一個服務單元向註冊中心登記本身信息,好比提供的服務,ip, 端口以及一些附近加信息等。註冊中心會將新的服務實例發送給其它依賴此服務的實例。
spring
服務註冊
服務提供者在啓動時會將本身的信息註冊到Eureka Server, Eureka Server收到信息後, 會將數據信息存儲在一個雙層結構的Map中,其中第一層的key是服務名,第二層的key是具體服務的實例名。架構
服務同步
若是有多個Eureka Server,一個服務提供者向其中一個Eureka Server註冊了,這個Eureka Server會向集羣內的其它Eureka Server轉發這個服務提供者的註冊信息,從而實現實現Eureka Server之間的服務同步。框架
服務續約
在註冊完成成後,服務提供者會維護一個心中持續發送信息給Eureka Server(註冊中心)表示正常運行,以防止Eureka Server將該服務實例從服務列表中剔除。分佈式
服務下線
當服務實例正常關閉時,它會發送一個服務下線的消息給註冊中心,註冊中心收到信息後,會將該服務實例狀態置爲下線,並把該信息傳播出去。微服務
獲取服務
當一個服務實例依賴另外一個服務時,這時這個服務實例又充當了服務消費者,它會發送一個信息給註冊中心, 請求獲取註冊的服務清單,註冊中心會維護一份只讀的服務清單來返回給服務消費者。server
失效剔除
有時候,服務實例可能沒法正常提供服務,而註冊中心沒有收到服務下線的信息。註冊中心會建立一個定時任務,將超過必定時間沒有服務續約消息的服務實例從服務清單中剔除。blog
自我保護
上面講到失效剔除時,會將超過必定時間沒有收到服務續約消息的實例從服務清單中剔除掉,在這中間還有一個邏輯。若是在運行期間,統計心跳成功的比例低於85%(心跳閾值),註冊中心會將當前服務清單中的實例註冊信息保護起來,讓這些實例不會過時。可是在這種狀況下,若服務實例出現問題,那麼服務消費者可能會拿到實際已經不能正常運行的服務實例,就會出現調用失敗的狀況,因此客戶端須要有容錯機制,好比請求重試,或斷路器等。ip
可是有一個定時任務默認每15分鐘執行一次,會根據運行情況從新計算心跳閾值;但也可能不從新計算,這時,Eureka Server的自我保護狀態會一直存在。同步
若是要關閉自我保護機制,能夠將eureka.server.enable-self-preservation設置爲false,以確保註冊中心將不可用的服務實例及時剔除。源碼