看了柳大神的《如可給老婆解釋什么是rpc》和《如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的RPC》之后漩氨,我按這個(gè)思路給我們的測(cè)試小姐姐解釋了什么是RPC,測(cè)試小姐姐畢竟是有功底的人窒所,一下子就明白了
測(cè)試:“哦!RPC就是讓服務(wù)的使用方像調(diào)用本地接口一樣調(diào)用遠(yuǎn)程服務(wù)是吧”
me:“完全正確”
測(cè)試:“明白了,那zk是干什么的寂祥,我們公司用RPC的時(shí)候老是提到ZK”
me:“ZK啊,ZK是個(gè)注冊(cè)中心”
測(cè)試:“哦七兜?注冊(cè)中心是什么吖丸凭?為什么要用注冊(cè)中心吖?怎么用注冊(cè)中心吖腕铸?”
me:“你這哲學(xué)三問打頭惜犀,我有點(diǎn)招架不住啊,我理一理思路”
測(cè)試:“你說”
me:“上一集講RPC的時(shí)候狠裹,我們是把被調(diào)用的服務(wù)的IP和端口寫死的虽界。但是這樣并不好,如果有一天我們需要加機(jī)器了涛菠,我們還要重新修改IP和端口莉御,然后重新發(fā)布”
測(cè)試:“你之前不是搞了個(gè)配置中心么,把ip和端口配到配置中心寫成個(gè)list碗暗,調(diào)用的時(shí)候從list里面隨便挑一個(gè)颈将,地址換了改一下配置中心就好了啊”
me:“真機(jī)智,其實(shí)我覺得這已經(jīng)算是一個(gè)不可靠的注冊(cè)中心的原型了言疗,能在服務(wù)啟動(dòng)的時(shí)候進(jìn)行注冊(cè)晴圾,服務(wù)停止的時(shí)候刪除,然后讓服務(wù)調(diào)用方可以查詢服務(wù)的注冊(cè)信息噪奄,也就是所謂【服務(wù)注冊(cè)與發(fā)現(xiàn)】”
測(cè)試:“不可靠死姚?”
me:“你想啊,要是我們有一臺(tái)提供服務(wù)的機(jī)器大半夜突然掛掉了勤篮。都毒。∨龅蓿”
測(cè)試:“是啊账劲,那該怎么辦呢,要是能知道哪臺(tái)機(jī)器能用哪臺(tái)機(jī)器不能用就好了金抡,我們只用那些可以用的機(jī)器”
me:“贊瀑焦!這就涉及到注冊(cè)中心的一個(gè)重要特點(diǎn)了,【錯(cuò)誤轉(zhuǎn)移】當(dāng)某個(gè)服務(wù)提供者異常時(shí)梗肝,能及時(shí)刪除注冊(cè)信息榛瓮。一般注冊(cè)中心會(huì)定時(shí)發(fā)送心跳包,來檢測(cè)服務(wù)提供方是否在線巫击,并及時(shí)刪除下線節(jié)點(diǎn)”
測(cè)試:“這樣啊禀晓,那我們直接在調(diào)用方這么做不就好了精续,調(diào)用一臺(tái)機(jī)器失敗了,就訪問下一臺(tái)粹懒,一直到成功為止”
me:“好辦法重付,那如果某一臺(tái)機(jī)器死掉了,那我們每次調(diào)用的時(shí)候都有幾率會(huì)失敗凫乖,這很浪費(fèi)時(shí)間啊堪夭。要是我們把死掉機(jī)器記錄下來不再調(diào)用,那如果這臺(tái)機(jī)器過一會(huì)重啟了拣凹,我們也還是不會(huì)去請(qǐng)求他,這樣會(huì)很浪費(fèi)資源的”
測(cè)試:“是哦恨豁,可是你的服務(wù)重啟了嚣镜,注冊(cè)中心也不知道啊”
me:“好問題,這又涉及到注冊(cè)中心的另一個(gè)特點(diǎn)橘蜜,當(dāng)某個(gè)服務(wù)啟動(dòng)時(shí)菊匿,可以重新注冊(cè)到注冊(cè)中心上”
測(cè)試:“明白了,所以注冊(cè)中心的作用就是计福,當(dāng)服務(wù)啟動(dòng)的時(shí)候把服務(wù)的ip和端口注冊(cè)上去跌捆,服務(wù)異常的時(shí)候注冊(cè)中心就把這臺(tái)機(jī)器的注冊(cè)信息刪除掉,然后請(qǐng)求方只需要每次調(diào)用的時(shí)候去注冊(cè)中心拿服務(wù)的注冊(cè)信息再調(diào)用就可以了象颖,對(duì)吧”
me:“差不多是這樣了佩厚,但是還有個(gè)問題,你想想说订,要是你的服務(wù)提供者都是正常的抄瓦,但是注冊(cè)中心突然掛了,那怎么辦陶冷,全公司的服務(wù)都沒法請(qǐng)求了”
測(cè)試:“這個(gè)好說钙姊,本地緩存一份注冊(cè)信息,每次從本地緩存來取埂伦,然后定時(shí)更新緩存”
me:“這也是個(gè)辦法煞额,不過一般的緩存更新不會(huì)采用輪詢的方式,而是通過通知的方式沾谜,客戶端與注冊(cè)中心建立一個(gè)長連接膊毁,并注冊(cè)一個(gè)監(jiān)聽器,服務(wù)注冊(cè)信息發(fā)生變化的時(shí)候通知服務(wù)調(diào)用方更新注冊(cè)信息类早,這樣做既能及時(shí)更新信息媚媒,又能減少頻繁訪問帶來的網(wǎng)絡(luò)開銷”
Tips(注冊(cè)中心講解過程中的一些支線交流)
負(fù)載均衡
有多臺(tái)機(jī)器提供服務(wù)的時(shí)候注冊(cè)中心怎么做LB呢(這是個(gè)優(yōu)秀的測(cè)試小姐姐,她自己在公司分享過Nginx)
- 其實(shí)負(fù)載均衡不是注冊(cè)中心的事情涩僻,這個(gè)事情應(yīng)該交給RPC框架缭召,或者說是RPC的調(diào)用方去完成
輪詢和心跳
輪詢和心跳的區(qū)別栈顷,簡(jiǎn)單列一下
- 輪詢往往由客戶端發(fā)起,向服務(wù)端請(qǐng)求數(shù)據(jù)嵌巷,而心跳則可以由客戶端發(fā)起萄凤,也可由服務(wù)端發(fā)起
- 輪詢每次請(qǐng)求需要重新建立連接,而心跳通常會(huì)保持一個(gè)TCP連接來完成搪哪,所以輪詢的開銷更大
- 輪詢往往希望請(qǐng)求數(shù)據(jù)靡努,而心跳則僅僅為了保持連接
輪詢和監(jiān)聽
為什么使用長連接監(jiān)聽而不是輪詢的方式來進(jìn)行服務(wù)注冊(cè)信息的更新呢
- 數(shù)據(jù)更新的及時(shí)性:及時(shí)性取決于輪詢的頻率,設(shè)定多高的頻率能保證及時(shí)更新呢
- 資源開銷:每一次輪詢都要新建連接晓折,這回造成很大的開銷惑朦,特別是為了及時(shí)性而提高輪詢頻率之后