本部落格 貓叔的部落格,轉載請申明出處
在我剛剛瞭解分散式的時候,經常對RPC和分散式有些混淆,甚至一直以為兩者對等,所以我們先看看他們有什麼區別
?
RPC實現了服務消費呼叫方Client與服務提供實現方Server之間的點對點呼叫流程
,即包括了stub、通訊、資料的序列化/反序列化。且Client與Server一般採用直連
的呼叫方式。
而分散式服務框架,除了包括RPC的特性
,還包括多臺Server提供服務的負載均衡、策略及實現,服務的註冊、釋出與引入,以及服務的高可用策略、服務治理等等。
那麼RPC是什麼呢?
百度百科是這樣表示的:
RPC(Remote Procedure Call)—遠端過程呼叫
,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。
它甚至給出了工作原理
,這一點很驚喜。
- 1.呼叫客戶端控制程式碼;執行傳送引數
- 2.呼叫本地系統核心傳送網路訊息
- 3.訊息傳送到遠端主機
- 4.伺服器控制程式碼得到訊息並取得引數
- 5.執行遠端過程
- 6.執行的過程將結果返回伺服器控制程式碼
- 7.伺服器控制程式碼返回結果,呼叫遠端系統核心
- 8.訊息傳回本地主機
- 9.客戶控制程式碼由核心接收訊息
- 10.客戶接收控制程式碼返回的資料
我喜歡搜查更多的資訊資料,所以我又找到了知乎
上的回答。
知乎1.7k
的點贊,應該還是可以參考的。
恰如回答提到的,RPC是指遠端過程呼叫,也就是說兩臺伺服器A,B,一個應用部署在A伺服器上,想要呼叫B伺服器上應用提供的函式/方法,由於不在一個記憶體空間,不能直接呼叫,需要通過網路來表達呼叫的語義和傳達呼叫的資料。
至於為什麼使用RPC
?答主也提到,無法在一個程式內,甚至一個計算機內通過本地呼叫的方式完成的需求,比如不同系統間的通訊,甚至不同組織間的通訊。
這裡再說一下關於Netty,Netty框架不侷限於RPC,更多的是作為一種網路協議的實現框架
,比如HTTP,由於RPC需要高效的網路通訊,就可以選擇Netty作為基礎。除了網路通訊,RPC還需要有高效的序列化框架,以及一種定址方式,如果是帶會話(狀態)的RPC呼叫,還需要有會話的狀態保持的功能。
好了,讓我們再來整理一下,什麼是RPC
?
RPC(遠端過程呼叫)一般用來實現
部署在不同機器上的系統之間的方法呼叫
,使得程式能夠像訪問本地系統資源一樣,通過網路傳輸
去訪問遠端系統資源。一般來說,RPC框架實現的架構原理
都是類似的。
可以這樣說,
-
客戶端呼叫:負責發起RPC呼叫,為呼叫方使用者提供使用API。
-
服務端響應:主要是服務端業務邏輯實現。
-
序列化/反序列化:負責對RPC呼叫通過
網路傳輸的內容進行序列化與反序列化
,不同的RPC框架有不同的實現機制。一般分為文字(XML、JSON)與二進位制(Java原生的、Hessian、protobuf、Thrift、Avro、Kryo、MessagePack)
,需要注意的是,不同的序列化方式在可讀性、碼流大小、支援的資料型別及效能等方面都存在較大差異,我們可以根據需要自行選擇。 -
Stub:我們看成代理物件,它會遮蔽RPC呼叫過程中的複雜的
網路處理邏輯
,使其透明簡單,且能夠保持與本地呼叫一樣的程式碼風格。 -
通訊傳輸:即RPC的底層通訊傳輸模組,一般通過Socket在客戶端與服務端之間
傳遞請求與應答訊息
。
公眾號:Java貓說
學習交流群:728698035
現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程式人生與不定期乾貨。