guide-rpc-framework 是一個 一款基于 Netty+Kyro+Zookeeper 實現(xiàn)的自定義 RPC 框架。目前已經(jīng)開源,地址:https://github.com/Snailclimb/guide-rpc-framework (覺得不錯再 Star!),歡迎小伙伴們指導(dǎo)建議! 如果 guide-rpc-framework 有任何需要改進和完善的地方,歡迎提交 PR/ISSUE ,和我一起完善!?( ′???` )比心 前言雖說 RPC 的原理實際不難,但是,自己在實現(xiàn)的過程中自己也遇到了很多問題。guide-rpc-framework 目前只實現(xiàn)了 RPC 框架最基本的功能,一些可優(yōu)化點都在下面提到了,有興趣的小伙伴可以自行完善。 通過這個簡易的輪子,你可以學(xué)到 RPC 的底層原理和原理以及各種 Java 編碼實踐的運用。 你甚至可以把 guide-rpc-framework 當(dāng)做你的畢設(shè)/項目經(jīng)驗的選擇,這是非常不錯!對比其他求職者的項目經(jīng)驗都是各種系統(tǒng),造輪子肯定是更加能贏得面試官的青睞。 如果你要將 guide-rpc-framework 當(dāng)做你的畢設(shè)/項目經(jīng)驗的話,我希望你一定要搞懂,而不是直接復(fù)制粘貼我的思想。你可以 fork 我的項目,然后進行優(yōu)化。如果你覺得的優(yōu)化是有價值的話,你可以提交 PR 給我,我會盡快處理。 介紹guide-rpc-framework 是一款基于 Netty+Kyro+Zookeeper 實現(xiàn)的 RPC 框架。代碼注釋詳細,結(jié)構(gòu)清晰,并且集成了 Check Style 規(guī)范代碼結(jié)構(gòu),非常適合閱讀和學(xué)習(xí)。 由于 Guide哥自身精力和能力有限,如果大家覺得有需要改進和完善的地方的話,歡迎 fork 本項目,然后 clone 到本地,在本地修改后提交 PR 給我,我會在第一時間 Review 你的代碼。 我們先從一個基本的 RPC 框架設(shè)計思路說起! 一個基本的 RPC 框架設(shè)計思路
一個最簡單的 RPC 框架使用示意圖如下圖所示,這也是 guide-rpc-framework 目前的架構(gòu) : 服務(wù)提供端 Server 向注冊中心注冊服務(wù),服務(wù)消費者 Client 通過注冊中心拿到服務(wù)相關(guān)信息,然后再通過網(wǎng)絡(luò)請求服務(wù)提供端 Server。 作為 RPC 框架領(lǐng)域的佼佼者Dubbo的架構(gòu)如下圖所示,和我們上面畫的大體也是差不多的。 一般情況下, RPC 框架不僅要提供服務(wù)發(fā)現(xiàn)功能,還要提供負載均衡、容錯等功能,這樣的 RPC 框架才算真正合格的。 簡單說一下設(shè)計一個最基本的 RPC 框架的思路:
項目基本情況和可優(yōu)化點為了循序漸進,最初的是時候,我是基于傳統(tǒng)的 BIO 的方式 Socket 進行網(wǎng)絡(luò)傳輸,然后利用 JDK 自帶的序列化機制 來實現(xiàn)這個 RPC 框架的。后面,我對原始版本進行了優(yōu)化,已完成的優(yōu)化點和可以完成的優(yōu)化點我都列在了下面 ??。 為什么要把可優(yōu)化點列出來? 主要是想給那些希望優(yōu)化這個 RPC 框架的小伙伴一點思路。歡迎大家 fork 本倉庫,然后自己進行優(yōu)化。 項目模塊概覽運行項目導(dǎo)入項目fork 項目到自己的倉庫,然后克隆項目到自己的本地: 初始化 git hooks這一步主要是為了在 commit 代碼之前,跑 Check Style,保證代碼格式?jīng)]問題,如果有問題的話就不能提交。
執(zhí)行下面這些命令: ? guide-rpc-framework git:(master) ? chmod +x ./init.sh
CheckStyle 插件下載和配置IntelliJ IDEA-> Preferences->Plugins->搜索下載 CheckStyle 插件,然后按照如下方式進行配置。 配置完成之后,按照如下方式使用這個插件! 下載運行 zookeeper這里使用 Docker 來下載安裝。 下載:
運行: docker run -d --name zookeeper -p 2181:2181 zookeeper:3.5.8 使用服務(wù)提供端實現(xiàn)接口:
發(fā)布服務(wù)(使用 Netty 進行傳輸): /** 服務(wù)消費端
相關(guān)問題為什么要造這個輪子?Dubbo 不香么?寫這個 RPC 框架主要是為了通過造輪子的方式來學(xué)習(xí),檢驗自己對于自己所掌握的知識的運用。 實現(xiàn)一個簡單的 RPC 框架實際是比較容易的,不過,相比于手寫 AOP 和 IoC 還是要難一點點,前提是你搞懂了 RPC 的基本原理。 我之前從理論層面在我的知識星球分享過如何實現(xiàn)一個 RPC。不過理論層面的東西只是支撐,你看懂了理論可能只能糊弄住面試官。咱程序員這一行還是最需要動手能力,即使你是架構(gòu)師級別的人物。當(dāng)你動手去實踐某個東西,將理論付諸實踐的時候,你就會發(fā)現(xiàn)有很多坑等著你。 大家在實際項目上還是要盡量少造輪子,有優(yōu)秀的框架之后盡量就去用,Dubbo 在各個方面做的都比較好和完善。 如果我要自己寫的話,需要提前了解哪些知識Java :
Netty :
Zookeeper :
教程Guide 的星球已經(jīng)更新完了《從零開始手把手教你實現(xiàn)一個簡單的 RPC 框架》。 公眾號“JavaGuide”后回復(fù) “星球”即可獲取星球?qū)賰?yōu)惠券。 另外,加不加入純屬個人意愿,而且這個教程也沒講什么,你單看我寫的代碼應(yīng)該也可以搞懂。目前,星球已經(jīng)運營大半年多了,里面也沉淀了一些內(nèi)容,后面會提高入場價格。運營一個比較好的知識交流社區(qū)是我 2020 一直嘗試做好的事情。目前來看,我覺得做的還算可以,不過還有很多提高的余地(回答問題、活躍度以及精華主題數(shù)都是在所有星球里面非??壳暗模?/span> 收費主要是為了提高準(zhǔn)入門檻,也算是對自己付出勞動的認(rèn)可。說實話,知識星球的那點收益對我來說是無足輕重的(星球抽了20%,拿到手還要扣稅一波,哈哈哈)。 最后文章有幫助可以點個「在看」或「分享」,都是支持,我都喜歡! 我是 Guide 哥,Java后端開發(fā),會一點前端知識,喜歡烹飪,自由的少年。一個三觀比主角還正的技術(shù)人。我們下期再見! |
|