首先說下關於RPC的幾個常見問題
什麼是RPC
PRC:Remote Procedure Call 遠端過程呼叫 在分散式系統中,每個節點之間的通訊都是靠RPC來完成 RPC是分散式應用的基本元件
常見的RPC框架
Apache的Thrift Google的gprc 阿里巴巴的dubbo等 dubbo應該是3這中最簡單易用的了,但dubbo只支援Java語言,thrift和gprc都是支援跨語言的,並且dubbo內部幫你實現了對分散式註冊中心zookeeper的使用,另外兩個仍需自己實現對註冊中心的操作。 thrift grpc等之所以支援跨語言,是因為他們自己定義了一套結構化資料儲存格式,如Google的protobuf,用於編解碼物件,作為各個語言通訊的中間協議。
RPC和HTTP請求有什麼區別
RPC是一個概念,普通web開發的curl rest介面,也可以算作一種基於HTTP協議的RPC呼叫 RPC的使用比起curl一個重要的點就是忽略底層細節,像使用本地服務一樣呼叫遠端服務 我們將在RPC框架中使用動態代理來實現這個要求
本系列部落格由淺到深,帶大家打造一個支援跨語言,也支援zookeeper的RPC框架 目前先用Java實現
實現思路
- RPC有兩個使用方 一個是本地呼叫端 一個是遠端實現端
- 呼叫端使用動態代理 代理我們需要遠端排程的介面 實現忽略底層細節 像使用本地服務一樣使用呼叫遠端服務
- 將我們本地呼叫的介面方法資訊(形參,方法名,返回型別等)通過網路傳送至遠端實現端
- 遠端實現端接收到相應資訊,反射呼叫物件的實現類
- 執行完實現類後把返回值發回給呼叫端
- 呼叫端接收到返回值,代理返回結果 遠端呼叫完畢
實現細節
- 使用Netty作為Java端網路傳輸框架
- 為儘量支援跨語言 傳輸資料編解碼使用json格式(本來想用protobuf 但它只支援強型別Int這種 不支援編解碼Object這樣的弱型別 會降低使用的靈活性)
下一篇部落格中 將帶大家用11個Java類 實現一個基於spring的Java RPC框架 暫時不使用一些常見設計模式,暫時不做zookeeper的支援和異常處理等細節問題
後續版本再對這個demo進行優化,並支援zookeeper 專案最終的程式碼放在了我的github上 MeiZhuoRPC 歡迎star,提issues