從零開始實現簡單 RPC 框架 1:RPC 框架的結構和設計

小新是也發表於2021-08-08

前言

RPC 框架是後端攻城獅永遠都繞不開的知識點,目前業界比較知名有 DubboSpring Cloud 等。很多人都停留在了只會用的階段,作為程式猿,擁有好奇心深入學習,才能有效提高自己的競爭力。再進一層的同學,會去翻原始碼,看功能是如何實現的,這是很好的開始。看原始碼過一段時間容易忘記,我覺得看完原始碼之後,更好的做法是自己動手開發一個出來,這樣你對框架的理解會更深。我認為,"會用"、"會讀原始碼"、"會寫出來"是完全不一樣的水平。
本系列 "造輪子系列之RPC",手把手教大家如何打造自己的RPC框架。
以下是簡單版RPC的原始碼,歡迎 Star、Fork。水平有限,大家有更好的想法可以提出來。
Github:https://github.com/chenchuxin/ccx-rpc
Gitee:https://gitee.com/imccx/ccx-rpc

RPC 框架的結構

一個最簡單的 RPC 框架分成三個部分:註冊中心、服務端、客戶端。以下是一個最簡單的結構流程圖。
RPC框架最簡單的結構
組成部分:

  1. 註冊中心:用於註冊和獲取服務。
  2. 服務端:指提供服務的一方,也叫服務提供方 Provider
  3. 客戶端:指呼叫服務的一方,也叫服務消費者 Consumer

流程:

  1. 服務端把服務資訊註冊到註冊中心,通常包含服務端地址、介面類和方法
  2. 客戶端從註冊中心獲取對應服務的資訊
  3. 客戶端根據服務的資訊,通過網路呼叫到服務端的介面

RPC 框架的設計

上面的流程有很多細節沒有畫出來,例如:

  1. 服務端以什麼形式註冊到註冊中心?
  2. 客戶端是怎麼做到像呼叫介面一樣呼叫服務?
  3. 呼叫服務的網路協議是怎樣的?

一個基本的 RPC 框架,需要包含以下部分:

  1. 註冊中心:註冊中心負責服務資訊的註冊與查詢。服務端在啟動的時候,掃描所有的服務,然後將自己的服務地址和服務名註冊到註冊中心。客戶端在呼叫服務之前,通過註冊中心查詢到服務的地址,就可以通過服務的地址呼叫到服務啦。常見的註冊中心有 ZookeeperEureka 等。
  2. 動態代理:客戶端呼叫介面,需要框架能自己根據介面去遠端呼叫服務,這一步是使用者無感知的。這樣一來,就需要使用到動態代理,使用者呼叫介面,實際上是在呼叫動態生成的代理類。常見的動態代理有:JDK ProxyCGLibJavassist 等。
  3. 網路傳輸:RPC 遠端呼叫實際上就是網路傳輸,所以網路傳輸是 RPC 框架中必不可少的部分。網路框架有 Java NIONetty 框架等。
  4. 自定義協議:網路傳輸需要制定好協議,一個良好的協議能提高傳輸的效率。
  5. 序列化:網路傳輸肯定會涉及到序列化,常見的序列化有JsonProtostuffKyro 等。
  6. 負載均衡:當請求呼叫量大的時候,需要增加服務端的數量,一旦增加,就會涉及到符合選擇服務的問題,這就是負載均衡。常見的負載均衡策略有:輪詢、隨機、加權輪詢、加權隨機、一致性雜湊等等。
  7. 叢集容錯:當請求服務異常的時候,我們是應該直接報錯呢?還是重試?還是請求其他服務?這個就是叢集容錯策略啦。
  8. ....

以上的設計,都將會在接下來的文章中一一詳細介紹其程式碼實現。

相關文章