IPC和RPC
進(jìn)程間通信(IPC,Inter-Process Communication),指至少兩個(gè)進(jìn)程或線程間傳送數(shù)據(jù)或信號(hào)的一些技術(shù)或方法屿愚。
進(jìn)程是計(jì)算機(jī)系統(tǒng)分配資源的最小單位孟害。每個(gè)進(jìn)程都有自己的一部分獨(dú)立的系統(tǒng)資源,彼此是隔離的孤钦。為了能使不同的進(jìn)程互相訪問資源并進(jìn)行協(xié)調(diào)工作,才有了進(jìn)程間通信。這些進(jìn)程可以運(yùn)行在同一計(jì)算機(jī)上或網(wǎng)絡(luò)連接的不同計(jì)算機(jī)上偏形。 進(jìn)程間通信技術(shù)包括消息傳遞静袖、同步、共享內(nèi)存和遠(yuǎn)程過程調(diào)用壳猜。 IPC是一種標(biāo)準(zhǔn)的Unix通信機(jī)制勾徽。
有兩種類型的進(jìn)程間通信(IPC)。
- 本地過程調(diào)用(LPC)LPC用在多任務(wù)操作系統(tǒng)中统扳,使得同時(shí)運(yùn)行的任務(wù)能互相會(huì)話喘帚。這些任務(wù)共享內(nèi)存空間使任務(wù)同步和互相發(fā)送信息。
- 本地過程調(diào)用(LPC)LPC用在多任務(wù)操作系統(tǒng)中咒钟,使得同時(shí)運(yùn)行的任務(wù)能互相會(huì)話吹由。這些任務(wù)共享內(nèi)存空間使任務(wù)同步和互相發(fā)送信息。
為什么RPC呢朱嘴?就是無法在一個(gè)進(jìn)程內(nèi)倾鲫,甚至一個(gè)計(jì)算機(jī)內(nèi)通過本地調(diào)用的方式完成的需求,比如不同的系統(tǒng)間的通訊萍嬉,甚至不同的組織間的通訊乌昔。由于計(jì)算能力需要橫向擴(kuò)展,需要在多臺(tái)機(jī)器組成的集群上部署應(yīng)用壤追。
RPC的通信過程
RPC(Remote Promote Call) 一種進(jìn)程間通信方式磕道。允許像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù)。
RPC 這個(gè)概念術(shù)語在上世紀(jì) 80 年代由 Bruce Jay Nelson 提出的行冰,Nelson 的論文中指出實(shí)現(xiàn) RPC 的程序包括 5 個(gè)部分:
1. User
2. User-stub
3. RPCRuntime
4. Server-stub
5. Server
這五個(gè)部分的關(guān)系是:
這里 user 就是 client 端溺蕉,當(dāng) user 想發(fā)起一個(gè)遠(yuǎn)程調(diào)用時(shí),它實(shí)際是通過本地調(diào)用 user-stub悼做。
user-stub 負(fù)責(zé)將調(diào)用的接口疯特、方法和參數(shù)通過約定的協(xié)議規(guī)范進(jìn)行編碼并通過本地的 RPCRuntime 實(shí)例傳輸?shù)竭h(yuǎn)端的實(shí)例。
遠(yuǎn)端 RPCRuntime 實(shí)例收到請(qǐng)求后交給 server-stub 進(jìn)行解碼后發(fā)起本地端調(diào)用肛走,調(diào)用結(jié)果再返回給 user 端漓雅。
RPC結(jié)構(gòu)的實(shí)現(xiàn)
客戶端具體的調(diào)用過程:
- RPC 服務(wù)方通過 RpcServer 去導(dǎo)出(export)遠(yuǎn)程接口方法,而客戶方通過 RpcClient 去引入(import)遠(yuǎn)程接口方法朽色。
- 客戶方像調(diào)用本地方法一樣去調(diào)用遠(yuǎn)程接口方法故硅,RPC 框架提供接口的代理實(shí)現(xiàn),實(shí)際的調(diào)用將委托給代理RpcProxy 纵搁。
- RpcProxy代理封裝調(diào)用信息并將調(diào)用轉(zhuǎn)交給RpcInvoker 去實(shí)際執(zhí)行。
- RpcInvoker 通過連接器RpcConnector 去維持與服務(wù)端的通道RpcChannel往踢,并使用RpcProtocol 執(zhí)行協(xié)議編碼(encode)并將編碼后的請(qǐng)求消息通過通道發(fā)送給服務(wù)方腾誉。
服務(wù)器端具體的調(diào)用過程:
- RPC 服務(wù)端接收器 RpcAcceptor 接收客戶端的調(diào)用請(qǐng)求,同樣使用RpcProtocol 執(zhí)行協(xié)議解碼(decode)
- 解碼后的調(diào)用信息傳遞給RpcProcessor 去控制處理調(diào)用過程,最后再委托調(diào)用給RpcInvoker 去實(shí)際執(zhí)行并返回調(diào)用結(jié)果利职。
RPC 組件職責(zé)
上面我們進(jìn)一步拆解了 RPC 實(shí)現(xiàn)結(jié)構(gòu)的各個(gè)組件組成部分趣效,下面我們詳細(xì)說明下每個(gè)組件的職責(zé)劃分。
1. RpcServer
負(fù)責(zé)導(dǎo)出(export)遠(yuǎn)程接口
2. RpcClient
負(fù)責(zé)導(dǎo)入(import)遠(yuǎn)程接口的代理實(shí)現(xiàn)
3. RpcProxy
遠(yuǎn)程接口的代理實(shí)現(xiàn)
4. RpcInvoker
客戶方實(shí)現(xiàn):負(fù)責(zé)編碼調(diào)用信息和發(fā)送調(diào)用請(qǐng)求到服務(wù)方并等待調(diào)用結(jié)果返回
服務(wù)方實(shí)現(xiàn):負(fù)責(zé)調(diào)用服務(wù)端接口的具體實(shí)現(xiàn)并返回調(diào)用結(jié)果
5. RpcProtocol
負(fù)責(zé)協(xié)議編/解碼
6. RpcConnector
負(fù)責(zé)維持客戶方和服務(wù)方的連接通道和發(fā)送數(shù)據(jù)到服務(wù)方
7. RpcAcceptor
負(fù)責(zé)接收客戶方請(qǐng)求并返回請(qǐng)求結(jié)果
8. RpcProcessor
負(fù)責(zé)在服務(wù)方控制調(diào)用過程猪贪,包括管理調(diào)用線程池跷敬、超時(shí)時(shí)間等
9. RpcChannel
數(shù)據(jù)傳輸通道
協(xié)議理解
接口調(diào)用通常包含兩個(gè)部分,序列化和通信協(xié)議热押。常見的序列化協(xié)議包括json西傀、xml、hession桶癣、protobuf拥褂、thrift、text牙寞、bytes等饺鹃;通信比較流行的是http、soap间雀、websockect悔详,RPC通常基于TCP實(shí)現(xiàn)惹挟,常用框架例如netty茄螃。