1. Eureka是什么
Eureka是一個(gè)基于REST的服務(wù),主要用于AWS云中的定位服務(wù)瑰枫,以實(shí)現(xiàn)中間層服務(wù)器的負(fù)載平衡和故障轉(zhuǎn)移
在 Spring Cloud 微服務(wù)架構(gòu)中通常用作注冊(cè)中心
我們稱這個(gè)服務(wù)為 Eureka Server壹罚,還有一個(gè)與之交互的客戶端稱之為 Eureka Client
2. Eureka高級(jí)架構(gòu)
如上圖所示预柒,其中
Application Server 表示服務(wù)提供方
Application Client 表示服務(wù)消費(fèi)方
Make Remote Call 表示遠(yuǎn)程調(diào)用
服務(wù)在Eureka上注冊(cè)葱蝗,然后每隔30秒發(fā)送心跳來更新它們的租約拟逮。如果客戶端不能多次續(xù)訂租約,那么它將在大約90秒內(nèi)從服務(wù)器注冊(cè)表中剔除巩剖。注冊(cè)信息和更新被復(fù)制到集群中的所有eureka節(jié)點(diǎn)铝穷。來自任何區(qū)域的客戶端都可以查找注冊(cè)表信息(每30秒發(fā)生一次)來定位它們的服務(wù)(可能在任何區(qū)域)并進(jìn)行遠(yuǎn)程調(diào)用。
(PS:Eureka Client需要每30秒給Eureka Server發(fā)一次心跳佳魔,同時(shí)更新Server上最新的注冊(cè)信息到本地曙聂,如果Server多次沒有收到來自客戶端的心跳,那么在90秒內(nèi)會(huì)被Server上剔除)
3. Eureka 客戶端與服務(wù)器之間的通信
服務(wù)發(fā)現(xiàn)有兩種模式:一種是客戶端發(fā)現(xiàn)模式鞠鲜,一種是服務(wù)端發(fā)現(xiàn)模式宁脊。Eureka采用的是客戶端發(fā)現(xiàn)模式。
3.1. Register(注冊(cè))
Eureka客戶端將關(guān)于運(yùn)行實(shí)例的信息注冊(cè)到Eureka服務(wù)器贤姆。注冊(cè)發(fā)生在第一次心跳榆苞。
3.2. Renew(更新 / 續(xù)借)
Eureka客戶端需要更新最新注冊(cè)信息(續(xù)借),通過每30秒發(fā)送一次心跳庐氮。更新通知是為了告訴Eureka服務(wù)器實(shí)例仍然存活语稠。如果服務(wù)器在90秒內(nèi)沒有看到更新,它會(huì)將實(shí)例從注冊(cè)表中刪除弄砍。建議不要更改更新間隔仙畦,因?yàn)榉?wù)器使用該信息來確定客戶機(jī)與服務(wù)器之間的通信是否存在廣泛傳播的問題。
3.3. Fetch Registry(抓取注冊(cè)信息)
Eureka客戶端從服務(wù)器獲取注冊(cè)表信息并在本地緩存音婶。之后慨畸,客戶端使用這些信息來查找其他服務(wù)。通過在上一個(gè)獲取周期和當(dāng)前獲取周期之間獲取增量更新衣式,這些信息會(huì)定期更新(每30秒更新一次)寸士。獲取的時(shí)候可能返回相同的實(shí)例。Eureka客戶端自動(dòng)處理重復(fù)信息碴卧。
3.4. Cancel(取消)
Eureka客戶端在關(guān)機(jī)時(shí)向Eureka服務(wù)器發(fā)送一個(gè)取消請(qǐng)求弱卡。這將從服務(wù)器的實(shí)例注冊(cè)表中刪除實(shí)例,從而有效地將實(shí)例從流量中取出住册。
4. Eureka自我保護(hù)模式
如果 Eureka 服務(wù)器檢測(cè)到超過預(yù)期數(shù)量的注冊(cè)客戶端以一種不優(yōu)雅的方式終止了連接婶博,并且同時(shí)正在等待被驅(qū)逐,那么它們將進(jìn)入自我保護(hù)模式荧飞。這樣做是為了確保災(zāi)難性網(wǎng)絡(luò)事件不會(huì)擦除eureka注冊(cè)表數(shù)據(jù)凡人,并將其向下傳播到所有客戶端。
任何客戶端叹阔,如果連續(xù)3次心跳更新失敗挠轴,那么它將被視為非正常終止,病句將被剔除耳幢。當(dāng)超過當(dāng)前注冊(cè)實(shí)例15%的客戶端都處于這種狀態(tài)岸晦,那么自我保護(hù)將被開啟。
當(dāng)自我保護(hù)開啟以后,eureka服務(wù)器將停止剔除所有實(shí)例委煤,直到:
1. 它看到的心跳續(xù)借的數(shù)量回到了預(yù)期的閾值之上堂油,或者
2. 自我保護(hù)被禁用
默認(rèn)情況下,自我保護(hù)是啟用的碧绞,并且府框,默認(rèn)的閾值是要大于當(dāng)前注冊(cè)數(shù)量的15%
5. Eureka VS Zookeeper
5.1. Eureka保證AP
Eureka服務(wù)器節(jié)點(diǎn)之間是對(duì)等的,只要有一個(gè)節(jié)點(diǎn)在讥邻,就可以正常提供服務(wù)迫靖。
Eureka客戶端的所有操作可能需要一段時(shí)間才能在Eureka服務(wù)器中反映出來,隨后在其他Eureka客戶端中反映出來兴使。也就是說系宜,客戶端獲取到的注冊(cè)信息可能不是最新的,它并不保證強(qiáng)一致性
5.2. Zookeeper保證CP
Zookeeper集群中有一個(gè)Leader发魄,多個(gè)Follower盹牧。Leader負(fù)責(zé)寫,F(xiàn)ollower負(fù)責(zé)讀励幼,ZK客戶端連接到任何一個(gè)節(jié)點(diǎn)都是一樣的汰寓,寫操作完成以后要同步給所有Follower以后才會(huì)返回。如果Leader掛了苹粟,那么重新選出新的Leader有滑,在此期間服務(wù)不可用。
5.3. 為什么用Eureka
分布式系統(tǒng)大都可以歸結(jié)為兩個(gè)問題:數(shù)據(jù)一致性和防止單點(diǎn)故障嵌削。而作為注冊(cè)中心的話毛好,即使在一段時(shí)間內(nèi)不一致,也不會(huì)有太大影響苛秕,所以在A和C之間選擇A是比較適合該場(chǎng)景的肌访。