手寫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要解決的兩個問題:
- 解決分散式系統中,服務之間的呼叫問題。
- 遠端呼叫時,要能夠像本地呼叫一樣方便,讓呼叫者感知不到遠端呼叫的邏輯。
2. 技術選型
SpringBoot
專案的基礎框架,提供IoC功能。同時方便打成JAR包,便於測試。Netty
基於NIO的網路通訊框架。相比用java socket實現的BIO通訊,Netty無論是程式碼編寫簡潔還是基於NIO非同步非阻塞特性,都佔盡了優勢。fastjson
序列化、反序列化。RPC框架中通訊選擇有很多:kyro/thift/json/hessian/protobuf/xml等等,為了快速實現RPC框架,節省生成樁函式的時間成本,所以本文采用了阿里的fastjson。zookeeper
提供服務的發現與註冊。一個服務會有多個例項,所以我們選用zookeeper作為註冊中心,在呼叫時,從zookeeper獲取服務的例項列表,再從中選擇進行呼叫。
3. RPC實現流程
消費者端流程:
- 代理服務介面
- 服務發現(連線zookeeper,獲取生產者列表)
- 遠端呼叫(輪詢生產者服務列表),將類名,方法名和引數等資訊通過代理髮送給生產者端
生產者端流程:
- 載入需要遠端呼叫的服務,並快取
- 啟動通訊伺服器(Netty)
- 服務註冊(把通訊地址放入zookeeper)
- 收到訊息後使用反射,本地呼叫方法並將執行的結果編碼返回給消費者端
在呼叫鏈路中斷點,就可以同時瞭解RPC通訊原理和Netty的通訊原理了,程式碼每個方法和類都做了註釋~實踐出真知,看程式碼勝過所有部落格的文字介紹。
4. 未實現的功能
相比Dubbo這樣成熟的RPC框架還有未實現的功能如下:
- 負載均衡
如何從多個例項裡挑選一個出來,進行呼叫,這就要用到負載均衡了。負載均衡的策略肯定不只一種,要怎樣把策略做成可配置的?又要如何實現這些策略? - 結果快取
每次呼叫查詢介面時都要真的去Server端查詢嗎?是不是要考慮一下支援快取? - 多版本控制
服務端介面修改了,舊的介面怎麼辦? - 非同步呼叫
客戶端呼叫完介面之後,不想等待服務端返回,想去幹點別的事,如何支援? - 優雅停機
服務端要停機了,還沒處理完的請求,如何優雅的處理?
最後,限於筆者經驗水平有限,歡迎讀者就文中的觀點提出寶貴的建議和意見。如果想獲得更多的學習資源或者想和更多的是技術愛好者一起交流,可以關注我的公眾號『全菜工程師小輝』後臺回覆關鍵詞領取學習資料、進入前後端技術交流群和程式設計師副業群。同時也可以加入程式設計師副業群Q群:735764906 一起交流。