聲明:原創(chuàng)文章屡久,轉(zhuǎn)載請注明出處潮太。http://www.reibang.com/u/e02df63eaa87
1碑定、簡介
RPC全稱是Remote Procedure Call奕纫,它是一種進程間通信方式涩馆。允許像調(diào)用本地服務(wù)一樣調(diào)用遠程服務(wù)行施,它的具體實現(xiàn)方式可以不同,例如Spring的HTTP Invoker魂那,F(xiàn)acebook的Thrift
二進制私有協(xié)議通信蛾号。
RPC概念術(shù)語在上世紀80年代由Bruce Jay Nelson提出,在他的論文中對RPC進行了如下總結(jié)涯雅。
- 簡單:RPC概念的語義十分清晰和簡單鲜结,這樣建立分布式計算就更容易。
- 高效:過程調(diào)用看起來十分簡單且高效活逆。
- 通用:在單機計算中過程往往是不同算法和API精刷,跨進程調(diào)用最重要的通用的通信機制。
2蔗候、RPC框架原理
RPC框架的目標就是讓遠程過程(服務(wù))調(diào)用更加簡單怒允、透明。RPC框架負責屏蔽底層的傳輸方式(TCP/UDP)锈遥、序列化方式(XML/JSON/二進制)和通信細節(jié)纫事。框架使用者只需要了解誰在什么位置提供了什么樣的遠程服務(wù)接口即可所灸,開發(fā)者不需要關(guān)心通信細節(jié)和調(diào)用過程丽惶。
因此一個RPC的設(shè)計需要考慮:傳輸方式、序列化爬立、通信等方面钾唬。
RPC框架調(diào)用原理如下圖:
RPC框架實現(xiàn)的幾個核心技術(shù)點如下:
- 遠程服務(wù)提供者需要以某種形式提供服務(wù)調(diào)用相關(guān)的信息,包括但不限于服務(wù)接口定義懦尝、數(shù)據(jù)結(jié)構(gòu)知纷、或者中間態(tài)的服務(wù)定義文件壤圃,如Thrift的IDL文件陵霉,WS-RPC的WSDL文件定義,甚至也可以實服務(wù)端的接口說明文檔伍绳;服務(wù)調(diào)用者需要通過一定的途徑獲取遠程服務(wù)調(diào)用相關(guān)信息踊挠,例如服務(wù)端接口定義Jar包導(dǎo)入,獲取服務(wù)端IDL文件等。
- 遠程代理對象:服務(wù)調(diào)用者調(diào)用的服務(wù)實際是遠程服務(wù)的本地代理效床,對應(yīng)Java語言睹酌,它的實現(xiàn)就是JDK的動態(tài)代理,通過動態(tài)代理的攔截機制剩檀,將本地調(diào)用封裝成遠程服務(wù)調(diào)用憋沿。
- 通信:RPC框架和具體的協(xié)議無關(guān)。
- 序列化:遠程通信沪猴,需要將對象轉(zhuǎn)換成二進制碼流進行網(wǎng)絡(luò)傳輸辐啄,不同的序列化框架,支持的數(shù)據(jù)類型运嗜、數(shù)據(jù)包大小壶辜、異常類型及性能都不同,不同的RPC框架應(yīng)用場景不同担租,因此技術(shù)選擇也會存在很大差異砸民。一些RPC框架,可以支持多種序列化方式奋救,有的甚至支持用戶自定義序列化框架(Hadoop Avro)岭参。
- 要解決通訊的問題,主要是通過在客戶端和服務(wù)器之間建立TCP連接菠镇,遠程過程調(diào)用的所有交換的數(shù)據(jù)都在這個連接里傳輸冗荸。連接可以是按需連接,調(diào)用結(jié)束后就斷掉利耍,也可以是長連接蚌本,多個遠程過程調(diào)用共享同一個連接。
- 要解決尋址的問題隘梨,也就是說程癌,A服務(wù)器上的應(yīng)用怎么告訴底層的RPC框架,如何連接到B服務(wù)器(如主機或IP地址)以及特定的端口轴猎,方法的名稱名稱是什么嵌莉,這樣才能完成調(diào)用。比如基于Web服務(wù)協(xié)議棧的RPC捻脖,就要提供一個endpoint URI锐峭,或者是從UDDI服務(wù)上查找。如果是RMI調(diào)用的話可婶,還需要一個RMI Registry來注冊服務(wù)的地址沿癞。
- 當A服務(wù)器上的應(yīng)用發(fā)起遠程過程調(diào)用時,方法的參數(shù)需要通過底層的網(wǎng)絡(luò)協(xié)議如TCP傳遞到B服務(wù)器矛渴,由于網(wǎng)絡(luò)協(xié)議是基于二進制的椎扬,內(nèi)存中的參數(shù)的值要序列化成二進制的形式,也就是序列化(Serialize)或編組(marshal),通過尋址和傳輸將序列化的二進制發(fā)送給B服務(wù)器蚕涤。
- B服務(wù)器收到請求后筐赔,需要對參數(shù)進行反序列化(序列化的逆操作),恢復(fù)為內(nèi)存中的表達方式揖铜,然后找到對應(yīng)的方法(尋址的一部分)進行本地調(diào)用茴丰,然后得到返回值。
- 返回值還要發(fā)送回服務(wù)器A上的應(yīng)用天吓,也要經(jīng)過序列化的方式發(fā)送较沪,服務(wù)器A接到后,再反序列化失仁,恢復(fù)為內(nèi)存中的表達方式尸曼,交給A服務(wù)器上的應(yīng)用。
3萄焦、主流RPC框架
- 由Facebook開發(fā)的RPC框架Apache Thrift
- Hadoop的子項目Avro-RPC
- caucho提供的基于binary-RPC框架Hessian
- Google開源的基于HTTP/2和ProtocolBuf的RPC框架gRPC
http://www.phei.com.cn/module/goods/wssd_content.jsp?bookid=44448
https://segmentfault.com/a/1190000005178084
https://www.zhihu.com/question/25536695/answer/36197244