服務(wù)發(fā)現(xiàn):Eureka客戶端
服務(wù)發(fā)現(xiàn)是微服務(wù)架構(gòu)中的一項(xiàng)核心服務(wù)。如果沒(méi)有該服務(wù)取胎,我們就只能為每一個(gè)服務(wù)調(diào)用者手工配置可用服務(wù)的地址展哭,這不僅繁瑣而且非常容易出錯(cuò)湃窍。Eureka包括了服務(wù)端和客戶端兩部分。服務(wù)端可以做到高可用集群部署匪傍,每一個(gè)節(jié)點(diǎn)可以自動(dòng)同步您市,有相同的服務(wù)注冊(cè)信息。
向Eureka注冊(cè)服務(wù)
當(dāng)客戶端向Eureka注冊(cè)自己時(shí)會(huì)提供一些元信息役衡,如主機(jī)名茵休、端口號(hào)、獲取健康信息的url和主頁(yè)等手蝎。Eureka通過(guò)心跳連接判斷服務(wù)是否在線榕莺,如果心跳檢測(cè)失敗超過(guò)指定時(shí)間,對(duì)應(yīng)的服務(wù)通常就會(huì)被移出可用服務(wù)列表棵介。
譯者注:向Eureka Server注冊(cè)過(guò)的服務(wù)會(huì)每30秒向Server發(fā)送一次心跳連接, Server會(huì)根據(jù)心跳數(shù)據(jù)更新該服務(wù)的健康狀態(tài)并復(fù)制到其他Server中钉鸯。如果超過(guò)90秒沒(méi)有收到該服務(wù)的心跳數(shù)據(jù),則Server會(huì)將該服務(wù)移出列表邮辽。
注冊(cè)項(xiàng)目實(shí)際就是一個(gè)普通的Spring Boot應(yīng)用唠雕,使用@EnableDiscoveryClient注解后,會(huì)自動(dòng)向Eureka注冊(cè)中心吨述,變成Rureka服務(wù)端實(shí)例岩睁,
服務(wù)注冊(cè)中心實(shí)際也是一個(gè)普通SpringBoot應(yīng)用,使用了@EnableEurekaServer注解后揣云,啟動(dòng)應(yīng)用捕儒,Eureka有一個(gè)帶UI的主頁(yè),注冊(cè)信息都在/訪問(wèn)
Basic Architecture
上圖簡(jiǎn)要描述了Eureka的基本架構(gòu)灵再,由3個(gè)角色組成:
Eureka Server
提供服務(wù)注冊(cè)和發(fā)現(xiàn)
Service Provider
服務(wù)提供方
將自身服務(wù)注冊(cè)到Eureka肋层,從而使服務(wù)消費(fèi)方能夠找到
Service Consumer
服務(wù)消費(fèi)方
從Eureka獲取注冊(cè)服務(wù)列表亿笤,從而能夠消費(fèi)服務(wù)
需要注意的是翎迁,上圖中的3個(gè)角色都是邏輯角色。在實(shí)際運(yùn)行中净薛,這幾個(gè)角色甚至可以是同一個(gè)實(shí)例汪榔,比如在我們項(xiàng)目中,Eureka Server和Service Provider就是同一個(gè)JVM進(jìn)程肃拜。
More in depth
上圖更進(jìn)一步的展示了3個(gè)角色之間的交互痴腌。
Service Provider會(huì)向Eureka Server做Register(服務(wù)注冊(cè))、Renew(服務(wù)續(xù)約)燃领、Cancel(服務(wù)下線)等操作士聪。
Eureka Server之間會(huì)做注冊(cè)服務(wù)的同步,從而保證狀態(tài)一致
Service Consumer會(huì)向Eureka Server獲取注冊(cè)服務(wù)列表猛蔽,并消費(fèi)服務(wù)
實(shí)現(xiàn)細(xì)節(jié):
ApplicationResource類接收Http服務(wù)請(qǐng)求剥悟,調(diào)用PeerAwareInstanceRegistryImpl的register方法
private final PeerAwareInstanceRegistry registry;//實(shí)現(xiàn)注冊(cè) InstancInfo包含 instancdId灵寺、appName、ipAddr区岗、port略板、securePosrt....
@POST
@Consumes({"application/json", "application/xml"})
public Response addInstance(InstanceInfo info, @HeaderParam("x-netflix-discovery-replication") String isReplication) {
logger.debug("Registering instance {} (replication={})", info.getId(), isReplication);
....處理失敗返回
this.registry.register(info, "true".equals(isReplication));
return Response.status(204).build();
}
PeerAwareInstanceRegistryImpl完成服務(wù)注冊(cè)后,調(diào)用replicateToPeers向其它Eureka Server節(jié)點(diǎn)(Peer)做狀態(tài)同步
Chapter9-1-1 實(shí)現(xiàn)簡(jiǎn)單注冊(cè)功能
未完待續(xù)慈缔。叮称。。
參考資料:http://docs.springcloud.cn/user-guide/eureka/
參考資料:http://nobodyiam.com/2016/06/25/dive-into-eureka/(細(xì)節(jié)實(shí)現(xiàn))