RPC原理

1.什麼是RPC?java

遠程過程調用協議RPC(Remote Procedure Call Protocol)服務器

首先了解什麼叫RPC,爲何要RPC,RPC是指遠程過程調用,也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,因爲不在一個內存空間,不能直接調用,須要經過網絡來表達調用的語義和傳達調用的數據。網絡

2.RPC調用過程是什麼?數據結構

  • 1)服務消費方(client)調用以本地調用方式調用服務;
  • 2)client stub接收到調用後負責將方法、參數等組裝成可以進行網絡傳輸的消息體;
  • 3)client stub找到服務地址,並將消息發送到服務端;
  • 4)server stub收到消息後進行解碼;
  • 5)server stub根據解碼結果調用本地的服務;
  • 6)本地服務執行並將結果返回給server stub;
  • 7)server stub將返回結果打包成消息併發送至消費方;
  • 8)client stub接收到消息,並進行解碼;
  • 9)服務消費方獲得最終結果。

3.怎麼作到透明化遠程服務調用併發

代理!怎麼封裝通訊細節才能讓用戶像以本地調用方式調用遠程服務呢?對java來講就是使用代理!java代理有兩種方式:1) jdk 動態代理;2)字節碼生成。儘管字節碼生成方式實現的代理更爲強大和高效,但代碼不易維護,大部分公司實現RPC框架時仍是選擇動態代理方式。負載均衡

4.怎麼對消息進行編碼和解碼框架

4.1肯定消息的數據結構異步

請求消息結構:①接口名稱②方法名③參數類型&參數值④超時時間⑤requestID(異步請求時,依靠此id才能將return綁定到對應請求線程上)函數

服務器返回的消息結構:①返回值②狀態code③requestID編碼

4.2序列化和反序列化

5.通訊

消息數據結構被序列化爲二進制流後,下一步就要進行網絡通訊,目前有兩種通訊模型,BIO和NIO。通常rpc框架都須要支持這兩種通訊模型。

(基於netty實現io通訊框架,好比阿里巴巴的HSF、dubbo,Twitter的finagle)

6.如何發佈本身的服務

如何讓別人使用咱們的服務呢?有同窗說很簡單嘛,告訴使用者服務的IP以及端口就能夠了啊。確實是這樣,這裏問題的關鍵在因而自動告知仍是人肉告知。

人肉告知的方式:若是你發現你的服務一臺機器不夠,要再添加一臺,這個時候就要告訴調用者我如今有兩個ip了,大家要輪詢調用來實現負載均衡;調用者咬咬牙改了,結果某天一臺機器掛了,調用者發現服務有一半不可用,他又只能手動修改代碼來刪除掛掉那臺機器的ip。現實生產環境固然不會使用人肉方式。

有沒有一種方法能實現自動告知,即機器的增添、剔除對調用方透明,調用者再也不須要寫死服務提供方地址?固然能夠,現現在zookeeper被普遍用於實現服務自動註冊與發現功能!

簡單來說,zookeeper能夠充當一個服務註冊表(Service Registry),讓多個服務提供者造成一個集羣,讓服務消費者經過服務註冊表獲取具體的服務訪問地址(ip+端口)去訪問具體的服務提供者。

zookeeper和eruke的對比:https://blog.csdn.net/u010963948/article/details/71730165

 

參考:https://blog.csdn.net/u013521220/article/details/70157956

相關文章
相關標籤/搜索