一比一手寫Dubbo原始碼中的SPI,內附git地址

肥朝發表於2019-04-06

前言

之前對dubbo的SPI進行了四篇的分享.大家對這個概念有了一些初步的瞭解.談到程式設計水平如何進階,大家可能都會異口同聲的說出三個字,看原始碼.但是我卻始終認為,程式設計光,是永遠學不會的.但是很多時候,連怎麼看原始碼都無從下手,你叫我寫仿寫原始碼,這不是開玩笑?

一比一手寫Dubbo原始碼中的SPI,內附git地址

我們可以回憶一下我們在公司是怎麼寫程式碼的.首先產品提出需求,接著開需求評審會,再接著程式碼設計,最後開始編碼.

今天我們就仿造這個流程,自己動手實現dubbo的spi

提出需求

Dubbo和JDK的SPI究竟有何區別? 中,我們已經分析了dubbo中spi和jdk中spi有什麼區別,dubbo相比jdk變化的內容大致如下:

(一) 擴充點增加了快取,提高了效能 (二) 增加了spi的預設值 (三) 增加了通過key的形式獲取擴充點 (四) 增加了IocAOP功能

這裡插句題外話,我們不能為了看原始碼而看原始碼,最重要的是,在看原始碼的過程中,學會分析問題的思路.假如有個新的RPC框架,比如肥朝RPC,我問你肥朝RPC中的SPI和JDK的SPI有幾點區別呢?我在Dubbo和JDK的SPI究竟有何區別?這篇中,就把我是如何分析出這四點的整個心路歷程展示出來,你可以大膽走進我的內心世界.

需求評審

既然是需求評審,其實說白了,就是和產品砍需求.產品提出的需求就是上面那四個功能.(一)(二)(三)都是基本又比較核心的功能,這些砍了那這個版本就沒意思了,(四)這個可以放在下一個版本去迭代開發.

程式碼設計

只要實現了key-value獲取擴充點,那麼獲取預設擴充點就很容易了,因為這個預設擴充點只是key-value的一種特殊形式,他的預設值,也就是這個key,就在SPI註解上.其實思路總起起來就一句話,因為我們在擴充點配置檔案裡面已經配置了實現類的許可權定名.首先我們把這些配置檔案全部載入出來,解析出全限定名,快取起來.然後你要獲取具體的擴充點,我就在快取中把他的許可權定名拿出來,反射例項化成一個物件返回回去.也就是1.讀取並解析檔案內容 2.放入map快取 3.反射生成物件.這三個知識點,我相信看這篇文章的,沒有人不會.

一比一手寫Dubbo原始碼中的SPI,內附git地址

按照上面的分析,把程式碼寫出來不難吧.什麼,寫不出?那往下看

編碼

專案結構如圖:

一比一手寫Dubbo原始碼中的SPI,內附git地址

執行結果如圖

一比一手寫Dubbo原始碼中的SPI,內附git地址

程式碼已經上傳到碼雲.可以下載跑起來,本來想用時序圖,流程圖和大家把思路理一下的,但是弄了幾個小時,我覺得還不如自己看程式碼清楚.核心程式碼程式碼不到300行.有問題可以留言.

地址: gitee.com/HelloToby/t…

小提示

因為之前部分同學反饋對原始碼中的思路還不是很清晰.所以這次我就直接把原始碼中的功能模組抽成一個demo,然後大家先把demo執行起來,接著把demo裡面的程式碼重複寫個一兩遍.因為demo和原始碼一比一高仿的(變數名,方法名甚至if換不換行都儘量一致了).所以這個時候,再去看原始碼就和看自己寫的程式碼應該一樣的.這樣思路就清晰很多了.希望這個方式對你閱讀原始碼有幫助.

寫在最後

肥朝 是一個專注於 原理、原始碼、開發技巧的技術公眾號,號內原創專題式原始碼解析、真實場景原始碼原理實戰(重點)。掃描下面二維碼關注肥朝,讓本該造火箭的你,不再擰螺絲!

一比一手寫Dubbo原始碼中的SPI,內附git地址

相關文章