1. 程式人生 > >rpc http區別

rpc http區別

要想弄清楚rpc與http,首先得了解一下OSI的七層網路結構模型

OSI網路結構的七層模型

各層的具體描述如下:

  第七層:應用層     定義了用於在網路中進行通訊和資料傳輸的介面 - 使用者程式;提供標準服務,比如虛擬終端、檔案以及任務的傳輸 和處理; 
  第六層:表示層     掩蓋不同系統間的資料格式的不同性; 指定獨立結構的資料傳輸格式; 資料的編碼和解碼;加密和解密;壓縮和 解壓縮 
  第五層:會話層     管理使用者會話和對話; 控制使用者間邏輯連線的建立和結束通話;報告上一層發生的錯誤 
  第四層:傳輸層     管理網路中端到端的資訊傳送; 通過錯誤糾正和流控制機制提供可靠且有序的資料包傳送; 提供面向無連線的數 據包的傳送; 
  第三層:網路層     定義網路裝置間如何傳輸資料; 根據唯一的網路裝置地址路由資料包;提供流和擁塞控制以防止網路資源的損耗 
  第二層:資料鏈路層 定義操作通訊連線的程式; 封裝資料包為資料幀; 監測和糾正資料包傳輸錯誤 
  第一層:物理層      定義通過網路裝置傳送資料的物理方式; 作為網路媒介和裝置間的介面;定義光學、電氣以及機械特性。

在上述7層中,http協議是應用層協議。HTTP協議是超文字傳送協議(HyperText Transfer Protocol)的縮寫,它是全球資訊網(World Wide Web,www,也簡稱為Web)的基礎。HTTP協議設計之初就是為了實現Web的想法。HTTP協議位於TCP/IP協議棧的應用層。基於HTTP協議的客戶/伺服器模式的資訊交換過程,分四個過程:建立連線、傳送請求資訊、傳送響應資訊、關閉連線。

下面是RPC的官方說明:

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

RPC架構

一個完整的RPC架構裡面包含了四個核心的元件,分別是Client ,Server,Client Stub以及Server Stub,這個Stub大家可以理解為存根。分別說說這幾個元件:

  • 客戶端(Client),服務的呼叫方。
  • 服務端(Server),真正的服務提供者。
  • 客戶端存根,存放服務端的地址訊息,再將客戶端的請求引數打包成網路訊息,然後通過網路遠端傳送給服務方。
  • 服務端存根,接收客戶端傳送過來的訊息,將訊息解包,並呼叫本地的方法

 

 

RPC採用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。首先,呼叫程序傳送一個有程序引數的呼叫資訊到服務程序,然後等待應答資訊。在伺服器端,程序保持睡眠狀態直到呼叫資訊的到達為止。當一個呼叫資訊到達,伺服器獲得程序引數,計算結果,傳送答覆資訊,然後等待下一個呼叫資訊,最後,客戶端呼叫過程接收答覆資訊,獲得程序結果,然後呼叫執行繼續進行。
RPC資訊協議由兩個不同結構組成:呼叫資訊和答覆資訊。

 

 

流行的RPC框架

目前流行的開源RPC框架還是比較多的。下面重點介紹三種:

  1. gRPC是Google最近公佈的開源軟體,基於最新的HTTP2.0協議,並支援常見的眾多程式語言。 我們知道HTTP2.0是基於二進位制的HTTP協議升級版本,目前各大瀏覽器都在快馬加鞭的加以支援。 這個RPC框架是基於HTTP協議實現的,底層使用到了Netty框架的支援。
  2. Thrift是Facebook的一個開源專案,主要是一個跨語言的服務開發框架。它有一個程式碼生成器來對它所定義的IDL定義檔案自動生成服務程式碼框架。使用者只要在其之前進行二次開發就行,對於底層的RPC通訊等都是透明的。不過這個對於使用者來說的話需要學習特定領域語言這個特性,還是有一定成本的。
  3. Dubbo是阿里集團開源的一個極為出名的RPC框架,在很多網際網路公司和企業應用中廣泛使用。協議和序列化框架都可以插拔是及其鮮明的特色。同樣 的遠端介面是基於Java Interface,並且依託於spring框架方便開發。可以方便的打包成單一檔案,獨立程序執行,和現在的微服務概念一致。

 

下面是rpc與socket的對比

RPC和Socket的區別

http://blog.163.com/fanning_7213/blog/static/249650520113124540501/

RPC是建立在Socket之上的,出於一種類比的願望,在一臺機器上執行的主程式,可以呼叫另一臺機器上準備好的子程式,就像LPC(本地過程呼叫).

    越底層,程式碼越複雜、靈活性越高、效率越高;越上層,抽象封裝的越好、程式碼越簡單、效率越差。Socket和RPC的區別再次說明了這點。

不論是程式設計師在編寫基於C/S(客戶端伺服器)的程式時,還是網路工程師在處理RPC問題時,他們問的最多的就是RPC和Socket有什麼區別和聯絡? 
   RPC是建立在Socket之上的,出於一種類比的願望,在一臺機器上執行的主程式,可以呼叫另一臺機器上準備好的子程式,就像 LPC(本地過程呼叫).RPC帶來了開發C/S程式的簡單可靠的手段,它通過一種叫XDR的資料表達方法描述資料,程式設計師書寫虛擬碼,然後由 rpcgen程式翻譯為真正的可編譯的C語言原始碼,再編譯成真正的Client端和Server端程式。 
  RPC作為普遍的C/S開發方 法,開發效率高效,可靠.但RPC方法的基本原則是--以模組呼叫的簡單性忽略通訊的具體細節,以便程式設計師不用關心C/S之間的通訊協議,集中精力對付實 現過程.這就決定了 RPC生成的通訊包不可能對每種應用都有最恰當的處理辦法,與Socket方法相比,傳輸相同的有效資料,RPC佔用更多的網路頻寬. 
  RPC是在Socket的基礎上實現的,它比socket需要更多的網路和系統資源.另外,在對程式優化時,程式設計師雖然可以直接修改由rpcgen產生的令人費解的源程式,但對於追求程式設計高效率的RPC而言,獲得的簡單性則被大大削弱. 
RPC與是Socket的類比

 

參考:https://www.cnblogs.com/leenuxqt/p/3202527.html

https://blog.csdn.net/wangyunpeng0319/article/details/78651998