RPC框架是啥?

Java貓說發表於2019-04-20

本部落格 貓叔的部落格,轉載請申明出處

在我剛剛瞭解分散式的時候,經常對RPC和分散式有些混淆,甚至一直以為兩者對等,所以我們先看看他們有什麼區別

RPC實現了服務消費呼叫方Client與服務提供實現方Server之間的點對點呼叫流程,即包括了stub、通訊、資料的序列化/反序列化。且Client與Server一般採用直連的呼叫方式。

而分散式服務框架,除了包括RPC的特性,還包括多臺Server提供服務的負載均衡、策略及實現,服務的註冊、釋出與引入,以及服務的高可用策略、服務治理等等。

那麼RPC是什麼呢?

百度百科是這樣表示的:

RPC(Remote Procedure Call)—遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。

它甚至給出了工作原理,這一點很驚喜。

image

  • 1.呼叫客戶端控制程式碼;執行傳送引數
  • 2.呼叫本地系統核心傳送網路訊息
  • 3.訊息傳送到遠端主機
  • 4.伺服器控制程式碼得到訊息並取得引數
  • 5.執行遠端過程
  • 6.執行的過程將結果返回伺服器控制程式碼
  • 7.伺服器控制程式碼返回結果,呼叫遠端系統核心
  • 8.訊息傳回本地主機
  • 9.客戶控制程式碼由核心接收訊息
  • 10.客戶接收控制程式碼返回的資料

我喜歡搜查更多的資訊資料,所以我又找到了知乎上的回答。

image

知乎1.7k的點贊,應該還是可以參考的。

恰如回答提到的,RPC是指遠端過程呼叫,也就是說兩臺伺服器A,B,一個應用部署在A伺服器上,想要呼叫B伺服器上應用提供的函式/方法,由於不在一個記憶體空間,不能直接呼叫,需要通過網路來表達呼叫的語義和傳達呼叫的資料。

至於為什麼使用RPC?答主也提到,無法在一個程式內,甚至一個計算機內通過本地呼叫的方式完成的需求,比如不同系統間的通訊,甚至不同組織間的通訊。

這裡再說一下關於Netty,Netty框架不侷限於RPC,更多的是作為一種網路協議的實現框架,比如HTTP,由於RPC需要高效的網路通訊,就可以選擇Netty作為基礎。除了網路通訊,RPC還需要有高效的序列化框架,以及一種定址方式,如果是帶會話(狀態)的RPC呼叫,還需要有會話的狀態保持的功能。

好了,讓我們再來整理一下,什麼是RPC

RPC(遠端過程呼叫)一般用來實現部署在不同機器上的系統之間的方法呼叫,使得程式能夠像訪問本地系統資源一樣,通過網路傳輸去訪問遠端系統資源。一般來說,RPC框架實現的架構原理都是類似的。

image

可以這樣說,

  • 客戶端呼叫:負責發起RPC呼叫,為呼叫方使用者提供使用API。

  • 服務端響應:主要是服務端業務邏輯實現。

  • 序列化/反序列化:負責對RPC呼叫通過網路傳輸的內容進行序列化與反序列化,不同的RPC框架有不同的實現機制。一般分為文字(XML、JSON)與二進位制(Java原生的、Hessian、protobuf、Thrift、Avro、Kryo、MessagePack),需要注意的是,不同的序列化方式在可讀性、碼流大小、支援的資料型別及效能等方面都存在較大差異,我們可以根據需要自行選擇。

  • Stub:我們看成代理物件,它會遮蔽RPC呼叫過程中的複雜的網路處理邏輯,使其透明簡單,且能夠保持與本地呼叫一樣的程式碼風格。

  • 通訊傳輸:即RPC的底層通訊傳輸模組,一般通過Socket在客戶端與服務端之間傳遞請求與應答訊息

公眾號:Java貓說

學習交流群:728698035

現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程式人生與不定期乾貨。

Image Text

相關文章