之前對dubbo的spi
進行了四篇的分享.大家對這個概念有了一些初步的了解.談到程式設計水平如何高階,大家可能都會異口同聲的說出三個字,看原始碼
.但是我卻始終認為,程式設計光看
,是永遠學不會的.關鍵還是要多動手.但是很多時候,連怎麼看原始碼都無從下手,你叫我寫仿寫原始碼,這不是開玩笑?
我們可以回憶一下我們在公司是怎麼寫**的.首先產品提出需求,接著開需求評審會,再接著**設計,最後開始編碼.
今天我們就仿造這個流程,自己動手實現dubbo的spi
在 dubbo原始碼解析-spi(二) 中,我們已經分析了dubbo中spi和jdk中spi有什麼區別,dubbo相比jdk變化的內容大致如下:
(一) 拓展點增加了快取,提高了效能
(二) 增加了spi
的預設值
(三) 增加了通過key
的形式獲取拓展點
(四) 增加了ioc
和aop
功能
這裡插句題外話,我們不能為了看原始碼而看原始碼,最重要的是,在看原始碼的過程中,學會分析問題的思路.假如有個新的rpc框架,比如肥朝rpc,我問你肥朝rpc中的spi和jdk的spi有幾點區別呢?我在dubbo原始碼解析-spi(二)
這篇中,就把我是如何分析出這四點的整個心路歷程展示出來,你可以大膽走進我的內心世界.
既然是需求評審,其實說白了,就是和產品砍需求.產品提出的需求就是上面那四個功能.(一)(二)(三)都是基本又比較核心的功能,這些砍了那這個版本就沒意思了,(四)這個可以放在下乙個版本去迭代開發.
只要實現了key-value
獲取拓展點,那麼獲取預設拓展點就很容易了,因為這個預設拓展點只是key-value
的一種特殊形式,他的預設值,也就是這個key
,就在spi
註解上.其實思路總起起來就一句話,因為我們在拓展點配置檔案裡面已經配置了實現類的許可權定名.首先我們把這些配置檔案全部載入出來,解析出全限定名,快取起來.然後你要獲取具體的拓展點,我就在快取中把他的許可權定名拿出來,反射例項化成乙個物件返回回去.也就是1.讀取並解析檔案內容 2.放入map快取 3.反射生成物件.這三個知識點,我相信看這篇文章的,沒有人不會.
按照上面的分析,把**寫出來不難吧.什麼,寫不出?那往下看
專案結構如圖:
執行結果如圖
因為之前部分同學反饋對原始碼中的思路還不是很清晰.所以這次我就直接把原始碼中的功能模組抽成乙個demo,然後大家先把demo執行起來,接著把demo裡面的**重複寫個一兩遍.因為demo和原始碼一比一高仿的(變數名,方法名甚至if換不換行都盡量一致了).所以這個時候,再去看原始碼就和看自己寫的**應該一樣的.這樣思路就清晰很多了.希望這個方式對你閱讀原始碼有幫助.
這個是停更兩個月後,回歸的第一篇文章.由於公司的某些原因,接下來可能無法像去年一樣,每週一更.但是盡量保證,兩周一更.但是即使兩周一更,也會每週不斷學習提公升自己,給大家帶來更好的分享.但是鑑於肥朝才疏學淺,文中不足之處還望你不吝斧正.
Dubbo原始碼解析之SPI
dubbo版本 2.5.4 dubbo在服務發布過程中缺省會載入自適應的協議擴充套件,在類serviceconfig中存在以下初始化 下面以此進行spi過程分析。private static final protocol protocol extensionloader.getextensionlo...
dubbo原始碼解析 spi 4
aop是老生常談的話題了,思想都不會是一蹴而就的.比如架構設計從all in one到soa也是乙個逐步演進的過程,所以本篇也講講這個aop的思想演進過程.假如我們就以aop最常用的場景事務來說,我們最初的做法是怎麼樣的?public class employeeserviceimpl implem...
Dubbo原始碼分析之SPI(二)
本篇文章是dubbo spi原始碼分析的第二篇,接著第一篇繼續分析dubbo spi的內容,我們主要介紹 getdefaultextension 獲取預設擴充套件點方法。由於此方法比較簡單,我們略過示例部分,直接分析原始碼。獲取預設擴充套件方法getdefaultextension 是乙個publi...