Hadopp作為分布式存儲(chǔ)系統(tǒng),為了便于各個(gè)節(jié)點(diǎn)之間的通信和交互,基于IPC進(jìn)程間通信模型,實(shí)現(xiàn)了一套高效的輕量級(jí)RPC框架,這套R(shí)PC框架底層采取了javaNIO,java動(dòng)態(tài)代理以及protobuf等基礎(chǔ)技術(shù)。
RPC:Remote Procedure Call Protocol
遠(yuǎn)程過(guò)程調(diào)用協(xié)議,RPC基于TCP/UDP網(wǎng)絡(luò)協(xié)議來(lái)傳遞RPC請(qǐng)求以及響應(yīng)消息。
RPC采用客戶(hù)端/服務(wù)端模式,客戶(hù)端發(fā)送帶參數(shù)請(qǐng)求,服務(wù)端會(huì)保持睡眠狀態(tài)知道有調(diào)用請(qǐng)求到達(dá)為止。
1 RPC框架的結(jié)構(gòu):
通信模塊
客戶(hù)端Stub程序
服務(wù)端Stub程序
請(qǐng)求程序
服務(wù)程序

通信模塊:
傳輸RPC請(qǐng)求和響應(yīng)的網(wǎng)絡(luò)通信模塊,可以基于TCP/UDP協(xié)議,可以是同步/異步;Hadoop實(shí)現(xiàn)了ipc.Client類(lèi)和ipc.Server類(lèi)提供的基于TCP/IP Socket的網(wǎng)絡(luò)通信功能,客戶(hù)端可以通過(guò)Client類(lèi)將序列化的請(qǐng)求發(fā)送到遠(yuǎn)程服務(wù)器,服務(wù)器會(huì)通過(guò)Server類(lèi)接收來(lái)自客戶(hù)端的請(qǐng)求。
客戶(hù)端Stub程序
客戶(hù)端的Stub可以看做是一個(gè)代理對(duì)象,它會(huì)將請(qǐng)求程序的RPC調(diào)用序列化,并調(diào)用Client.call()方法將這個(gè)請(qǐng)求發(fā)送給遠(yuǎn)程服務(wù)器,這些實(shí)現(xiàn)對(duì)客戶(hù)端調(diào)用程序是完全透明的。
備注:默認(rèn)序列化工具是protobuf
a
服務(wù)器端Stub程序
在服務(wù)器端,Stub程序會(huì)將遠(yuǎn)程客戶(hù)端發(fā)送的調(diào)用請(qǐng)求和參數(shù)反序列化,根據(jù)調(diào)用信息觸發(fā)對(duì)應(yīng)的服務(wù)程序,然后將服務(wù)程序返回的響應(yīng)信息序列化并發(fā)會(huì)客戶(hù)端。
請(qǐng)求程序
請(qǐng)求程序會(huì)像調(diào)用本地方法一樣調(diào)用客戶(hù)端Stub程序,然后接受Stub程序返回的響應(yīng)信息。
服務(wù)程序
服務(wù)器會(huì)接受來(lái)自Stub程序的調(diào)用請(qǐng)求,執(zhí)行對(duì)應(yīng)的邏輯,并返回執(zhí)行結(jié)果。
2 使用Hadoop RPC框架的幾個(gè)步驟:
定義RPC協(xié)議
實(shí)現(xiàn)PRC協(xié)議
客戶(hù)端獲取代理對(duì)象
獲取一個(gè)RPC協(xié)議的代理對(duì)象,通過(guò)Java動(dòng)態(tài)代理機(jī)制,這個(gè)RPC請(qǐng)求會(huì)由一個(gè)代理對(duì)象處理,這個(gè)對(duì)象會(huì)將RPC調(diào)用信息和參數(shù)序列化,然后通過(guò)Client.call()方法將這個(gè)請(qǐng)求發(fā)送給遠(yuǎn)程服務(wù)器服務(wù)器構(gòu)造并啟動(dòng)RPC Server
構(gòu)造一個(gè)Server對(duì)象,使用這個(gè)對(duì)象來(lái)響應(yīng)客戶(hù)端的RPC請(qǐng)求。
3 Hadoop RPC實(shí)現(xiàn)
Hadoop RPC框架主要由三個(gè)類(lèi)組成:
RPC類(lèi):
對(duì)外提供一個(gè)使用Hadoop RPC框架的接口Client類(lèi):
用于實(shí)現(xiàn)RPC客戶(hù)端功能,內(nèi)部類(lèi)有:Call 、ConnectionServer類(lèi):
采用了多線程多Reator的設(shè)計(jì)模式,Server內(nèi)部類(lèi)有:Listener、Reader、Handler、Responder
用于實(shí)現(xiàn)PRC服務(wù)端功能,使用了線程池、JavaNIO、Reactor模式
Reactor模式:是一種廣泛應(yīng)用于在服務(wù)器端的設(shè)計(jì)模式,由單線程單Reator、多線程單Reator、多線程多Reator兩種,處理流程是:應(yīng)用程序向一個(gè)中間人注冊(cè)IO事件,當(dāng)中間人監(jiān)聽(tīng)到這個(gè)IO事件后,會(huì)通知并喚醒應(yīng)用程序處理這個(gè)事件。這個(gè)中間人其實(shí)就是一個(gè)不斷等待循環(huán)的線程,它會(huì)接受所有應(yīng)用程序的注冊(cè),并檢查注冊(cè)的IO事件是否就緒,如就緒則通知程序進(jìn)行處理。
Boy-20180725