一、服務治理參與者
- 服務注冊中心: eureka-server
- 服務提供者:HELLO-SERVICE
- 服務消費者 :HELLO-CONSUMER
很多時候,客戶端既是服務提供者又是服務消費者,-》@EnableDiscoveryClient。
服務提供者和服務消費者都是Eureka的客戶端,是大部分通信行為的主動發起者。
二、各參與者之間的交互模式
Application-Service --(注冊、續約、下線)--》Eureka-Server
Application-Service --(獲取registry)--》Eureka-Server
Application-Client --(獲取registry)----》Eureka - Server
Application-Client --(本地負載均衡下的遠程調用)----》Application - Service
Eureka-Server1 --(復制) --》 Eureka-Server2 --(復制) --》 Eureka-Server3 --(復制) --》 Eureka-ServerN
三、流程描述
1、服務提供者
1.1、服務注冊
服務提供者 啟動時發送rest請求注冊自己到EurekaServer,注冊自己的一些元數據。
EurekaServer接收注冊內容,放到雙層map,第一層的key是服務名,第二層的key是具體服務實例名。
服務提供者:
eureka.client.register-with-eureka=true,默認值為true。否則將不會啟動注冊操作。
EurekaServer:
1.2、服務同步 - regist
服務注冊中心之間因為互相注冊為服務。所以,當服務提供者發送注冊請求到一個服務注冊中心時,它會將請求轉發給集群中相連的其他注冊中心,從而實現注冊中心之間的服務同步。
1.3、服務續約 - renew
注冊完服務之后,服務提供者會維持一個心跳用來告訴EurekaServer:我還在,防止EurekaServer的剔除任務將該服務實例從服務列表中排除出去!
2、服務消費者
2.1、獲取服務
啟動服務消費者時,服務消費者會發送一個請求給 服務注冊中心,來獲取上面注冊的服務清單。
服務注冊中心會每隔30秒更新一次服務緩存清單。
2.2、服務調用
服務消費者獲得服務清單后,通過服務名可以獲得具體提供服務的實例名和實例元數據信息,可以根據需要決定調用哪個實例。
ribbon中默認采用輪詢方式進行調用,從而實現客戶端的負載均衡。
2.3、服務下線
服務實例關閉,會觸發一個服務下線的rest請求給EurekaServer,告訴服務器,我要下線了!
服務端收到下線請求,將該服務實例狀態設置為下線,並傳播該下線事件。
3、服務注冊中心
3.1、失效剔除
服務實例非正常下線,如:內存溢出、網絡斷開等原因導致服務實例無法正常工作時,服務注冊中心無法按期收到“服務下線“消息請求。
EurekaServer會有一個定時任務,默認每隔一段時間(60秒)從當前清單中剔除沒有續約(默認90秒)的服務實例。
3.2、自我保護
EurekaServer統計心跳失敗比例,如果15分鍾內低於85%,則觸發自我保護機制:保存當前實例信息,讓這些實例不會過期。
三、其他概念
針對區域性故障的容錯集群
一個region 對應多個 zone
微服務應用中使用ribbon調用服務時,會優先訪問同客戶端處於一個zone的服務實例,只有當同一個zone中沒有可用的服務實例時才會訪問其他zone中的實例。