總結(jié)下eureka系統(tǒng)架構(gòu)和相關(guān)面試題成洗。
〓一锨推、Eureka系統(tǒng)架構(gòu)交互圖
來(lái)自網(wǎng)上更詳細(xì)的圖:
〓二大年、定時(shí)任務(wù)匯總
客戶端定時(shí)任務(wù)
1)每30秒刷新緩存(服務(wù)拉取)
2)每30秒發(fā)送心跳(服務(wù)續(xù)約)
服務(wù)端定時(shí)任務(wù)
1)每10分鐘更新集群節(jié)點(diǎn)數(shù)據(jù)
2)每15分鐘更新續(xù)約數(shù)及閾值
3)每1分鐘剔除過(guò)期注冊(cè)信息
〓三暮刃、常見(jiàn)(面試)問(wèn)題匯總
1、Server節(jié)點(diǎn)能否在配置文件里配置自身的Server地址爆土?
可以的椭懊!當(dāng)一個(gè)Server解析配置的集群地址時(shí),會(huì)過(guò)濾掉自身的地址雾消,這樣服務(wù)同步時(shí)就不需要同步自身了灾搏。我們配置多個(gè)Server時(shí)挫望,不需要手動(dòng)的排除Server自身的發(fā)現(xiàn)地址。
2狂窑、Server是否配置registerWithEureka和fetchRegistry有什么區(qū)別媳板?
其實(shí)每一個(gè)Eureka Server Node都內(nèi)置了一個(gè)Eureka Client,也就是說(shuō)一個(gè)Server Node節(jié)點(diǎn)可以接受其他Client的注冊(cè)泉哈,也可以作為一個(gè)Client注冊(cè)到其他Server上蛉幸,被其他Client發(fā)現(xiàn)和調(diào)用。Server Node上的Server和Client可以理解為兩個(gè)容器丛晦,他們僅僅在初始化時(shí)打交道奕纫,之后就沒(méi)有什么關(guān)聯(lián)了。
registerWithEureka和fetchRegistry的默認(rèn)值都是true烫沙,他們都是客戶端配置匹层,也就是eureka.client開(kāi)頭的配置信息。
通過(guò)上述說(shuō)明就很好理解這兩個(gè)參數(shù)設(shè)置與否的區(qū)別了:
registerWithEureka:是否要注冊(cè)到其他Server上锌蓄。如果我的Server上其實(shí)開(kāi)放了一些Http接口供調(diào)用升筏,那么就需要注冊(cè),這樣其他的Client才能發(fā)現(xiàn)我的服務(wù)瘸爽,才能通過(guò)RPC調(diào)用我提供的Http接口您访。如果我的Server沒(méi)有提供對(duì)外Http接口,那么這個(gè)參數(shù)可以設(shè)置為false剪决。
fetchRegistry:是否需要拉取服務(wù)信息灵汪。和是否注冊(cè)一樣,如果我的Server需要調(diào)用其他的Client的Http接口柑潦,那么就需要獲取相應(yīng)的服務(wù)發(fā)現(xiàn)信息享言,這樣才能正常的調(diào)用。同時(shí)這個(gè)參數(shù)還有一個(gè)重要的作用妒茬,就是決定Server在初始化時(shí)是否立即全量同步其他節(jié)點(diǎn)的服務(wù)信息54浮!乍钻!Server初始化時(shí)會(huì)先初始化其內(nèi)置的Client肛循。若配置了fetchRegistry=true,那么Client在初始化時(shí)會(huì)從其他Server全量拉取服務(wù)信息银择,放進(jìn)Client容器中多糠。Server在初始化時(shí)會(huì)嘗試同步Client容器里的服務(wù)信息,如果fetchRegistry=false浩考,服務(wù)信息不存在夹孔,只能被動(dòng)的等其他Server節(jié)點(diǎn)以增量的形式同步過(guò)來(lái)(Client在執(zhí)行注冊(cè)和心跳時(shí)對(duì)應(yīng)的注冊(cè)Server節(jié)點(diǎn)會(huì)廣播此事件,同步給其他的Server節(jié)點(diǎn)。當(dāng)其他Server節(jié)點(diǎn)還沒(méi)有此服務(wù)信息時(shí)搭伤,改為注冊(cè)此服務(wù)信息)只怎。當(dāng)然正常的通過(guò)心跳來(lái)同步,最多也僅需要30S而已怜俐,是否需要設(shè)置此參數(shù)就看各自的需求了身堡。
3、Server和Client節(jié)點(diǎn)配置全部的Server地址和部分Server地址有什么區(qū)別拍鲤?
Client在與Server交互時(shí)贴谎,只會(huì)與其中的一個(gè)Server進(jìn)行交互。
Server之間的數(shù)據(jù)同步和Server與Client間的數(shù)據(jù)交互使用的是同一個(gè)Http接口季稳,比如注冊(cè)擅这,心跳,狀態(tài)更新景鼠,關(guān)閉服務(wù)等等猪狈。只是Server與Server之間同步時(shí)芋簿,會(huì)有一個(gè)Header參數(shù)刹缝,x-netflix-discovery-replication = true ,Server通過(guò)這個(gè)標(biāo)識(shí)來(lái)判斷當(dāng)前請(qǐng)求是來(lái)自Server還是來(lái)自Client燥筷。如果 x-netflix-discovery-replication不存在舵盈,則指明請(qǐng)求來(lái)自Client鄙才,Server在處理此請(qǐng)求時(shí)還會(huì)將請(qǐng)求廣播給配置上的其他Server節(jié)點(diǎn)庵朝,在廣播請(qǐng)求時(shí)阱洪,Header帶上x(chóng)-netflix-discovery-replication=true芬迄。當(dāng)其他Server節(jié)點(diǎn)接受到此請(qǐng)求時(shí)问顷,通過(guò)此Header參數(shù)判斷是一個(gè)Server同步請(qǐng)求,因此只處理此請(qǐng)求禀梳,而不再?gòu)V播杜窄。Server之間的數(shù)據(jù)同步只傳播一次!
4算途、Server回收服務(wù)信息的自我保護(hù)機(jī)制是什么塞耕?需要注意什么?
Server每隔60S執(zhí)行一次服務(wù)信息回收嘴瓤,移除那些心跳時(shí)間超時(shí)的扫外。能夠回收有3個(gè)前提:
1)心跳信息超時(shí),也就是回收時(shí)間距離上次心跳時(shí)間超過(guò)90S廓脆。
2)開(kāi)啟了租約過(guò)期功能筛谚,默認(rèn)是開(kāi)啟的。
3)未觸發(fā)自我保護(hù)機(jī)制停忿。所謂的自我保護(hù)機(jī)制驾讲,指的是上一分鐘內(nèi),服務(wù)實(shí)際發(fā)送心跳的總數(shù)超過(guò)預(yù)計(jì)總數(shù)的85%,可能近似理解為正常存活的Client超過(guò)85%吮铭。
需要注意些什么时迫?如果你的Client個(gè)數(shù)較少,比如就5個(gè)谓晌,或者說(shuō)同一個(gè)Server對(duì)應(yīng)的Client就5個(gè)掠拳,那么當(dāng)其中的一個(gè)宕機(jī)了,1/5=20%扎谎,直接就觸發(fā)了自我保護(hù)機(jī)制碳想,宕機(jī)的服務(wù)信息會(huì)一直存在,不會(huì)被回收毁靶。對(duì)于這種情況胧奔,可以設(shè)置Server觸發(fā)自我保護(hù)機(jī)制的臨界值,renewalPercentThreshold = 0.85预吆,默認(rèn)是85%龙填,可以修改成適當(dāng)?shù)闹担热?.5拐叉。
5岩遗、Server節(jié)點(diǎn)間的服務(wù)信息同步的流程是怎么樣的?
Server在初始化時(shí)凤瘦,會(huì)根據(jù)配置信息生成與其他的Server同步的客戶端宿礁。每當(dāng)Server接收到Client的服務(wù)請(qǐng)求時(shí),會(huì)先處理請(qǐng)求蔬芥,然后將自身作為一個(gè)Client的角色梆靖,用相同的請(qǐng)求信息去請(qǐng)求配置里的那些Server節(jié)點(diǎn)。會(huì)將同步請(qǐng)求封裝成一個(gè)Task笔诵,然后存入一個(gè)Queue中返吻,Server定時(shí)的提取Queue里的任務(wù),批量的處理它們乎婿。
也就是說(shuō)Server之間的服務(wù)同步是異步執(zhí)行的测僵,而不像Zookeeper一樣,每個(gè)操作都需要過(guò)半數(shù)的節(jié)點(diǎn)執(zhí)行成功后才返回給Client谢翎。同時(shí)Server之間的同步只會(huì)傳播一次捍靠,它們通過(guò)Header里的一個(gè)參數(shù)來(lái)表明是來(lái)自Client的請(qǐng)求還是Server的請(qǐng)求。如果是Server的請(qǐng)求岳服,那么接收到此請(qǐng)求后不會(huì)再進(jìn)行傳播剂公。
6、Eureka服務(wù)注冊(cè)到發(fā)現(xiàn)最長(zhǎng)需要多長(zhǎng)時(shí)間吊宋?
最長(zhǎng)需要2分鐘纲辽。30秒:服務(wù)端響應(yīng)緩存ResponseCache颜武;30秒:Client緩存;30秒:Ribbon緩存拖吼,30秒:客戶端啟動(dòng)心跳請(qǐng)求時(shí)注冊(cè)(新版已優(yōu)化可以啟動(dòng)馬上注冊(cè))鳞上。
7、Eureka Server如何應(yīng)對(duì)并發(fā)請(qǐng)求吊档?
每分鐘拉取服務(wù)2次篙议,每分鐘心跳請(qǐng)求2次,即每分鐘會(huì)有4次請(qǐng)求怠硼。如果有2000個(gè)服務(wù)鬼贱,那么每分鐘就有8000次請(qǐng)求,即每秒有133次請(qǐng)求香璃,約每分鐘有150次这难。Eureka Server的應(yīng)對(duì)方式是:①對(duì)注冊(cè)表操作使用讀寫(xiě)鎖優(yōu)化;②注冊(cè)表的多級(jí)緩存機(jī)制葡秒。
參考資料
https://blog.csdn.net/qq_17164811/article/details/94773607
http://www.majunwei.com/view/201808131015366640.html
https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html
https://blog.csdn.net/qq_38289534/article/details/82146939