不少時候,客戶端既是服務提供者又是服務消費者,-》@EnableDiscoveryClient。緩存
服務提供者和服務消費者都是Eureka的客戶端,是大部分通訊行爲的主動發起者。服務器
Application-Service --(註冊、續約、下線)--》Eureka-Server網絡
Application-Service --(獲取registry)--》Eureka-Server負載均衡
Application-Client --(獲取registry)----》Eureka - Server微服務
Application-Client --(本地負載均衡下的遠程調用)----》Application - Servicerest
Eureka-Server1 --(複製) --》 Eureka-Server2 --(複製) --》 Eureka-Server3 --(複製) --》 Eureka-ServerNserver
服務提供者 啓動時發送rest請求註冊本身到EurekaServer,註冊本身的一些元數據。blog
EurekaServer接收註冊內容,放到雙層map,第一層的key是服務名,第二層的key是具體服務實例名。事件
服務提供者:內存
eureka.client.register-with-eureka=true,默認值爲true。不然將不會啓動註冊操做。
EurekaServer:
服務註冊中心之間由於互相註冊爲服務。因此,當服務提供者發送註冊請求到一個服務註冊中心時,它會將請求轉發給集羣中相連的其餘註冊中心,從而實現註冊中心之間的服務同步。
註冊完服務以後,服務提供者會維持一個心跳用來告訴EurekaServer:我還在,防止EurekaServer的剔除任務將該服務實例從服務列表中排除出去!
啓動服務消費者時,服務消費者會發送一個請求給 服務註冊中心,來獲取上面註冊的服務清單。
服務註冊中心會每隔30秒更新一次服務緩存清單。
服務消費者得到服務清單後,經過服務名能夠得到具體提供服務的實例名和實例元數據信息,能夠根據須要決定調用哪一個實例。
ribbon中默認採用輪詢方式進行調用,從而實現客戶端的負載均衡。
服務實例關閉,會觸發一個服務下線的rest請求給EurekaServer,告訴服務器,我要下線了!
服務端收到下線請求,將該服務實例狀態設置爲下線,並傳播該下線事件。
服務實例非正常下線,如:內存溢出、網絡斷開等緣由致使服務實例沒法正常工做時,服務註冊中心沒法定期收到「服務下線「消息請求。
EurekaServer會有一個定時任務,默認每隔一段時間(60秒)從當前清單中剔除沒有續約(默認90秒)的服務實例。
EurekaServer統計心跳失敗比例,若是15分鐘內低於85%,則觸發自我保護機制:保存當前實例信息,讓這些實例不會過時。
針對區域性故障的容錯集羣
一個region 對應多個 zone
微服務應用中使用ribbon調用服務時,會優先訪問同客戶端處於一個zone的服務實例,只有當同一個zone中沒有可用的服務實例時纔會訪問其餘zone中的實例。