1.RPC的概念
遠程過程調用(RPC)是一個協議,程序可以使用這個協議請求網絡中另一臺計算機上某程序的服務而不需知道網絡細節,
RPC是指遠程過程調用,也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。
3.RPC的模型
- C/S模式
- 基於傳輸層協議 (例如 TCP/IP)
- 事件處理模型 (請求、計算、響應)
4.RPC設計的目的
- 調用非本機的方法
- 不同語言程序之間通信
- 不瞭解底層通信,像本地方法一樣調用
例:spring的RPC框架在調用遠程方法時就像調用一個普通的bean
5.RPC的作用
- 分佈式程序的基礎 (分佈式操作系統,分佈式計算,分佈式軟件設計)
- 垂直應用服務化拆分
6.實現RPC要面對的問題(A可以理解爲dubbo中的消費者。)
比如說,一個方法可能是這樣定義的:
Employee getEmployeeByName(String fullName)
那麼:
- 首先,要解決通訊的問題,主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接裏傳輸。連接可以是按需連接,調用結束後就斷掉,也可以是長連接,多個遠程過程調用共享同一個連接。
- 第二,要解決尋址的問題,也就是說,A服務器上的應用怎麼告訴底層的RPC框架,如何連接到B服務器(如主機或IP地址)以及特定的端口,方法的名稱是什麼,這樣才能完成調用。比如基於Web服務協議棧的RPC,就要提供一個endpoint URI,或者是從UDDI服務上查找。如果是RMI調用的話,還需要一個RMI Registry來註冊服務的地址。
- 第三,當A服務器上的應用發起遠程過程調用時,方法的參數需要通過底層的網絡協議如TCP傳遞到B服務器,由於網絡協議是基於二進制的,內存中的參數的值要序列化成二進制的形式,也就是序列化(Serialize),通過尋址和傳輸將序列化的二進制發送給B服務器。
- 第四,B服務器收到請求後,需要對參數進行反序列化(序列化的逆操作),恢復爲內存中的表達方式,然後找到對應的方法(尋址的一部分)進行本地調用,然後得到返回值。
- 第五,返回值還要發送回服務器A上的應用,也要經過序列化的方式發送,服務器A接到後,再反序列化,恢復爲內存中的表達方式,交給A服務器上的應用
7.RPC程序的組成結構
RPC的大致工作原理:
分爲1.服務的提供者(生產者),
2.服務的調用者(生產者)
3.服務的提供者和調用者,都要用到的接口
4.RPC框架
服務的提供者實現接口中的方法,服務的調用者引用同一個接口,
1).服務的調用者會把要調用的接口和方法,還有參數,傳遞給RPC框架,
2).RPC框架會通過動態代理(調用服務的提供者) 調用服務的提供者(即接口的真正實現者),將產生的結果發送給服務的調用方
3).注:服務的提供方要和RPC框架在同一個容器中,因爲只有這樣在RPC框架中,才能通過要調用方法的完整路徑,通過反射機制找到服務的提供方(即接口的真正實現類)