本博客 貓叔的博客,轉載請申明出處git
在我剛剛瞭解分佈式的時候,常常對RPC和分佈式有些混淆,甚至一直覺得二者對等,因此咱們先看看他們有什麼區別
?github
RPC實現了服務消費調用方Client與服務提供實現方Server之間的點對點調用流程
,即包括了stub、通訊、數據的序列化/反序列化。且Client與Server通常採用直連
的調用方式。服務器
而分佈式服務框架,除了包括RPC的特性
,還包括多臺Server提供服務的負載均衡、策略及實現,服務的註冊、發佈與引入,以及服務的高可用策略、服務治理等等。網絡
那麼RPC是什麼呢?架構
百度百科是這樣表示的:負載均衡
RPC(Remote Procedure Call)—遠程過程調用
,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。框架
它甚至給出了工做原理
,這一點很驚喜。分佈式
我喜歡搜查更多的信息資料,因此我又找到了知乎
上的回答。函數
知乎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在客戶端與服務端之間傳遞請求與應答消息
。
學習交流羣:728698035
現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程序人生與不按期乾貨。