Spring Cloud之Eureka服務(wù)注冊(cè)與發(fā)現(xiàn)(概念原理篇)

解決什么問(wèn)題


?闡述微服務(wù)以及服務(wù)注冊(cè)發(fā)現(xiàn)的部分概念

?闡述Eureka服務(wù)注冊(cè)與發(fā)現(xiàn)的部分原理及細(xì)節(jié)

為什么需要服務(wù)中心


過(guò)去,每個(gè)應(yīng)用都是一個(gè)CPU,一個(gè)主機(jī)上的單一系統(tǒng)。然而今天,隨著大數(shù)據(jù)和云計(jì)算時(shí)代的到來(lái),任何獨(dú)立的程序都可以運(yùn)行在多個(gè)計(jì)算機(jī)上。并且隨著業(yè)務(wù)的發(fā)展,訪問(wèn)用戶量的增加,開(kāi)發(fā)人員或小組的增加,系統(tǒng)會(huì)被拆分成多個(gè)功能模塊。拆分后每個(gè)功能模塊可以作為一個(gè)獨(dú)立的子系統(tǒng)提供其職責(zé)范圍內(nèi)的功能。而多個(gè)子系統(tǒng)中,由于職責(zé)不同并且會(huì)存在相互調(diào)用,同時(shí)可能每個(gè)子系統(tǒng)還需要多個(gè)實(shí)例部署在多臺(tái)服務(wù)器或者鏡像中,導(dǎo)致了子系統(tǒng)間的相互調(diào)用形成了一個(gè)錯(cuò)綜復(fù)雜的網(wǎng)狀結(jié)構(gòu)。用幾幅圖說(shuō)明一下:

單體應(yīng)用:

隨著業(yè)務(wù)的發(fā)展,經(jīng)過(guò)了多個(gè)系統(tǒng)架構(gòu)的演變,變成了這樣(拿百度的功能舉個(gè)栗子):

圖中,每個(gè)網(wǎng)頁(yè)搜索子系統(tǒng)和百度地圖子系統(tǒng)的實(shí)例都可以視同為一個(gè)微服務(wù)。網(wǎng)頁(yè)搜索子系統(tǒng)為百度地圖子系統(tǒng)提供了“用戶查詢內(nèi)容、用戶IP地址”等信息提供的服務(wù)接口,為百度地圖子系統(tǒng)定位用戶地理信息情況提供數(shù)據(jù)依據(jù)。

百度地圖子系統(tǒng)提供了“根據(jù)內(nèi)容查詢出地圖信息”的接口提供給其他子系統(tǒng)調(diào)用,而這里網(wǎng)頁(yè)搜索子系統(tǒng)調(diào)用了這個(gè)接口,獲取地圖相關(guān)信息。

網(wǎng)頁(yè)搜索子系統(tǒng)和百度地圖子系統(tǒng)又提供了各自對(duì)外用戶調(diào)用的網(wǎng)頁(yè)搜索、地圖搜索等各自的對(duì)外服務(wù)。這個(gè)過(guò)程就形成了以上錯(cuò)綜復(fù)雜的網(wǎng)狀結(jié)構(gòu)。而實(shí)際上這樣還遠(yuǎn)遠(yuǎn)不夠,因?yàn)槊總€(gè)子系統(tǒng)往往會(huì)提供多個(gè)對(duì)內(nèi)的其他子系統(tǒng)調(diào)用的服務(wù)接口,同時(shí)也會(huì)調(diào)用多個(gè)不同子系統(tǒng)提供的多個(gè)服務(wù)接口,還會(huì)對(duì)外提供多個(gè)各自的服務(wù)接口。所以實(shí)際中上圖的網(wǎng)狀調(diào)用結(jié)構(gòu)將會(huì)成幾何倍的擴(kuò)張。而且隨著用戶量的增加,每個(gè)子系統(tǒng)還需要繼續(xù)增加更多的實(shí)例來(lái)提供服務(wù),從而導(dǎo)致了凌亂的加劇。

對(duì)于微服務(wù)之間錯(cuò)綜復(fù)雜的調(diào)用關(guān)系,通過(guò)eureka來(lái)管理,可以讓每個(gè)服務(wù)之間不用關(guān)心如何調(diào)用的問(wèn)題,專注于自己的業(yè)務(wù)功能實(shí)現(xiàn)。

從系統(tǒng)架構(gòu)的演變到對(duì)于微服務(wù)架構(gòu)的思考


為什么上圖中的系統(tǒng)演變最終會(huì)變成如圖所示的樣子?這是一種架構(gòu)思維,這里不擴(kuò)展來(lái)說(shuō)。簡(jiǎn)單描述一下微服務(wù)架構(gòu)是為了解決什么問(wèn)題。隨著系統(tǒng)結(jié)構(gòu)、架構(gòu)的演變,系統(tǒng)功能的增加,用戶量的增加,開(kāi)發(fā)人員的增加等各種增加情況下,需要有一個(gè)比較好擴(kuò)展的系統(tǒng)架構(gòu)來(lái)快速、盡量減少代碼改動(dòng)的前提下以支持系統(tǒng)功能的開(kāi)發(fā),用戶量增加導(dǎo)致的硬件資源橫向擴(kuò)容,以及開(kāi)發(fā)人員增加時(shí)的協(xié)同工作效率。在此基礎(chǔ)上需要解決系統(tǒng)的穩(wěn)定性、容錯(cuò)性、高并發(fā)的支持性等。以及隨著系統(tǒng)功能的增加如何有效的管理系統(tǒng),排查、定位系統(tǒng)問(wèn)題。同時(shí)當(dāng)參與項(xiàng)目的人(包含測(cè)試、運(yùn)維、業(yè)務(wù)等人員)越來(lái)越多時(shí),如何能更高效的彼此之間協(xié)同辦公的效率等等。

所以微服務(wù)架構(gòu)需要考慮的不僅僅是軟件架構(gòu)本身,需要從參與到整個(gè)項(xiàng)目實(shí)施過(guò)程中的各個(gè)環(huán)節(jié),可能的問(wèn)題以及人員協(xié)同的整體情況去考慮。讓整個(gè)項(xiàng)目做到可用(滿足功能以及硬件資源的橫向擴(kuò)容)、可行(滿足整個(gè)系統(tǒng)運(yùn)行中的各個(gè)點(diǎn)的監(jiān)控、排錯(cuò)等)、可持續(xù)(滿足系統(tǒng)功能的可持續(xù)集成、以及系統(tǒng)運(yùn)行的可持續(xù)性)以及高效(系統(tǒng)運(yùn)行的高效、人員協(xié)同工作的高效、功能迭代的高效等)。

Eureka應(yīng)用場(chǎng)景中的一些概念


微服務(wù):

Spring Cloud提供了微服務(wù)解決的一整套方案,而Eureka是其重要組件,所以先要了解什么是“微服務(wù)”。在大型系統(tǒng)架構(gòu)中,會(huì)拆分多個(gè)子系統(tǒng)。這些系統(tǒng)往往都有這幾個(gè)功能:提供接口,調(diào)用接口,以及該子系統(tǒng)自身的業(yè)務(wù)功能。這樣的一個(gè)子系統(tǒng)就稱為一個(gè)“微服務(wù)”。(可以理解為一個(gè)子系統(tǒng)的代碼所實(shí)現(xiàn)的功能)

比如百度的搜索子系統(tǒng),就具備了:根據(jù)用戶的輸入的信息對(duì)信息分詞功能、對(duì)每個(gè)分詞給予權(quán)重功能、然后根據(jù)分詞和權(quán)重等信息計(jì)算出網(wǎng)頁(yè)相關(guān)度功能、最后把相關(guān)度高的網(wǎng)頁(yè)按照一定算法排序后提供結(jié)果功能、記錄用戶錄入信息功能等等業(yè)務(wù)功能。同時(shí)它還提供用戶錄入信息提供的接口給其它子系統(tǒng)調(diào)用,如地圖子系統(tǒng)、廣告推薦子系統(tǒng)會(huì)調(diào)用該接口后完成各自的業(yè)務(wù)功能。同時(shí)搜索子系統(tǒng)也會(huì)調(diào)用其它子系統(tǒng)的接口,如調(diào)用地圖子系統(tǒng)的地圖顯示接口等。

實(shí)例:

每個(gè)服務(wù)都會(huì)部署到多個(gè)機(jī)器(或鏡像)中,這些多個(gè)部署的應(yīng)用就是實(shí)例。(可以理解為一套子系統(tǒng)代碼被部署到了多個(gè)機(jī)器上)

Eureka的管理:

基于以上概念,使用Eureka管理時(shí)會(huì)具備幾個(gè)特性:

→服務(wù)需要有一個(gè)統(tǒng)一的名稱(或服務(wù)ID)并且是唯一標(biāo)識(shí),以便于接口調(diào)用時(shí)各個(gè)接口的區(qū)分。并且需要將其注冊(cè)到Eureka Server中,其他服務(wù)調(diào)用該接口時(shí),也是根據(jù)這個(gè)唯一標(biāo)識(shí)來(lái)獲取。

→服務(wù)下有多個(gè)實(shí)例,每個(gè)實(shí)例也有一個(gè)自己的唯一實(shí)例ID。因?yàn)樗鼈兏髯杂凶约旱幕A(chǔ)信息如:不同的IP。所以它們的信息也需要注冊(cè)到Eureka Server中,其他服務(wù)調(diào)用它們的服務(wù)接口時(shí),可以查看到多個(gè)該服務(wù)的實(shí)例信息,根據(jù)負(fù)載策略提供某個(gè)實(shí)例的調(diào)用信息后,調(diào)用者根據(jù)信息直接調(diào)用該實(shí)例。

eureka如何管理服務(wù)調(diào)用


eureka如何管理服務(wù)調(diào)用的?我們先來(lái)看個(gè)圖:

→在Eureka Client啟動(dòng)的時(shí)候,將自身的服務(wù)的信息發(fā)送到Eureka Server。然后進(jìn)行2調(diào)用當(dāng)前服務(wù)器節(jié)點(diǎn)中的其他服務(wù)信息,保存到Eureka Client中。當(dāng)服務(wù)間相互調(diào)用其它服務(wù)時(shí),在Eureka Client中獲取服務(wù)信息(如服務(wù)地址,端口等)后,進(jìn)行第3步,根據(jù)信息直接調(diào)用服務(wù)。(注:服務(wù)的調(diào)用通過(guò)http(s)調(diào)用)

→當(dāng)某個(gè)服務(wù)僅需要調(diào)用其他服務(wù),自身不提供服務(wù)調(diào)用時(shí)。在Eureka Client啟動(dòng)后會(huì)拉取Eureka Server的其他服務(wù)信息,需要調(diào)用時(shí),在Eureka Client的本地緩存中獲取信息,調(diào)用服務(wù)。

→Eureka Client通過(guò)向Eureka Serve發(fā)送心跳(默認(rèn)每30秒)來(lái)續(xù)約服務(wù)的。 如果客戶端持續(xù)不能續(xù)約,那么,它將在大約90秒內(nèi)從服務(wù)器注冊(cè)表中刪除。 注冊(cè)信息和續(xù)訂被復(fù)制到集群中的Eureka Serve所有節(jié)點(diǎn)。 以此來(lái)確保當(dāng)前服務(wù)還“活著”,可以被調(diào)用。

→來(lái)自任何區(qū)域的Eureka Client都可以查找注冊(cè)表信息(每30秒發(fā)生一次),以此來(lái)確保調(diào)用到的服務(wù)是“活的”。并且當(dāng)某個(gè)服務(wù)被更新或者新加進(jìn)來(lái),也可以調(diào)用到新的服務(wù)。

簡(jiǎn)單的了解了eureka如何管理服務(wù)調(diào)用的之后,我們看看官網(wǎng)提供的圖片,進(jìn)一步了解更多信息(官網(wǎng)地址:https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance):

這個(gè)圖從上而下,首先看到us-east-1c、us-east-1d、us-east-1e這些代表了一個(gè)可用區(qū)。簡(jiǎn)單舉個(gè)栗子,假設(shè)一個(gè)Eureka Server集群下面的分布情況是這樣的:

“北京集群中心”是一個(gè)區(qū)域,北京市內(nèi)的機(jī)房A和B為可用區(qū)(對(duì)應(yīng)官網(wǎng)圖片中的us-east-1c、us-east-1d、us-east-1e)。區(qū)域(Region)和可用區(qū)(Zone或者Availability Zone)均是AWS的概念。在非AWS環(huán)境下,我們可以簡(jiǎn)單地將region理解為Eureka某個(gè)地區(qū)的集群中心,zone理解成該區(qū)域的每個(gè)機(jī)房。每個(gè)區(qū)域是通過(guò)外網(wǎng)連接,所以速度、穩(wěn)定性上不能保證。而每個(gè)可用區(qū)之間一般是內(nèi)網(wǎng)直連,保證速度。想更多了解AWS概念的可用查看http://blog.csdn.net/awschina/article/details/17639191

回到官網(wǎng)的圖片可以看出在這個(gè)體系中,有2個(gè)主體:Eureka Server和Eureka Client。

Eureka Server:

提供服務(wù)注冊(cè):各個(gè)微服務(wù)啟動(dòng)時(shí),會(huì)通過(guò)Eureka Client向Eureka Server進(jìn)行注冊(cè)自己的信息(例如服務(wù)信息和網(wǎng)絡(luò)信息),Eureka Server會(huì)存儲(chǔ)該服務(wù)的信息。

提供服務(wù)信息提供:服務(wù)消費(fèi)者在調(diào)用服務(wù)時(shí),本地Eureka Client沒(méi)有的情況下,會(huì)到Eureka Server拉取信息。

提供服務(wù)管理:通過(guò)Eureka Client的Cancel、心跳監(jiān)控、renew等方式來(lái)維護(hù)該服務(wù)提供的信息以確保該服務(wù)可用以及服務(wù)的更新。

信息同步:每個(gè)Eureka Server同時(shí)也是Eureka Client,多個(gè)Eureka Server之間通過(guò)P2P復(fù)制的方式完成服務(wù)注冊(cè)表的同步。同步時(shí),被同步信息不會(huì)同步出去。也就是說(shuō)有3個(gè)Eureka Server,Server1有新的服務(wù)信息時(shí),同步到Server2后,Server2和Server3同步時(shí),Server2不會(huì)把從Server1那里同步到的信息同步給Server3,只能由Server1自己同步給Server3。

每個(gè)可用區(qū)有一個(gè)Eureka集群,并且每個(gè)可用區(qū)至少有一個(gè)eureka服務(wù)器來(lái)處理區(qū)內(nèi)故障。為了實(shí)現(xiàn)高可用,一般一個(gè)可用區(qū)中由三個(gè)Eureka Server組成。

Eureka Client

Eureka Client是一個(gè)Java客戶端,用于簡(jiǎn)化與Eureka Server的交互。并且管理當(dāng)前微服務(wù),同時(shí)為當(dāng)前的微服務(wù)提供服務(wù)提供者信息。

Eureka Client會(huì)拉取、更新和緩存Eureka Server中的信息。即使所有的Eureka Server節(jié)點(diǎn)都宕掉,服務(wù)消費(fèi)者依然可以使用緩存中的信息找到服務(wù)提供者。

Eureka Client在微服務(wù)啟動(dòng)后,會(huì)周期性地向Eureka Server發(fā)送心跳(默認(rèn)周期為30秒)以續(xù)約自己的信息。如果Eureka Server在一定時(shí)間內(nèi)沒(méi)有接收到某個(gè)微服務(wù)節(jié)點(diǎn)的心跳,Eureka Server將會(huì)注銷該微服務(wù)節(jié)點(diǎn)(默認(rèn)90秒)。

Eureka Client包含服務(wù)提供者Applicaton Service和服務(wù)消費(fèi)者Application Client

Applicaton Service:服務(wù)提供者,提供服務(wù)給別個(gè)調(diào)用。

Application Client:服務(wù)消費(fèi)者,調(diào)用別個(gè)提供的服務(wù)。

往往大多數(shù)服務(wù)本身既是服務(wù)提供者,也是服務(wù)消費(fèi)者。

其它動(dòng)作:

Register:服務(wù)注冊(cè)

當(dāng)Eureka客戶端向Eureka Server注冊(cè)時(shí),它提供自身的元數(shù)據(jù),比如IP地址、端口,運(yùn)行狀況指示符URL,主頁(yè)等。

Renew:服務(wù)續(xù)約

Eureka Client會(huì)每隔30秒發(fā)送一次心跳來(lái)續(xù)約。 通過(guò)續(xù)約來(lái)告知Eureka Server該Eureka客戶仍然存在,沒(méi)有出現(xiàn)問(wèn)題。 正常情況下,如果Eureka Server在90秒沒(méi)有收到Eureka客戶的續(xù)約,它會(huì)將實(shí)例從其注冊(cè)表中刪除。 建議不要更改續(xù)約間隔。

Fetch Registries:獲取注冊(cè)列表信息

Eureka客戶端從服務(wù)器獲取注冊(cè)表信息,并將其緩存在本地??蛻舳藭?huì)使用該信息查找其他服務(wù),從而進(jìn)行遠(yuǎn)程調(diào)用。該注冊(cè)列表信息定期(每30秒鐘)更新一次。每次返回注冊(cè)列表信息可能與Eureka客戶端的緩存信息不同, Eureka客戶端自動(dòng)處理。如果由于某種原因?qū)е伦?cè)列表信息不能及時(shí)匹配,Eureka客戶端則會(huì)重新獲取整個(gè)注冊(cè)表信息。 Eureka服務(wù)器緩存注冊(cè)列表信息,整個(gè)注冊(cè)表以及每個(gè)應(yīng)用程序的信息進(jìn)行了壓縮,壓縮內(nèi)容和沒(méi)有壓縮的內(nèi)容完全相同。Eureka客戶端和Eureka 服務(wù)器可以使用JSON / XML格式進(jìn)行通訊。在默認(rèn)的情況下Eureka客戶端使用壓縮JSON格式來(lái)獲取注冊(cè)列表的信息。

Cancel:服務(wù)下線

Eureka客戶端在程序關(guān)閉時(shí)向Eureka服務(wù)器發(fā)送取消請(qǐng)求。 發(fā)送請(qǐng)求后,該客戶端實(shí)例信息將從服務(wù)器的實(shí)例注冊(cè)表中刪除。該下線請(qǐng)求不會(huì)自動(dòng)完成,它需要調(diào)用以下內(nèi)容:

DiscoveryManager.getInstance().shutdownComponent();

Eviction 服務(wù)剔除

在默認(rèn)的情況下,當(dāng)Eureka客戶端連續(xù)90秒沒(méi)有向Eureka服務(wù)器發(fā)送服務(wù)續(xù)約,即心跳,Eureka服務(wù)器會(huì)將該服務(wù)實(shí)例從服務(wù)注冊(cè)列表刪除,即服務(wù)剔除。

結(jié)語(yǔ):了解了以上一些基礎(chǔ)的概念和原理,對(duì)于Eureka的運(yùn)行情況以及Eureka配置的理解就相對(duì)容易多了。最后附上一個(gè)轉(zhuǎn)載來(lái)的Eureka參數(shù)配置項(xiàng)詳解:http://www.itdecent.cn/p/98f4e5f6bca7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容