聲明:轉載自搜狐-科技-運維前沿
RPC簡介
RPC(Remote Procedure Call,即遠程過程調用)是建立在Socket之上的,在一台機器上運行的主程序,可以調用另一台機器上准備好的子程序,就像LPC(本地過程調用)。也就是說兩台服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。對於RPC架構來說,應用越底層,代碼越復雜、靈活性越高、效率越高;應用越上層,抽象封裝的越好、代碼越簡單、效率越差。
通過RPC,我們可以充分利用非共享內存的多處理器環境(例如通過局域網連接的多台應用服務器),這樣可以簡便地將你的應用分布在多台應用服務器上,應用程序就像運行在一個多處理器的計算機上一樣。我們可以方便的實現過程代碼共享,提高系統資源的利用率,也可以將以大量數值處理的操作放在處理能力較強的系統上運行,從而減輕前端機的負擔。
RPC作為普遍的C/S開發方法,開發效率高效、可靠。但RPC方法的基本原則是:以模塊調用的簡單性忽略通訊的具體細節,以便程序員不用關心C/S之間的通訊協議,集中精力實現應用過程。這就決定了 RPC生成的通訊包不可能對每種應用都有最恰當的處理辦法,與Socket方法相比,傳輸相同的有效數據,RPC占用更多的網絡帶寬。RPC是在Socket的基礎上實現的,它比socket需要更多的網絡和系統資源。
RPC架構的作用
RPC 的主要目標是讓構建分布式計算(應用)更容易、透明,在提供強大的遠程調用能力時不損失本地調用的語義簡潔性。為實現該目標,RPC 框架需提供一種透明調用機制讓使用者不必顯式的區分本地調用和遠程調用。RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式(XML/JSON/二進制)和通信細節。開發人員在使用的時候只需要了解誰在什么位置提供了什么樣的遠程服務接口即可,並不需要關心底層通信細節和調用過程。
1、從通信協議的層面,大致可以分為:
(1)基於HTTP協議的(例如基於文本的SOAP(XML)、REST(JSON)、基於二進制Hessian(Binary));
(2)基於TCP協議的(通常會借助Mina、Netty等高性能網絡框架)。
2、只有二進制數據才能在網絡中傳輸,序列化和反序列化的定義是:
(1)將對象轉換成二進制流的過程叫做序列化;
(2)將二進制流轉換成對象的過程叫做反序列化。
3、 RPC架構分為三部分:
(1)、服務提供者(RPC Server),運行在服務器端,提供服務接口定義與服務實現類。
(2)、服務中心(Registry),運行在服務器端,負責將本地服務發布成遠程服務,管理遠程服務,提供給服務消費者使用。
(3)、服務消費者(RPC Client),運行在客戶端,通過遠程代理對象調用遠程服務。
服務提供者啟動后主動向服務(注冊)中心注冊機器ip、端口以及提供的服務列表; 服務消費者啟動時向服務(注冊)中心獲取服務提供方地址列表,可實現軟負載均衡和Failover。
RPC調用流程
簡單來說一個RPC架構里包含如下4個組件:
1、 客戶端(RPC Client):服務調用方
2、 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數打包成網絡消息,再通過網絡發送給服務方
3、 服務端存根(Server Stub):接受客戶端發送過來的消息並解包,再調用本地服務
4、 服務端(RPC Server):真正的服務提供者。
RPC采用C/S模式,請求程序就是一個客戶端應用,而服務提供者就是一個服務器。首先,服務消費者(RPC客戶端應用)調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務提供方(RPC服務器端),進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,調用服務端方法對調用請求進行計算而得到計算結果,並發送答復信息,然后等待下一個調用信息;最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
一次完整的RPC調用流程如下:
1)、服務消費方(Client)調用以本地調用方式調用服務;
2)、Client stub接收到調用后負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;
3)、Client stub找到服務地址,通過Socket將消息發送到服務端;
4)、Server stub收到消息后進行解碼;
5)、Server stub根據解碼結果調用服務端本地的服務;
6)、本地服務執行並將結果返回給Server stub;
7)、Server stub將返回結果打包成消息;
8)、Server stub通過Socket將消息發送至客戶端;
9)、Client stub接收到消息,並進行解碼;
10)、服務消費方(RPC Client)得到最終的服務調用結果。
RPC框架的目標就是要2~9這些步驟都封裝起來,讓用戶對這些細節透明。
當我們在建立RPC服務以后,客戶端的調用參數通過底層的RPC傳輸通道,可以是UDP,也可以是TCP,並根據傳輸前所提供的目的地址及RPC上層應用程序號轉至相應的RPC應用程序服務端,且此時的客戶端處於等待狀態,直至收到應答或Time Out超時信號。當服務器端獲得請求消息,則會根據注冊RPC時告訴RPC系統的例程入口地址,執行相應的操作,並將結果返回至客戶端。
當一次RPC調用結束后,相應線程發送相應的信號,客戶端程序才會繼續運行。在這個過程中,一個遠程過程是有三個要素來唯一確定的:程序號、版本號和過程號。
程序號是用來區別一組相關的並且具有唯一過程好的遠程過程。一個程序可以有一個或幾個不同的版本,而每個版本的程序都包含一系列能被遠程調用的過程,通過版本的引入,使得不同版本下的RPC能同時提供服務。每個版本都包含有許多可供遠程調用的過程,每個過程則有其唯一標示的過程號。
4
RPC核心技術點和應用構架
1. 核心技術點
(1)、服務提供者需要以某種形式提供服務調用相關的信息,包括但不限於服務接口定義、數據結構、或者中間態的服務定義文件。例如Facebook的 Thrift的IDL文件,Web service的WSDL文件;服務的調用者需要通過一定的場景獲取遠程服務調用相關的信息。
(2)、遠程代理對象:服務調用者用的服務實際是遠程服務的本地代理。說白了就是通過動態代理來實現。
(3)、通信:RPC框架與具體的協議無關。
(4)、序列化:畢竟是遠程通信,需要將對象轉化成二進制流進行傳輸。不同的RPC框架應用的場景不同,在序列化上也會采取不同的技術。
2. 常見RPC技術和框架
(1)、應用級的服務框架:阿里的Dubbo/Dubbox、Google GRPC、Spring Boot/Spring Cloud。
(2)、遠程通信協議:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
(3)、通信框架:MINA和Netty。