RPC 技術原理
RPC ( Remote Procedure Call Protocol,遠程過程調用協議 ): 客戶端在不知道調用細節的狀況下,調用存在於遠程計算機上的某個對象,就像調用本地應用程序中的對象同樣 。 java
1.RPC要點
RPC 是協議 : 既然是協議就只是一套規範規則,也就須要有人遵循這套規範來進行實現 。 目前典型的 RPC 實現包括 : dubbo (注意是小寫的,不是大寫的 DUBBO 服務治理框架〉 、 Apache Thrift、 GRPC 、 Hetty等 。
網絡協議和網絡I/O模型對其透明 : 既然 RPC 的客戶端認爲本身是在調用本地對象,那麼傳輸層使用的是 TCP 仍是 HTTP 協議, 又或者是一些其餘的網絡協議它就不須要關心了。
信息格式對其透明 : 這些調用與返回的參數會以某種信息格式傳遞給網絡上的另一臺計算機,這個信息格式是怎樣構成的,調用方就不須要關心了 ,
RPC 框架都應該有跨語言能力:固然,現實狀況下因爲一些 RPC 框架的特殊工做場景 ,也沒有強行要求其提供跨語言能力,例如只工做在 Java 語言下的 RMI 就是這樣一套 RPC 框架。服務器
2.RPC要素網絡
• Client: RPC 協議的調用者。最理想的狀況是 RPC 調用者在徹底不知道有 RPC 框架存在的狀況下發起對遠程服務的調用。但實際狀況來講 Client 或多或少都須要指定RPC框架的一些細節。
• Server : 在 RPC 規範中 , 這個 Server 並非提供 RPC 服務器 IP、端口監昕的模塊 。 而是遠程服務上業務邏輯的具體實現(在 Java 中就體現爲 RPC 服務接口的具體實現) 。其中的代碼是最普通的和業務相關的代碼,甚至其接口實現類自己都不知道將被某一個 RPC 遠程客戶端調用。
• Proxy: RPC 代理存在於客戶端 , 由於要實現客戶端對 RPC 框架「透明」調用,那麼客戶端就不可能自行去管理消息格式 , 不可能本身去管理網絡傳輸協議,也不可能本身去判斷調用過程是否有異常。這一切工做在客戶端都是交給RPC框架中的「代理」層來處理的。
• Message Protocol : 一次完整的 RPC Client-Server 的交互確定要攜帶某種兩端都能識別的,共同約定的消息格式。 RPC 的消息管理層專門對網絡傳輸所承載的信息進行編號和解碼操做。目前流行的技術趨勢是不一樣 的 RPC 實現,爲了增強自身框架的效率都有一套(或者幾套)私有 的 消息格式 。例如後文咱們將講解的 一套 RPC 框架 Apache Thrift , 就 擁 有私有 化的 消息 協 議。固然 Ap ache Thri位 還支持通用的消息格式,如JSON )。
• Transfer/Network Protocol : 傳輸協議層負責管理 RPC 框架所使用的網絡協議、網絡I/O模型 。 例如 Hessian 的傳輸協議基於 Http (應用層協議) : 再例如 Apache Thrift的傳輸協議基於 TCP (傳輸層協議)。傳輸層還須要統一 RPC 客戶端和 RPC 服務端所使用的網絡I/O模型 。
• Processor:存在於 RPC 服務端,因爲服務器端某一個 RPC 接口的實現特性(它並不知道本身是一個將要被 RPC 提供給第三方系統調用的服務)。因此在 RPC 框架中應該有一種「負責執行 RPC 接口實現」的角色。它的職責包括管理RPC接口的註冊、判斷客戶端的請求權限、控制接口實現類的執行在 內的各類工做 。
• IDL :雖然 IDL (接口定義語言)並非 RPC 實現中所必須的。可是須要跨語言的RPC 框架必定會有 IDL 部分的存在。這是由於要找到一個各類語言可以理解的消息結構、接口定義的描述形式 。 若是你的 RPC 實現沒有考慮跨語言性,那麼 IDL 部分就不須要。例如 Java RMI 就是一種專門在 Java 語言間進行使用的特殊的 RPC 框架,它設計之初就沒有要求要有跨語言執行特性,因此 Java RMI 沒有相應的 IDL 。
• 不一樣的 RPC 實現都有必定設計差別。例如生成 Proxy 的方式不同 、 IDL 描述語言的語法不同、服務註冊的管理方式不同、運行服務實現的方式不同 、 採用的消息格式封裝不同、採用的網絡協議不同,等等。框架
3.典型的 RPC 框架介紹
1)Java RMI : Java RPC , Java Serializable, TCP, java
2)GRPC : Google, ProtoBuf, HTTP/2, 衆多語言
3)Thrift :FaceBook, Thrift(私有二進制,LVQ,JSON), TCP, 衆多語言
4)Hetty :Netty/Hessian, 私有二進制, HTTP, 衆多語言
5)WebService: XFire/CXF, XML, HTTP, 衆多語言網絡傳輸協議