- IPC和RPC?
RPC
而RPC(Remote Procedure Call),又叫做遠程過程調用。它本身并不是一個具體的協議,而是一種調用方式。
gRPC 是 Google 最近公布的開源軟件,基于最新的 HTTP2.0 協議,并支持常見的眾多編程語言。
HTTP2.0 是基于二進制的 HTTP 協議升級版本,目前各大瀏覽器都在快馬加鞭的加以支持。
這個 RPC 框架是基于 HTTP 協議實現的,底層使用到了 Netty 框架的支持。
Dubbo 是阿里集團開源的一個極為出名的 RPC 框架,在很多互聯網公司和企業應用中廣泛使用。協議和序列化框架都可以插拔是及其鮮明的特色。
同樣的遠程接口是基于 Java Interface,并且依托于 Spring 框架方便開發。可以方便的打包成單一文件,獨立進程運行,和現在的微服務概念一致。
Thrift 是 Facebook 的一個開源項目,主要是一個跨語言的服務開發框架。它有一個代碼生成器來對它所定義的 IDL 定義文件自動生成服務代碼框架。
用戶只要在其之前進行二次開發就行,對于底層的 RPC 通訊等都是透明的。不過這個對于用戶來說的話需要學習特定領域語言這個特性,還是有一定成本的。
什么是RPC
RPC【Remote Procedure Call】是指遠程過程調用,是一種進程間通信方式,他是一種技術的思想,而不是規范
。它允許程序調用另一個地址空間(通常是共享網絡的另一臺機器上)的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即程序員無論是調用本地的還是遠程的函數,本質上編寫的調用代碼基本相同。
也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由于不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。為什么要用RPC呢?就是無法在一個進程內,甚至一個計算機內通過本地調用的方式完成的需求,比如不同的系統間的通訊,甚至不同的組織間的通訊,由于計算能力需要橫向擴展,需要在多臺機器組成的集群上部署應用。RPC就是要像調用本地的函數一樣去調遠程函數;
推薦閱讀文章:https://www.jianshu.com/p/2accc2840a1b
RPC基本原理
stub可以理解為存根
- **客戶端存根,**存放服務端的地址消息,再將客戶端的請求參數打包成網絡消息,然后通過網絡遠程發送給服務方。
- 服務端存根,接收客戶端發送過來的消息,將消息解包,并調用本地的方法。
一般包括客戶端、服務器端、服務注冊中心
**◎客戶端存根:**用于存放服務器端的地址信息,將客戶端的請求參數等信息打包成網絡消息,再通過網絡傳輸發送給服務器端。
**◎服務器端存根:**接收客戶端發送過來的請求消息并解包,然后調用本地服務處理。
存根之間通過網絡傳輸
同步調用和異步調用
這個過程有點類似于 Java 中的 Callable 和 Runnable 接口,我們進行異步執行的時候,如果需要知道執行的結果,就可以使用 Callable 接口,并且可以通過 Future 類獲取到異步執行的結果信息。并提前寫上對結果的操作邏輯。
如果不關心執行的結果,直接使用 Runnable 接口就可以了,因為它不返回結果,當然啦,Callable 也是可以的,我們不去獲取 Future 就可以了。
步驟解析:
RPC兩個核心模塊:通訊,序列化。
RPC主要基于TCP/IP
IDL:接口描述語言
調用方法=方法名+參數+返回值
RPC 框架的好處就顯示出來了,首先就是長鏈接,不必每次通信都要像 HTTP 一樣去 3 次握手什么的,減少了網絡開銷。
其次就是 RPC 框架一般都有注冊中心,有豐富的監控管理;發布、下線接口、動態擴展等,對調用方來說是無感知、統一化的操作。
gRPC
gRPC 是 Google 最近公布的開源軟件,基于最新的 HTTP2.0 協議,并支持常見的眾多編程語言。底層使用到了 Netty 框架的支持。
服務端:
監聽端口,注冊服務,啟動服務器
客戶端:
調用函數,傳參數,接收返回值
客戶端只有接口,用動態代理的方式實例化接口,在invoke方法中獲取方法名等信息發給服務端
proto文件(IDL)
框架:
自定義RPC協議
header+body
RPC IO 優化
任何服務都是類似的,大量請求過來時,得用線程池、異步、協程等各種手段優化,提高并發,從而提高吞吐,減小延遲。
有的 RPC 框架能解決這些問題,比如有些 RPC 框架內置協程模型,支持 M 比 N 模型、協程竊取等等。如果 RPC 框架不管,就需要用額外的線程池庫、異步庫(promise、future)、協程庫來手動控制請求的執行流并發執行。