在近幾年工做中發現,功能服務化或微服務化愈來愈流行,逐漸成爲實現中大型分佈式系統架構的主要方式,而在分佈式系統中的不一樣節點應用間的通訊中,RPC遠程協議扮演關鍵做用。實際上,在平常工做中,咱們也多多少少使用過RPC協議方案,對於初級的程序員來講,RPC顯得很神祕,而經驗豐富些的程序員雖可以使用,但對其工做原理理解的並非很深入,每每會誤用,這裏就我理解來詳細介紹下。
l RPC是什麼
l RPC工做流程
l RPC實現內容
l RPC結構分析
1、RPC是什麼
RPC(Remote Procedure Call),是一種遠程過程調用的協議方案,其自己是一種藉助於網絡來實現不一樣機子或應用之間跨進程通訊的,不是一個實現框架,即並不是是一個拿來即用的框架。目前,比較主流使用的RPC開源框架有谷歌的gRPC,Facebook的Thrift,阿里的Dubbo,開源SpringCloud,以及Spring的RMI等均基於RPC協議方案實現了遠程過程功能的使用,雖實現方式不一樣,但原理卻大同小異。接下來,介紹下RPC的工做流,RPC實現須要作的事情,以及幾種常見RPC框架的主要異同點對比。
2、RPC工做流程
RPC是基於典型的C/S模式的遠程調用方案,分爲客戶端(Caller)和服務端(Callee)。Caller負責調用遠程的服務,而Callee則負責提供服務功能,並暴露給使用者Caller,這在現今的微服務架構中很常見,而RPC基本概念化工做流以下:
一、Client發起遠程調用時,是經過Client-stub實現的;
二、Client-stub接受Client調用通知後,負責將調用的接口、方法及參數,按照約定的協議規範進行編碼存根;
三、本地RPCRuntime負責遠程傳輸在Client-stub中編碼的數據包;
四、遠程RPCRuntime接收到消息請求後,將其傳遞給Server-stub,由其負責解碼處理,而後發起本地調用,完成具體服務功能並返回結果給Client。
從上面流程看,認爲RPC的實現比較簡單,其實否則。在整個RPC概念過程當中,有不少事情要作,好比:是否跨語言支持,網絡傳輸的性能與協議,數據包編解碼以及異常恢復處理等,不簡單了吧!具體請往下俯瞰。
3、RPC實現內容
經過上面的介紹,咱們應該知道RPC是什麼,以及它的工做流程是怎樣的,那麼有人問RPC是一個協議方案,該如何設計暱?答案在下面揭曉,咱們須要實現下面幾點內容:
一、兩端的Stub生成策略,是手動仍是自動生成,前者較麻煩,後者可藉助使用生成工具生成,如:Thrift自己提供的工具;
二、是否支持跨語言平臺,也就是不一樣語言的無縫兼容,通常都是經過IDL來聲明接口文件實現跨語言;
三、網絡傳輸協議格式約定,可採用消息頭和消息體的方式,通常採用消息頭存放元數據,消息體存放消息內容;
四、網絡傳輸採用的協議類型,主流的RPC框架採用了Socket較多,而也有基於HTTP協議的RPC框架,如:谷歌的gRPC採用HTTP2.0;
五、在高併發時,兩端交互時是否支持異步/同步多線程的通訊機制;
六、異常處理要注意:本地執行必定會執行,但遠程調用則不必定執行,可能由於網絡問題未能送達到服務方。另外,本地調用只會拋出接口聲明異常,而遠程調用還會拋出RPC框架異常,同時本地和與遠程調用的性能消耗可能差距較大,這取決於RPC固有消耗所佔比重。
正如上面,既然有這麼多工做要作,那麼所有交給開發人員來完成,則須要若干天時間成本,即便跑通流程,也未必穩定,因此實際使用時,咱們會藉助於強大的開源框架來實現,正如在本章開頭部分所描述的內容。
4、RPC結構分析
上面比較粗略地介紹了RPC的工做流程,接下來對RPC協議方案的結構進行拆分,更加清楚瞭解RPC的工做原理細節,這樣在接觸主流的RPC開源框架時,更加遊刃有餘,具體以下所示:
RPC服務方經過RpcServer導出(export)遠程接口方法,供客戶端經過RpcClient引入(import)該遠程接口方法。這樣客戶端就能夠調用引入的遠程API了,而後調用該接口方法,跟調用遠程接口方法同樣,RPC框架提供接口的代理實現,實際的調用委託給了RpcProxy,而該代理封裝調用信息並將調用轉交給RpcInvoker實際執行調用。在客戶端的RpcInvoker經過RpcConnector維持與服務端RpcChannel,並使用RpcChannel進行協議編碼(encode),並將編碼後的請求消息藉助通道發送給服務方。
RPC服務端接收器RpcAcceptor接收客戶端的調用請求,同時使用RpcProtocol進行協議解碼(decode)。解碼後的調用信息交給RpcProcessor來控制調用邏輯,最後將調用信息傳遞給RpcInvoker實際執行調用並返回結果給客戶端。
好了,到這裏我已經介紹了RPC的基本概念,工做流程,在設計RPC時須要作的幾件事,以及RPC的結構實現分析。那麼,在後續的文章中,會繼續介紹RPC的經常使用開源框架的使用及分析。
原文:https://blog.csdn.net/why_2012_gogo/article/details/79425338
程序員