前言
RPC 框架是後端攻城獅永遠都繞不開的知識點,目前業界比較知名有 Dubbo
、Spring Cloud
等。很多人都停留在了只會用的階段,作為程式猿,擁有好奇心深入學習,才能有效提高自己的競爭力。再進一層的同學,會去翻原始碼,看功能是如何實現的,這是很好的開始。看原始碼過一段時間容易忘記,我覺得看完原始碼之後,更好的做法是自己動手開發一個出來,這樣你對框架的理解會更深。我認為,"會用"、"會讀原始碼"、"會寫出來"是完全不一樣的水平。
本系列 "造輪子系列之RPC",手把手教大家如何打造自己的RPC框架。
以下是簡單版RPC的原始碼,歡迎 Star、Fork。水平有限,大家有更好的想法可以提出來。
Github:https://github.com/chenchuxin/ccx-rpc
Gitee:https://gitee.com/imccx/ccx-rpc
RPC 框架的結構
一個最簡單的 RPC 框架分成三個部分:註冊中心、服務端、客戶端。以下是一個最簡單的結構流程圖。
組成部分:
- 註冊中心:用於註冊和獲取服務。
- 服務端:指提供服務的一方,也叫服務提供方
Provider
- 客戶端:指呼叫服務的一方,也叫服務消費者
Consumer
流程:
- 服務端把服務資訊註冊到註冊中心,通常包含服務端地址、介面類和方法
- 客戶端從註冊中心獲取對應服務的資訊
- 客戶端根據服務的資訊,通過網路呼叫到服務端的介面
RPC 框架的設計
上面的流程有很多細節沒有畫出來,例如:
- 服務端以什麼形式註冊到註冊中心?
- 客戶端是怎麼做到像呼叫介面一樣呼叫服務?
- 呼叫服務的網路協議是怎樣的?
一個基本的 RPC 框架,需要包含以下部分:
- 註冊中心:註冊中心負責服務資訊的註冊與查詢。服務端在啟動的時候,掃描所有的服務,然後將自己的服務地址和服務名註冊到註冊中心。客戶端在呼叫服務之前,通過註冊中心查詢到服務的地址,就可以通過服務的地址呼叫到服務啦。常見的註冊中心有
Zookeeper
、Eureka
等。 - 動態代理:客戶端呼叫介面,需要框架能自己根據介面去遠端呼叫服務,這一步是使用者無感知的。這樣一來,就需要使用到動態代理,使用者呼叫介面,實際上是在呼叫動態生成的代理類。常見的動態代理有:
JDK Proxy
,CGLib
,Javassist
等。 - 網路傳輸:RPC 遠端呼叫實際上就是網路傳輸,所以網路傳輸是 RPC 框架中必不可少的部分。網路框架有
Java NIO
、Netty
框架等。 - 自定義協議:網路傳輸需要制定好協議,一個良好的協議能提高傳輸的效率。
- 序列化:網路傳輸肯定會涉及到序列化,常見的序列化有
Json
、Protostuff
、Kyro
等。 - 負載均衡:當請求呼叫量大的時候,需要增加服務端的數量,一旦增加,就會涉及到符合選擇服務的問題,這就是負載均衡。常見的負載均衡策略有:輪詢、隨機、加權輪詢、加權隨機、一致性雜湊等等。
- 叢集容錯:當請求服務異常的時候,我們是應該直接報錯呢?還是重試?還是請求其他服務?這個就是叢集容錯策略啦。
- ....
以上的設計,都將會在接下來的文章中一一詳細介紹其程式碼實現。