在過(guò)去持續(xù)分享的幾十期阿里Java面試題中,幾乎每次都會(huì)問(wèn)到Dubbo相關(guān)問(wèn)題,比如:“如何從0到1設(shè)計(jì)一個(gè)Dubbo的RPC框架”,這個(gè)問(wèn)題主要考察以下幾個(gè)方面:
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了鄒平免費(fèi)建站歡迎大家使用!你對(duì)RPC框架的底層原理掌握程度。
以及考驗(yàn)?zāi)愕恼wRPC框架系統(tǒng)設(shè)計(jì)能力。
具體,我來(lái)為大家詳解。
即遠(yuǎn)程過(guò)程調(diào)用, 主要解決遠(yuǎn)程通信間的問(wèn)題,不需要了解底層網(wǎng)絡(luò)的通信機(jī)制。
RPC框架負(fù)責(zé)屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式、以及通信細(xì)節(jié)。
實(shí)際使用中,并不需要關(guān)心底層通信細(xì)節(jié)和調(diào)用過(guò)程,讓業(yè)務(wù)端專(zhuān)注于業(yè)務(wù)代碼的實(shí)現(xiàn)。
國(guó)內(nèi)大家熟知的PRC框架,阿里的HSF和Dubbo(開(kāi)源)。
比如早期一個(gè)應(yīng)用Java War包,將所有功能都打包,部署在一個(gè)單機(jī)服務(wù)器,調(diào)用接口也比較方便,不涉及到任何分布式場(chǎng)景。
隨著業(yè)務(wù)的快速發(fā)展,業(yè)務(wù)越來(lái)越多、子系統(tǒng)也越來(lái)越多時(shí)。比如:淘寶的交易系統(tǒng)、商品系統(tǒng)、用戶(hù)系統(tǒng)、評(píng)價(jià)系統(tǒng)...上百個(gè)系統(tǒng)的出現(xiàn)。
系統(tǒng)變得越來(lái)越復(fù)雜,業(yè)務(wù)代碼依然耦合在一起。比如最早期的淘寶denali工程,包含所有業(yè)務(wù)系統(tǒng)的代碼,就僅打包部署都需要很長(zhǎng)的時(shí)間。
并且,隨著每個(gè)業(yè)務(wù)線的快速發(fā)展,業(yè)務(wù)代碼耦合在一起,上線后出現(xiàn)問(wèn)題急需要回滾代碼,拉分支、大量的代碼merge工作,這個(gè)過(guò)程極其痛苦。
這個(gè)時(shí)候,你會(huì)發(fā)現(xiàn)技術(shù)已經(jīng)成了業(yè)務(wù)的瓶頸,急需把業(yè)務(wù)單獨(dú)抽離出來(lái),各自單獨(dú)部署。
應(yīng)用系統(tǒng)一旦涉及到拆分部署,問(wèn)題就來(lái)了,急需一種高效的應(yīng)用程序間的通訊手段來(lái)完成這種需求,這就會(huì)涉及到分布式遠(yuǎn)程調(diào)用。
于是,淘寶就把denali按照業(yè)務(wù)為單位拆分成了類(lèi)似這樣的系統(tǒng):UM(UserManger)、SM(ShopManager)..等等幾十個(gè)工程代碼。
再按照業(yè)務(wù)為單位,把所有調(diào)用相關(guān)的接口以業(yè)務(wù)為單元進(jìn)行拆分:UIC(用戶(hù)中心服務(wù))、SIC(店鋪中心服務(wù))...等等以業(yè)務(wù)為單位集群部署,按照業(yè)務(wù)提供服務(wù)。
所以,RPC的框架來(lái)了,阿里內(nèi)部使用HSF,以及開(kāi)源的RPC 框架:Dubbo。
RPC框架的核心設(shè)計(jì)
前面提到了RPC的核心目標(biāo):主要是解決分布式系統(tǒng)中服務(wù)之間的調(diào)用問(wèn)題。
其實(shí),走到這一步涉及的知識(shí)體系非常的多:要求對(duì)通信、遠(yuǎn)程調(diào)用、消息機(jī)制等有深入的理解和掌握,要求的都是從理論、硬件級(jí)、操作系統(tǒng)級(jí)以及所采用的語(yǔ)言的實(shí)現(xiàn)都有清楚的理解。
1)服務(wù)提供者(Server)
對(duì)外提供后臺(tái)服務(wù),將自己的服務(wù)信息,注冊(cè)到注冊(cè)中心。
2)注冊(cè)中心(Registry)
用于服務(wù)端注冊(cè)遠(yuǎn)程服務(wù)以及客戶(hù)端發(fā)現(xiàn)服務(wù)。
目前主要的注冊(cè)中心可以借由 zookeeper,eureka,consul,etcd 等開(kāi)源框架實(shí)現(xiàn)。
比如:阿里的Dubbo就是采用zookeeper實(shí)現(xiàn)注冊(cè)中心。
3)服務(wù)消費(fèi)者(Client)
從注冊(cè)中心獲取遠(yuǎn)程服務(wù)的注冊(cè)信息,然后進(jìn)行遠(yuǎn)程過(guò)程調(diào)用。
1)服務(wù)調(diào)用方(client)調(diào)用以本地調(diào)用方式調(diào)用服務(wù);
2)client stub接收到調(diào)用后負(fù)責(zé)將方法、參數(shù)等組裝成能夠進(jìn)行網(wǎng)絡(luò)傳輸?shù)南Ⅲw;在Java里就是序列化的過(guò)程
3)client stub找到服務(wù)地址,并將消息通過(guò)網(wǎng)絡(luò)發(fā)送到服務(wù)端;
4)server stub收到消息后進(jìn)行解碼,在Java里就是反序列化的過(guò)程;
5)server stub根據(jù)解碼結(jié)果調(diào)用本地的服務(wù);
6)本地服務(wù)執(zhí)行處理邏輯;
7)本地服務(wù)將結(jié)果返回給server stub;
8)server stub將返回結(jié)果打包成消息,Java里的序列化;
9)server stub將打包后的消息通過(guò)網(wǎng)絡(luò)并發(fā)送至消費(fèi)方
10)client stub接收到消息,并進(jìn)行解碼, Java里的反序列化;
11)服務(wù)調(diào)用方(client)得到最終結(jié)果。
RPC框架的目標(biāo)就是要2~10這些步驟都封裝起來(lái)。
首先,要解決通訊的問(wèn)題,主要是通過(guò)在客戶(hù)端和服務(wù)器之間建立TCP連接,遠(yuǎn)程過(guò)程調(diào)用的所有交換的數(shù)據(jù)都在這個(gè)連接里傳輸。
1)服務(wù)注冊(cè)
首先需要把服務(wù)注冊(cè)到服務(wù)中心。其實(shí)就是在注冊(cè)中心進(jìn)行一個(gè)登記,注冊(cè)中心存儲(chǔ)了該服務(wù)的IP、端口、調(diào)用方式(協(xié)議、序列化方式)等。在zookeeper中,進(jìn)行服務(wù)注冊(cè),實(shí)際上就是在zookeeper中創(chuàng)建了一個(gè)znode節(jié)點(diǎn),該節(jié)點(diǎn)存儲(chǔ)了上面所說(shuō)的服務(wù)信息。
2)服務(wù)發(fā)現(xiàn)
服務(wù)消費(fèi)者在第一次調(diào)用服務(wù)時(shí),會(huì)通過(guò)注冊(cè)中心找到相應(yīng)的服務(wù)的IP地址列表,并緩存到本地,以供后續(xù)使用。當(dāng)消費(fèi)者調(diào)用服務(wù)時(shí),不會(huì)再去請(qǐng)求注冊(cè)中心,而是直接通過(guò)負(fù)載均衡算法從IP列表中取一個(gè)服務(wù)提供者的服務(wù)器調(diào)用服務(wù)。
3)注冊(cè)服務(wù)
可靠的尋址方式(主要是提供服務(wù)的發(fā)現(xiàn))是RPC的實(shí)現(xiàn)基石,比如可以zookeeper來(lái)實(shí)現(xiàn)注冊(cè)服務(wù)等等。
服務(wù)提供者啟動(dòng)后主動(dòng)向服務(wù)(注冊(cè))中心注冊(cè)機(jī)器ip、端口以及提供的服務(wù)列表。
服務(wù)消費(fèi)者啟動(dòng)時(shí)向服務(wù)(注冊(cè))中心獲取服務(wù)提供方地址列表,可實(shí)現(xiàn)軟負(fù)載均衡和Failover。
提供者需要定時(shí)向注冊(cè)中心發(fā)送心跳,一段時(shí)間未收到來(lái)自提供者的心跳后,認(rèn)為提供者已經(jīng)停止服務(wù),從注冊(cè)中心上摘取掉對(duì)應(yīng)的服務(wù)等等。
數(shù)據(jù)傳輸采用什么協(xié)議,數(shù)據(jù)該如何序列化和反序列化。
當(dāng)前很多RPC框架都直接基于netty這一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推薦使用Netty 作為底層通信框架。
比如:B機(jī)器進(jìn)行本地調(diào)用(通過(guò)代理Proxy)之后得到了返回值,此時(shí)還需要再把返回值發(fā)送回A機(jī)器,同樣也需要經(jīng)過(guò)序列化操作,然后再經(jīng)過(guò)網(wǎng)絡(luò)傳輸將二進(jìn)制數(shù)據(jù)發(fā)送回A機(jī)器,而當(dāng)A機(jī)器接收到這些返回值之后,則再次進(jìn)行反序列化操作
總之,要實(shí)現(xiàn)一個(gè)RPC不算難,難的是實(shí)現(xiàn)一個(gè)高性能高可靠的RPC框架,后續(xù)將結(jié)合Dubbo的實(shí)現(xiàn)一起再探討。
以上就是RPC的介紹,更多Redis、Spring Cloud、MySQL數(shù)據(jù)庫(kù)分庫(kù)分表等高并發(fā)架構(gòu)設(shè)計(jì),關(guān)注我我會(huì)持續(xù)更新
針對(duì)于上面所涉及到的知識(shí)點(diǎn)我總結(jié)出了有1到5年開(kāi)發(fā)經(jīng)驗(yàn)的程序員在面試中涉及到的絕大部分架構(gòu)面試題及答案做成了文檔和架構(gòu)視頻資料免費(fèi)分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發(fā)等架構(gòu)技術(shù)資料),希望能幫助到您面試前的復(fù)習(xí)且找到一個(gè)好的工作,也節(jié)省大家在網(wǎng)上搜索資料的時(shí)間來(lái)學(xué)習(xí),也可以關(guān)注我一下以后會(huì)有更多干貨分享。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。
名稱(chēng)欄目:阿里面試必問(wèn)的Dubbo相關(guān)問(wèn)題-創(chuàng)新互聯(lián)
鏈接地址:http://jinyejixie.com/article16/dioodg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、Google、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷(xiāo)、建站公司、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)