一、Eureka
?????????Eureka是Netflix的一個(gè)子模塊疲憋,也是核心模塊之一凿渊。Eureka是一個(gè)基于REST的服務(wù),用于定位服務(wù)缚柳,以實(shí)現(xiàn)云端中間層服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移埃脏。服務(wù)注冊(cè)與發(fā)現(xiàn)對(duì)于微服務(wù)架構(gòu)來(lái)說(shuō)是非常重要的,有了服務(wù)發(fā)現(xiàn)與注冊(cè)秋忙,只需要使用服務(wù)的標(biāo)識(shí)符彩掐,就可以訪(fǎng)問(wèn)到服務(wù),而不需要修改服務(wù)調(diào)用的配置文件了灰追。功能類(lèi)似于dubbo的注冊(cè)中心堵幽,比如Zookeeper。
二弹澎、在設(shè)計(jì)Eureka的時(shí)候遵守的是AP原則
? ??????CAP原則又稱(chēng)CAP定理朴下,指的是在一個(gè)分布式系統(tǒng)中,Consistency(一致性)苦蒿、 Availability(可用性)殴胧、Partition tolerance(分區(qū)容錯(cuò)性),三者不可兼得佩迟,P必須有团滥,在A和C之間選擇一個(gè)。
三报强、Eureka的基本架構(gòu)
Spring Cloud 封裝了 Netflix 公司開(kāi)發(fā)的 Eureka 模塊來(lái)實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)(請(qǐng)對(duì)比Zookeeper)灸姊。
Eureka 采用了 C-S 的設(shè)計(jì)架構(gòu)。Eureka Server 作為服務(wù)注冊(cè)功能的服務(wù)器秉溉,它是服務(wù)注冊(cè)中心力惯。
而系統(tǒng)中的其他微服務(wù)碗誉,使用 Eureka 的客戶(hù)端連接到 Eureka Server并維持心跳連接。這樣系統(tǒng)的維護(hù)人員就可以通過(guò) Eureka Server 來(lái)監(jiān)控系統(tǒng)中各個(gè)微服務(wù)是否正常運(yùn)行夯膀。SpringCloud 的一些其他模塊(比如Zuul)就可以通過(guò) Eureka Server 來(lái)發(fā)現(xiàn)系統(tǒng)中的其他微服務(wù)诗充,并執(zhí)行相關(guān)的邏輯。
????????????????????????????????????????????????????請(qǐng)注意和Dubbo的架構(gòu)對(duì)比
? ??????????????
Eureka包含兩個(gè)組件:Eureka Server和Eureka Client
Eureka Server提供服務(wù)注冊(cè)服務(wù)
各個(gè)節(jié)點(diǎn)啟動(dòng)后诱建,會(huì)在EurekaServer中進(jìn)行注冊(cè),這樣EurekaServer中的服務(wù)注冊(cè)表中將會(huì)存儲(chǔ)所有可用服務(wù)節(jié)點(diǎn)的信息碟绑,服務(wù)節(jié)點(diǎn)的信息可以在界面中直觀的看到
EurekaClient是一個(gè)Java客戶(hù)端俺猿,用于簡(jiǎn)化Eureka Server的交互,客戶(hù)端同時(shí)也具備一個(gè)內(nèi)置的格仲、使用輪詢(xún)(round-robin)負(fù)載算法的負(fù)載均衡器押袍。在應(yīng)用啟動(dòng)后,將會(huì)向Eureka Server發(fā)送心跳(默認(rèn)周期為30秒)凯肋。如果Eureka Server在多個(gè)心跳周期內(nèi)沒(méi)有接收到某個(gè)節(jié)點(diǎn)的心跳谊惭,EurekaServer將會(huì)從服務(wù)注冊(cè)表中把這個(gè)服務(wù)節(jié)點(diǎn)移除(默認(rèn)90秒)
Eureka三大角色
(1)、Eureka server? 提供服務(wù)與發(fā)現(xiàn)
(2)侮东、Service Prodiver? 服務(wù)提供方圈盔,將自身服務(wù)注冊(cè)到Eureka,從而使消費(fèi)方能夠找到
(3)悄雅、Service Consumer? 服務(wù)消費(fèi)方從Eureka獲取服務(wù)注冊(cè)列表驱敲,從而能夠消費(fèi)服務(wù)
四、作為服務(wù)注冊(cè)中心宽闲,Eureka比Zookeeper好在哪里众眨?
? ? ? 著名的CAP理論指出,一個(gè)分布式系統(tǒng)不可能同時(shí)滿(mǎn)足C(一致性)容诬、A(可用性)和P(分區(qū)容錯(cuò)性)娩梨。由于分區(qū)容錯(cuò)性P在是分布式系統(tǒng)中必須要保證的,因此我們只能在A和C之間進(jìn)行權(quán)衡览徒。
? ? ? 因此
? ? ? Zookeeper保證的是CP,
? ? ? Eureka則是AP狈定。
4.1 Zookeeper保證CP
? ? ? ?當(dāng)向注冊(cè)中心查詢(xún)服務(wù)列表時(shí),我們可以容忍注冊(cè)中心返回的是幾分鐘以前的注冊(cè)信息吱殉,但不能接受服務(wù)直接down掉不可用掸冤。也就是說(shuō),服務(wù)注冊(cè)功能對(duì)可用性的要求要高于一致性友雳。但是zk會(huì)出現(xiàn)這樣一種情況稿湿,當(dāng)master節(jié)點(diǎn)因?yàn)榫W(wǎng)絡(luò)故障與其他節(jié)點(diǎn)失去聯(lián)系時(shí),剩余節(jié)點(diǎn)會(huì)重新進(jìn)行l(wèi)eader選舉押赊。問(wèn)題在于饺藤,選舉leader的時(shí)間太長(zhǎng)包斑,30 ~ 120s, 且選舉期間整個(gè)zk集群都是不可用的,這就導(dǎo)致在選舉期間注冊(cè)服務(wù)癱瘓涕俗。在云部署的環(huán)境下罗丰,因網(wǎng)絡(luò)問(wèn)題使得zk集群失去master節(jié)點(diǎn)是較大概率會(huì)發(fā)生的事,雖然服務(wù)能夠最終恢復(fù)再姑,但是漫長(zhǎng)的選舉時(shí)間導(dǎo)致的注冊(cè)長(zhǎng)期不可用是不能容忍的萌抵。
4.2 Eureka保證AP
? ? ? ?Eureka看明白了這一點(diǎn),因此在設(shè)計(jì)時(shí)就優(yōu)先保證可用性元镀。Eureka各個(gè)節(jié)點(diǎn)都是平等的绍填,幾個(gè)節(jié)點(diǎn)掛掉不會(huì)影響正常節(jié)點(diǎn)的工作,剩余的節(jié)點(diǎn)依然可以提供注冊(cè)和查詢(xún)服務(wù)栖疑。而Eureka的客戶(hù)端在向某個(gè)Eureka注冊(cè)或時(shí)如果發(fā)現(xiàn)連接失敗讨永,則會(huì)自動(dòng)切換至其它節(jié)點(diǎn),只要有一臺(tái)Eureka還在遇革,就能保證注冊(cè)服務(wù)可用(保證可用性)卿闹,只不過(guò)查到的信息可能不是最新的(不保證強(qiáng)一致性)。除此之外萝快,Eureka還有一種自我保護(hù)機(jī)制锻霎,如果在15分鐘內(nèi)超過(guò)85%的節(jié)點(diǎn)都沒(méi)有正常的心跳,那么Eureka就認(rèn)為客戶(hù)端與注冊(cè)中心出現(xiàn)了網(wǎng)絡(luò)故障杠巡,此時(shí)會(huì)出現(xiàn)以下幾種情況:
? ? ?1. Eureka不再?gòu)淖?cè)列表中移除因?yàn)殚L(zhǎng)時(shí)間沒(méi)收到心跳而應(yīng)該過(guò)期的服務(wù)
? ? ?2. Eureka仍然能夠接受新服務(wù)的注冊(cè)和查詢(xún)請(qǐng)求量窘,但是不會(huì)被同步到其它節(jié)點(diǎn)上(即保證當(dāng)前節(jié)點(diǎn)依然可用)
? ? ? 3. 當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí),當(dāng)前實(shí)例新的注冊(cè)信息會(huì)被同步到其它節(jié)點(diǎn)中
? ? ? 因此氢拥, Eureka可以很好的應(yīng)對(duì)因網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點(diǎn)失去聯(lián)系的情況蚌铜,而不會(huì)像zookeeper那樣使整個(gè)注冊(cè)服務(wù)癱瘓。
五嫩海、Eureka自我保護(hù)
? ? ?一句話(huà)冬殃,某時(shí)刻某一個(gè)服務(wù)不可用了,eureka不會(huì)立刻清理叁怪,依舊會(huì)對(duì)該微服務(wù)的信息進(jìn)行保存