1. 程式人生 > >手寫RPC框架指北另送貼心註釋程式碼一套

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

Angular8正式釋出了,Java13再過幾個月也要釋出了,技術迭代這麼快,框架的複雜度越來越大,但是原理是基本不變的。所以沉下心看清程式碼本質很重要,這次給大家帶來的是手寫RPC框架。

完整程式碼以及說明文件,點我跳躍~

1. 什麼是RPC?

RPC是指遠端過程呼叫,也就是說兩臺伺服器A,B,一個應用部署在A伺服器上,想要呼叫B伺服器上應用提供的函式/方法,由於不在一個記憶體空間,不能直接呼叫,需要通過網路來表達呼叫的語義和傳達呼叫的資料。

RPC框架有很多,比較知名的如阿里的Dubbo、google的gRPC、Go語言的rpcx、Apache的thrift,新浪的motan等等。當然了,你也可以說Dubbo是RPC框架的超集,此外對於Spring Cloud來說,RPC也只是它的一個功能模組。(話說Dubbo已經晉升為Apache頂級專案了,還不一起動手學習下?)

RPC要解決的兩個問題:

  1. 解決分散式系統中,服務之間的呼叫問題。
  2. 遠端呼叫時,要能夠像本地呼叫一樣方便,讓呼叫者感知不到遠端呼叫的邏輯。

2. 技術選型

  1. SpringBoot
    專案的基礎框架,提供IoC功能。同時方便打成JAR包,便於測試。

  2. Netty
    基於NIO的網路通訊框架。相比用java socket實現的BIO通訊,Netty無論是程式碼編寫簡潔還是基於NIO非同步非阻塞特性,都佔盡了優勢。

  3. fastjson
    序列化、反序列化。RPC框架中通訊選擇有很多:kyro/thift/json/hessian/protobuf/xml等等,為了快速實現RPC框架,節省生成樁函式的時間成本,所以本文采用了阿里的fastjson。

  4. zookeeper
    提供服務的發現與註冊。一個服務會有多個例項,所以我們選用zookeeper作為註冊中心,在呼叫時,從zookeeper獲取服務的例項列表,再從中選擇進行呼叫。

3. RPC實現流程

消費者端流程:

  1. 代理服務介面
  2. 服務發現(連線zookeeper,獲取生產者列表)
  3. 遠端呼叫(輪詢生產者服務列表),將類名,方法名和引數等資訊通過代理髮送給生產者端

生產者端流程:

  1. 載入需要遠端呼叫的服務,並快取
  2. 啟動通訊伺服器(Netty)
  3. 服務註冊(把通訊地址放入zookeeper)
  4. 收到訊息後使用反射,本地呼叫方法並將執行的結果編碼返回給消費者端

在呼叫鏈路中斷點,就可以同時瞭解RPC通訊原理和Netty的通訊原理了,程式碼每個方法和類都做了註釋~實踐出真知,看程式碼勝過所有部落格的文字介紹。

4. 未實現的功能

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

  1. 負載均衡
    如何從多個例項裡挑選一個出來,進行呼叫,這就要用到負載均衡了。負載均衡的策略肯定不只一種,要怎樣把策略做成可配置的?又要如何實現這些策略?
  2. 結果快取
    每次呼叫查詢介面時都要真的去Server端查詢嗎?是不是要考慮一下支援快取?
  3. 多版本控制
    服務端介面修改了,舊的介面怎麼辦?
  4. 非同步呼叫
    客戶端呼叫完介面之後,不想等待服務端返回,想去幹點別的事,如何支援?
  5. 優雅停機
    服務端要停機了,還沒處理完的請求,如何優雅的處理?

最後,限於筆者經驗水平有限,歡迎讀者就文中的觀點提出寶貴的建議和意見。如果想獲得更多的學習資源或者想和更多的是技術愛好者一起交流,可以關注我的公眾號『全菜工程師小輝』後臺回覆關鍵詞領取學習資料、進入前後端技術交流群和程式設計師副業群。同時也可以加入程式設計師副業群Q群:735764906 一起交流。