Angular8正式發佈了,Java13再過幾個月也要發佈了,技術迭代這麼快,框架的複雜度愈來愈大,可是原理是基本不變的。因此沉下心看清代碼本質很重要,此次給你們帶來的是手寫RPC框架。java
完整代碼以及說明文檔,點我跳躍~git
RPC是指遠程過程調用,也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,因爲不在一個內存空間,不能直接調用,須要經過網絡來表達調用的語義和傳達調用的數據。程序員
RPC框架有不少,比較知名的如阿里的Dubbo、google的gRPC、Go語言的rpcx、Apache的thrift,新浪的motan等等。固然了,你也能夠說Dubbo是RPC框架的超集,此外對於Spring Cloud來講,RPC也只是它的一個功能模塊。(話說Dubbo已經晉升爲Apache頂級項目了,還不一塊兒動手學習下?)github
RPC要解決的兩個問題:json
項目的基礎框架,提供IoC功能。同時方便打成JAR包,便於測試。segmentfault
基於NIO的網絡通訊框架。相比用java socket實現的BIO通訊,Netty不管是代碼編寫簡潔仍是基於NIO異步非阻塞特性,都佔盡了優點。後端
序列化、反序列化。RPC框架中通訊選擇有不少:kyro/thift/json/hessian/protobuf/xml等等,爲了快速實現RPC框架,節省生成樁函數的時間成本,因此本文采用了阿里的fastjson。緩存
提供服務的發現與註冊。一個服務會有多個實例,因此咱們選用zookeeper做爲註冊中心,在調用時,從zookeeper獲取服務的實例列表,再從中選擇進行調用。服務器
在調用鏈路中斷點,就能夠同時瞭解RPC通訊原理和Netty的通訊原理了,代碼每一個方法和類都作了註釋~實踐出真知,看代碼賽過全部博客的文字介紹。
相比Dubbo這樣成熟的RPC框架還有未實現的功能以下:微信
如何從多個實例裏挑選一個出來,進行調用,這就要用到負載均衡了。負載均衡的策略確定不僅一種,要怎樣把策略作成可配置的?又要如何實現這些策略?
每次調用查詢接口時都要真的去Server端查詢嗎?是否是要考慮一下支持緩存?
服務端接口修改了,舊的接口怎麼辦?
客戶端調用完接口以後,不想等待服務端返回,想去幹點別的事,如何支持?
服務端要停機了,還沒處理完的請求,如何優雅的處理?
最後,限於筆者經驗水平有限,歡迎讀者就文中的觀點提出寶貴的建議和意見。若是想得到更多的學習資源或者想和更多的是技術愛好者一塊兒交流,能夠關注個人公衆號『全菜工程師小輝』後臺回覆關鍵詞領取學習資料、進入先後端技術交流羣和程序員副業羣。同時也能夠加入程序員副業羣Q羣:735764906 一塊兒交流。