httpinvoker远程调用超时_RPC远程过程调用协议工作原理分析
1、RPC(Remote Procedure Call)定義
RPC(Remote Procedure Call)—遠(yuǎn)程過(guò)程調(diào)用,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開(kāi)發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
RPC采用客戶機(jī)/服務(wù)器模式。請(qǐng)求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。
調(diào)用分類
RPC 調(diào)用分以下兩種:
- 同步調(diào)用
- 客戶方等待調(diào)用執(zhí)行完成并返回結(jié)果。
- 異步調(diào)用
- 客戶方調(diào)用后不用等待執(zhí)行結(jié)果返回,但依然可以通過(guò)回調(diào)通知等方式獲取返回結(jié)果。 若客戶方不關(guān)心調(diào)用返回結(jié)果,則變成單向異步調(diào)用,單向調(diào)用不用返回結(jié)果。
異步和同步的區(qū)分在于是否等待服務(wù)端執(zhí)行完成并返回結(jié)果。
3、RPC內(nèi)部操作流程
RPC(Remote Procedure Call)運(yùn)行時(shí),一次客戶機(jī)對(duì)服務(wù)器的RPC調(diào)用,其內(nèi)部操作大致有如下十步:
1.調(diào)用客戶端句柄;執(zhí)行傳送參數(shù)
2.調(diào)用本地系統(tǒng)內(nèi)核發(fā)送網(wǎng)絡(luò)消息
3.消息傳送到遠(yuǎn)程主機(jī)
4.服務(wù)器句柄得到消息并取得參數(shù)
5.執(zhí)行遠(yuǎn)程過(guò)程
6.執(zhí)行的過(guò)程將結(jié)果返回服務(wù)器句柄
7.服務(wù)器句柄返回結(jié)果,調(diào)用遠(yuǎn)程系統(tǒng)內(nèi)核
8.消息傳回本地主機(jī)
9.客戶句柄由內(nèi)核接收消息
10.客戶接收句柄返回的數(shù)據(jù)
4、每個(gè)組件的職責(zé)劃分
5、RPC框架需要解決的問(wèn)題?
1、如何確定客戶端和服務(wù)端之間的通信協(xié)議?
2、如何更高效地進(jìn)行網(wǎng)絡(luò)通信?
3、服務(wù)端提供的服務(wù)如何暴露給客戶端?
4、客戶端如何發(fā)現(xiàn)這些暴露的服務(wù)?
5、如何更高效地對(duì)請(qǐng)求對(duì)象和響應(yīng)結(jié)果進(jìn)行序列化和反序列化操作?
6、使用了哪些技術(shù)?
1、動(dòng)態(tài)代理
生成Client Stub(客戶端存根)和Server Stub(服務(wù)端存根)的時(shí)候需要用到j(luò)ava動(dòng)態(tài)代理技術(shù),可以使用jdk提供的原生的動(dòng)態(tài)代理機(jī)制,也可以使用開(kāi)源的:Cglib代理,Javassist字節(jié)碼生成技術(shù)。
2、序列化
在網(wǎng)絡(luò)中,所有的數(shù)據(jù)都將會(huì)被轉(zhuǎn)化為字節(jié)進(jìn)行傳送,所以為了能夠使參數(shù)對(duì)象在網(wǎng)絡(luò)中進(jìn)行傳輸,需要對(duì)這些參數(shù)進(jìn)行序列化和反序列化操作。
序列化:把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化,也就是編碼的過(guò)程。
反序列化:把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化,也就是解碼的過(guò)程。
目前比較高效的開(kāi)源序列化框架:如Kryo、fastjson和Protobuf等。
3、NIO通信
出于并發(fā)性能的考慮,傳統(tǒng)的阻塞式 IO 顯然不太合適,因此我們需要異步的 IO,即 NIO。
Java 提供了 NIO 的解決方案,Java 7 也提供了更優(yōu)秀的 NIO.2 支持。可以選擇Netty或者mina來(lái)解決NIO數(shù)據(jù)傳輸?shù)膯?wèn)題。
4、服務(wù)注冊(cè)中心
可選:Redis、Zookeeper、Consul 、Etcd。
一般使用ZooKeeper提供服務(wù)注冊(cè)與發(fā)現(xiàn)功能,解決單點(diǎn)故障以及分布式部署的問(wèn)題(注冊(cè)中心)。
總結(jié)
以上是生活随笔為你收集整理的httpinvoker远程调用超时_RPC远程过程调用协议工作原理分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mave工程中的一个类调用另一个聚合工程
- 下一篇: canvas整体放大_【HTML5】Ca