手寫RPC框架指北另送貼心註釋代碼一套

Angular8正式發佈了,Java13再過幾個月也要發佈了,技術迭代這麼快,框架的複雜度愈來愈大,可是原理是基本不變的。因此沉下心看清代碼本質很重要,此次給你們帶來的是手寫RPC框架。java

完整代碼以及說明文檔,點我跳躍~git

1. 什麼是RPC?

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

RPC通訊原理

RPC框架有不少,比較知名的如阿里的Dubbo、google的gRPC、Go語言的rpcx、Apache的thrift,新浪的motan等等。固然了,你也能夠說Dubbo是RPC框架的超集,此外對於Spring Cloud來講,RPC也只是它的一個功能模塊。(話說Dubbo已經晉升爲Apache頂級項目了,還不一塊兒動手學習下?)github

Dubbo架構

RPC要解決的兩個問題:json

  1. 解決分佈式系統中,服務之間的調用問題。
  2. 遠程調用時,要可以像本地調用同樣方便,讓調用者感知不到遠程調用的邏輯。

2. 技術選型

  1. SpringBoot

項目的基礎框架,提供IoC功能。同時方便打成JAR包,便於測試。segmentfault

  1. Netty

基於NIO的網絡通訊框架。相比用java socket實現的BIO通訊,Netty不管是代碼編寫簡潔仍是基於NIO異步非阻塞特性,都佔盡了優點。後端

  1. fastjson

序列化、反序列化。RPC框架中通訊選擇有不少:kyro/thift/json/hessian/protobuf/xml等等,爲了快速實現RPC框架,節省生成樁函數的時間成本,因此本文采用了阿里的fastjson。緩存

  1. zookeeper

提供服務的發現與註冊。一個服務會有多個實例,因此咱們選用zookeeper做爲註冊中心,在調用時,從zookeeper獲取服務的實例列表,再從中選擇進行調用。服務器

3. RPC實現流程

消費者端流程:

  1. 代理服務接口
  2. 服務發現(鏈接zookeeper,獲取生產者列表)
  3. 遠程調用(輪詢生產者服務列表),將類名,方法名和參數等信息經過代理髮送給生產者端

生產者端流程:

  1. 加載須要遠程調用的服務,並緩存
  2. 啓動通信服務器(Netty)
  3. 服務註冊(把通訊地址放入zookeeper)
  4. 收到消息後使用反射,本地調用方法並將執行的結果編碼返回給消費者端
在調用鏈路中斷點,就能夠同時瞭解RPC通訊原理和Netty的通訊原理了,代碼每一個方法和類都作了註釋~實踐出真知,看代碼賽過全部博客的文字介紹。

4. 未實現的功能

相比Dubbo這樣成熟的RPC框架還有未實現的功能以下:微信

  1. 負載均衡

如何從多個實例裏挑選一個出來,進行調用,這就要用到負載均衡了。負載均衡的策略確定不僅一種,要怎樣把策略作成可配置的?又要如何實現這些策略?

  1. 結果緩存

每次調用查詢接口時都要真的去Server端查詢嗎?是否是要考慮一下支持緩存?

  1. 多版本控制

服務端接口修改了,舊的接口怎麼辦?

  1. 異步調用

客戶端調用完接口以後,不想等待服務端返回,想去幹點別的事,如何支持?

  1. 優雅停機

服務端要停機了,還沒處理完的請求,如何優雅的處理?

最後,限於筆者經驗水平有限,歡迎讀者就文中的觀點提出寶貴的建議和意見。若是想得到更多的學習資源或者想和更多的是技術愛好者一塊兒交流,能夠關注個人公衆號『全菜工程師小輝』後臺回覆關鍵詞領取學習資料、進入先後端技術交流羣和程序員副業羣。同時也能夠加入程序員副業羣Q羣:735764906 一塊兒交流。

哎呀,若是個人名片丟了。微信搜索「全菜工程師小輝」,依然能夠找到我

相關文章
相關標籤/搜索