Java面試題沖刺第十四天--PRC框架
面試題1:說說你對(duì)RPC框架的理解?
RPC (Remote Procedure Call)即遠(yuǎn)程過程調(diào)用,是分布式系統(tǒng)常見的一種通信方法。它允許程序調(diào)用另一個(gè)地址空間(通常是共享網(wǎng)絡(luò)的另一臺(tái)機(jī)器上)的過程或函數(shù),而不用程序員顯式編碼這個(gè)遠(yuǎn)程調(diào)用的細(xì)節(jié)。
除 RPC 之外,常見的多系統(tǒng)數(shù)據(jù)交互方案還有分布式消息隊(duì)列、HTTP 請(qǐng)求調(diào)用、數(shù)據(jù)庫(kù)和分布式緩存等。
其中 RPC 和 HTTP 調(diào)用是沒有經(jīng)過中間件的,它們是端到端系統(tǒng)的直接數(shù)據(jù)交互。
通俗點(diǎn)說
- RPC就是從一臺(tái)機(jī)器(客戶端)上通過參數(shù)傳遞的方式調(diào)用另一臺(tái)機(jī)器(服務(wù)器)上的一個(gè)函數(shù)或方法(可以統(tǒng)稱為服務(wù))并得到返回的結(jié)果。
- RPC會(huì)隱藏底層的通訊細(xì)節(jié)(不需要直接處理Socket通訊或Http通訊)。
- 客戶端發(fā)起請(qǐng)求,服務(wù)器返回響應(yīng)(類似于Http的工作方式)RPC在使用形式上像調(diào)用本地函數(shù)(或方法)一樣去調(diào)用遠(yuǎn)程的函數(shù)(或方法)。
追問1:RPC框架實(shí)現(xiàn)原理是什么樣的
在RPC框架中主要有三個(gè)角色:提供者、消費(fèi)者和注冊(cè)中心。如下圖所示:
- 提供者: 暴露服務(wù)的服務(wù)提供方。
- 調(diào)用者: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
- 注冊(cè)中心: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心。
原理圖如上,也就是說兩臺(tái)服務(wù)器A,B,一個(gè)應(yīng)用部署在A服務(wù)器上,想要調(diào)用B服務(wù)器上應(yīng)用提供的函數(shù)/方法,由于不在一個(gè)內(nèi)存空間,不能直接調(diào)用,需要通過網(wǎng)絡(luò)來表達(dá)調(diào)用的語義和傳達(dá)調(diào)用的數(shù)據(jù)。
比如說,A服務(wù)器想調(diào)用B服務(wù)器上的一個(gè)方法:Employee getEmployeeByName(String fullName)
RPC整個(gè)調(diào)用過程,主要經(jīng)歷如下幾個(gè)步驟:
1、建立通信
首先要解決通訊的問題:即A機(jī)器想要調(diào)用B機(jī)器,首先得建立起通信連接。
主要是通過在客戶端和服務(wù)器之間建立TCP連接,遠(yuǎn)程過程調(diào)用的所有交換的數(shù)據(jù)都在這個(gè)連接里傳輸。連接可以是按需連接,調(diào)用結(jié)束后就斷掉,也可以是長(zhǎng)連接,多個(gè)遠(yuǎn)程過程調(diào)用共享同一個(gè)連接。
2、服務(wù)尋址
要解決尋址的問題,也就是說,A服務(wù)器上的應(yīng)用怎么告訴底層的RPC框架,如何連接到B服務(wù)器(如主機(jī)或IP地址)以及特定的端口,方法的名稱名稱是什么。
通常情況下我們需要提供B機(jī)器(主機(jī)名或IP地址)以及特定的端口,然后指定調(diào)用的方法或者函數(shù)的名稱以及入?yún)⒊鰠⒌刃畔?,這樣才能完成服務(wù)的一個(gè)調(diào)用。
可靠的尋址方式(主要是提供服務(wù)的發(fā)現(xiàn))是RPC的實(shí)現(xiàn)基石,比如可以采用redis或者zookeeper來注冊(cè)服務(wù)等等。
- 從服務(wù)提供者的角度看:當(dāng)提供者服務(wù)啟動(dòng)時(shí),需要自動(dòng)向注冊(cè)中心注冊(cè)服務(wù);
- 當(dāng)提供者服務(wù)停止時(shí),需要向注冊(cè)中心注銷服務(wù);
- 提供者需要定時(shí)向注冊(cè)中心發(fā)送心跳,一段時(shí)間未收到來自提供者的心跳后,認(rèn)為提供者已經(jīng)停止服務(wù),從注冊(cè)中心上摘取掉對(duì)應(yīng)的服務(wù)。
- 從調(diào)用者的角度看:調(diào)用者啟動(dòng)時(shí)訂閱注冊(cè)中心的消息并從注冊(cè)中心獲取提供者的地址;
- 當(dāng)有提供者上線或者下線時(shí),注冊(cè)中心會(huì)告知到調(diào)用者;
- 調(diào)用者下線時(shí),取消訂閱。
3、網(wǎng)絡(luò)傳輸
序列化
當(dāng)A機(jī)器上的應(yīng)用發(fā)起一個(gè)RPC調(diào)用時(shí),調(diào)用方法和其入?yún)⒌刃畔⑿枰ㄟ^底層的網(wǎng)絡(luò)協(xié)議如TCP傳輸?shù)紹機(jī)器,由于網(wǎng)絡(luò)協(xié)議是基于二進(jìn)制的,所有我們傳輸?shù)膮?shù)數(shù)據(jù)都需要先進(jìn)行序列化(Serialize)或者編組(marshal)成二進(jìn)制的形式才能在網(wǎng)絡(luò)中進(jìn)行傳輸。然后通過尋址操作和網(wǎng)絡(luò)傳輸將序列化或者編組之后的二進(jìn)制數(shù)據(jù)發(fā)送給B機(jī)器。
反序列化
當(dāng)B機(jī)器接收到A機(jī)器的應(yīng)用發(fā)來的請(qǐng)求之后,又需要對(duì)接收到的參數(shù)等信息進(jìn)行反序列化操作(序列化的逆操作),即將二進(jìn)制信息恢復(fù)為內(nèi)存中的表達(dá)方式,然后再找到對(duì)應(yīng)的方法(尋址的一部分)進(jìn)行本地調(diào)用(一般是通過生成代理Proxy去調(diào)用,
通常會(huì)有JDK動(dòng)態(tài)代理、CGLIB動(dòng)態(tài)代理、Javassist生成字節(jié)碼技術(shù)等),之后得到調(diào)用的返回值。
4、服務(wù)調(diào)用
B機(jī)器進(jìn)行本地調(diào)用(通過代理Proxy)之后得到了返回值,此時(shí)還需要再把返回值發(fā)送回A機(jī)器,同樣也需要經(jīng)過序列化操作,然后再經(jīng)過網(wǎng)絡(luò)傳輸將二進(jìn)制數(shù)據(jù)發(fā)送回A機(jī)器,而當(dāng)A機(jī)器接收到這些返回值之后,則再次進(jìn)行反序列化操作,恢復(fù)為內(nèi)存中的表達(dá)方式,最后再交給A機(jī)器上的應(yīng)用進(jìn)行相關(guān)處理(一般是業(yè)務(wù)邏輯處理操作)。
面試題2:常見的RPC框架有哪些?
Thrift
:thrift是一個(gè)軟件框架,用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)。它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎,以構(gòu)建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結(jié)合的、高效的服務(wù)。Dubbo
:Dubbo是一個(gè)分布式服務(wù)框架,以及SOA治理方案。其功能主要包括:高性能NIO通訊及多協(xié)議集成,服務(wù)動(dòng)態(tài)尋址與路由,軟負(fù)載均衡與容錯(cuò),依賴分析與降級(jí)等。 Dubbo是阿里巴巴內(nèi)部的SOA服務(wù)化治理方案的核心框架,Dubbo自2011年開源后,已被許多非阿里系公司使用。Spring Cloud
:Spring Cloud由眾多子項(xiàng)目組成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系統(tǒng)及微服務(wù)常用的工具,如配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、一次性token、全局鎖、選主、分布式會(huì)話和集群狀態(tài)等,滿足了構(gòu)建微服務(wù)所需的所有解決方案。Spring Cloud基于Spring Boot, 使得開發(fā)部署極其簡(jiǎn)單。
面試題3:說說RPC和SOA、SOAP、REST的區(qū)別吧
1、REST
可以看著是HTTP協(xié)議的一種直接應(yīng)用,默認(rèn)基于JSON作為傳輸格式,使用簡(jiǎn)單,學(xué)習(xí)成本低效率高,但是安全性較低。
2、SOAP
SOAP是一種數(shù)據(jù)交換協(xié)議規(guī)范,是一種輕量的、簡(jiǎn)單的、基于XML的協(xié)議的規(guī)范。而SOAP可以看著是一個(gè)重量級(jí)的協(xié)議,基于XML、SOAP在安全方面是通過使用XML-Security和XML-Signature兩個(gè)規(guī)范組成了WS-Security來實(shí)現(xiàn)安全控制的,當(dāng)前已經(jīng)得到了各個(gè)廠商的支持 。
他主要的優(yōu)點(diǎn)是:易用、靈活、跨語言、跨平臺(tái)。
3、SOA
面向服務(wù)架構(gòu),它可以根據(jù)需求通過網(wǎng)絡(luò)對(duì)松散耦合的粗粒度應(yīng)用組件進(jìn)行分布式部署、組合和使用。服務(wù)層是SOA的基礎(chǔ),可以直接被應(yīng)用調(diào)用,從而有效控制系統(tǒng)中與軟件代理交互的人為依賴性。
SOA是一種粗粒度、松耦合服務(wù)架構(gòu),服務(wù)之間通過簡(jiǎn)單、精確定義接口進(jìn)行通訊,不涉及底層編程接口和通訊模型。SOA可以看作是B/S模型、XML(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)/Web Service技術(shù)之后的自然延伸。
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
java獲取request中的參數(shù)以及java解析URL問號(hào)后的參數(shù)
這篇文章主要介紹了java獲取request中的參數(shù)以及java解析URL問號(hào)后的參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Netty分布式Server啟動(dòng)流程服務(wù)端初始化源碼分析
本章主要講解server啟動(dòng)的關(guān)鍵步驟,?讀者只需要了解server啟動(dòng)的大概邏輯,?知道關(guān)鍵的步驟在哪個(gè)類執(zhí)行即可,?并不需要了解每一步的運(yùn)作機(jī)制,?之后會(huì)對(duì)每個(gè)模塊進(jìn)行深度分析2022-03-03Java兩種方法計(jì)算出階乘尾部連續(xù)0的個(gè)數(shù)
這篇文章主要介紹了Java兩種方法計(jì)算出階乘尾部連續(xù)0的個(gè)數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Applet小應(yīng)用程序開發(fā)簡(jiǎn)介
Applet小應(yīng)用程序開發(fā)簡(jiǎn)介 ,用java開發(fā)的小程序,需要的朋友可以參考下2012-09-09Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 下
在并發(fā)編程中存在線程安全問題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí)synchronized可以保證一個(gè)線程的變化可見(可見性),即可以代替volatile2021-09-09java ThreadPoolExecutor線程池拒絕策略避坑
這篇文章主要為大家介紹了java ThreadPoolExecutor拒絕策略避坑踩坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07