RPC框架原理及從零實現系列文章(一):思路篇

首先說下關於RPC的幾個常見問題git

什麼是RPC

PRC:Remote Procedure Call 遠程過程調用 在分佈式系統中,每一個節點之間的通訊都是靠RPC來完成 RPC是分佈式應用的基本組件github

常見的RPC框架

Apache的Thrift Google的gprc 阿里巴巴的dubbo等 dubbo應該是3這中最簡單易用的了,但dubbo只支持Java語言,thrift和gprc都是支持跨語言的,而且dubbo內部幫你實現了對分佈式註冊中心zookeeper的使用,另外兩個仍需本身實現對註冊中心的操做。 thrift grpc等之因此支持跨語言,是由於他們本身定義了一套結構化數據存儲格式,如Google的protobuf,用於編解碼對象,做爲各個語言通訊的中間協議。web

RPC和HTTP請求有什麼區別

RPC是一個概念,普通web開發的curl rest接口,也能夠算做一種基於HTTP協議的RPC調用 RPC的使用比起curl一個重要的點就是忽略底層細節,像使用本地服務同樣調用遠程服務 咱們將在RPC框架中使用動態代理來實現這個要求spring


本系列博客由淺到深,帶你們打造一個支持跨語言,也支持zookeeper的RPC框架 目前先用Java實現json

實現思路

  • RPC有兩個使用方 一個是本地調用端 一個是遠程實現端
  • 調用端使用動態代理 代理咱們須要遠程調度的接口 實現忽略底層細節 像使用本地服務同樣使用調用遠程服務
  • 將咱們本地調用的接口方法信息(形參,方法名,返回類型等)經過網絡發送至遠程實現端
  • 遠程實現端接收到相應信息,反射調用對象的實現類
  • 執行完實現類後把返回值發回給調用端
  • 調用端接收到返回值,代理返回結果 遠程調用完畢

實現細節

  • 使用Netty做爲Java端網絡傳輸框架
  • 爲儘可能支持跨語言 傳輸數據編解碼使用json格式(原本想用protobuf 但它只支持強類型Int這種 不支持編解碼Object這樣的弱類型 會下降使用的靈活性)

下一篇博客中 將帶你們用11個Java類 實現一個基於spring的Java RPC框架 暫時不使用一些常見設計模式,暫時不作zookeeper的支持和異常處理等細節問題設計模式

後續版本再對這個demo進行優化,並支持zookeeper 項目最終的代碼放在了個人github上 MeiZhuoRPC 歡迎star,提issues網絡

相關文章
相關標籤/搜索