網站首頁 編程語言 正文
>>什么是RPC
RPC 的全稱是 Remote Procedure Call 是一種進程間通信方式。
它允許程序調用另一個地址空間(通常是共享網絡的另一臺機器上)的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即無論是調用本地接口/服務的還是遠程的接口/服務,本質上編寫的調用代碼基本相同。
比如兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數或者方法,由于不在一個內存空間,不能直接調用,這時候需要通過就可以應用RPC框架的實現來解決。
>>RESTful、SOAP和RPC
- (1)RESTful是一種架構設計風格,提供了設計原則和約束條件,而不是架構。而滿足這些約束條件和原則的應用程序或設計就是 RESTful架構或服務。
- (2)SOAP,簡單對象訪問協議是一種數據交換協議規范,是一種輕量的、簡單的、基于XML的協議的規范。
SOAP協議和HTTP協議一樣,都是底層的通信協議,只是請求包的格式不同而已,SOAP包是XML格式的。
SOAP的消息是基于xml并封裝成了符合http協議,因此,它符合任何路由器、 防火墻或代理服務器的要求。
soap可以使用任何語言來完成,只要發送正確的soap請求即可,基于soap的服務可以在任何平臺無需修改即可正常使用。
- (3)RPC就是從一臺機器(客戶端)上通過參數傳遞的方式調用另一臺機器(服務器)上的一個函數或方法(可以統稱為服務)并得到返回的結果。
RPC 會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊)
RPC 是一個請求響應模型。客戶端發起請求,服務器返回響應(類似于Http的工作方式)
RPC 在使用形式上像調用本地函數(或方法)一樣去調用遠程的函數(或方法)。
>>幾種RPC框架
幾種比較典型的RPC的實現和調用框架。?
(1)RMI實現,利用java.rmi包實現,基于Java遠程方法協議(Java Remote Method Protocol)?和java的原生序列化。?
(2)Hessian,是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 基于HTTP協議,采用二進制編解碼。?
(3)THRIFT是一種可伸縮的跨語言服務的軟件框架。thrift允許你定義一個描述文件,描述數據類型和服務接口。依據該文件,編譯器方便地生成RPC客戶端和服務器通信代碼。
>>RPC的實現原理
(1)一個典型的RPC實現結構
- RpcServer:負責導出(export)遠程接口
- RpcClient:負責導入(import)遠程接口的代理實現
- RpcProxy:遠程接口的代理實現
- RpcInvoker:
客戶方實現:負責編碼調用信息和發送調用請求到服務方并等待調用結果返回
服務方實現:負責調用服務端接口的具體實現并返回調用結果 - RpcProtocol:負責協議編/解碼
- RpcConnector:負責維持客戶方和服務方的連接通道和發送數據到服務方
- RpcAcceptor:負責接收客戶方請求并返回請求結果
- RpcProcessor:負責在服務方控制調用過程,包括管理調用線程池、超時時間等
- RpcChannel:數據傳輸通道
(2)實現過程
RPC 服務方通過 RpcServer 去導出(export)遠程接口方法,而客戶方通過 RpcClient 去引入(import)遠程接口方法。
客戶方像調用本地方法一樣去調用遠程接口方法,RPC 框架提供接口的代理實現,實際的調用將委托給代理RpcProxy 。
代理封裝調用信息并將調用轉交給RpcInvoker 去實際執行。
在客戶端的RpcInvoker 通過連接器RpcConnector 去維持與服務端的通道RpcChannel,并使用RpcProtocol 執行協議編碼(encode)并將編碼后的請求消息通過通道發送給服務方。
RPC 服務端接收器 RpcAcceptor 接收客戶端的調用請求,同樣使用RpcProtocol 執行協議解碼(decode)。
解碼后的調用信息傳遞給RpcProcessor 去控制處理調用過程,最后再委托調用給RpcInvoker 去實際執行并返回調用結果。
原文鏈接:https://www.cnblogs.com/fqfanqi/p/6140877.html
相關推薦
- 2022-06-20 .NET?Core企業微信網頁授權登錄的實現_實用技巧
- 2022-07-07 Linux?shell進行文件解壓,復制和移動詳解_linux shell
- 2022-11-05 一文教你如何使用Databinding寫一個關注功能_Android
- 2022-06-26 django中模板繼承與ModelForm實例詳解_python
- 2023-04-26 C語言形參與實參使用的差別講解_C 語言
- 2024-04-07 springboot整合redis配置
- 2023-06-21 C#高級靜態語言效率利器之泛型詳解_C#教程
- 2022-05-27 C++的STL中accumulate函數的使用方法_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支