FastDFS分布式文件系統及源碼解析


記錄一次本人學習FastDFS-分布式文件系統的學習過程,希望能幫助到有需要的人.

首選得對此技術有個大概的了解,可以參考 https://www.cnblogs.com/centos2017/p/7896761.html ,其實大致看下圖知道一下就行了.

然后我們就直接開裝了,網上有一大堆的安裝教程這里也就不做介紹了,可以直接百度,如果有需要可以直接用我的百度網盤的

鏈接:https://pan.baidu.com/s/1Y07hC2tiDy_E18ZAD4YKvg
提取碼:j5d0

裝完測通以后就開始擼JAVA代碼,經過我一番研究發現了一位大佬,封裝了一個工具jar包十分好用,maven里引入

<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.5</version>
</dependency>
具體的demo已經介紹可以參考 https://github.com/MarsNumberOne/FastDFS-Demo
引入了大佬jar包后用起來十分爽

 

 只要改一下

trackerList的地址換成自己的就行了
然后調具體的api即可使用
我發現十分方便都沒有做bean的配置就可以用了,研究了一番發現如下:

 

 
        

 

接下來我就開始看改jar包的源碼了,我們可以直接在IDE里下載,下載后源碼可以看到中文注釋,十分的爽

 

 
        

首先可以看一下,包結構以及各個類的繼承關系,這里推薦使用IDE看,對着類名按Ctrl+h就可以看到該類的上下結構 或者使用Ctrl+Alt+Shift+U可以看到更詳細的關系層次圖.


開始一步步分析源碼,客戶端API接口為FastFileStorageClient,該類是一個接口,最終的實現類為DefaultFastFileStorageClient
下面我們來分析一下這個類,該類實現了接口FastFileStorageClient,FastFileStorageClient包含了一寫上傳下載文件等API,該接口繼承了
GenerateStorageClient說明這是在根接口上擴展一些APi接口.
FastFileStorageClient繼承了類DefaultGenerateStorageClient,該類是基本存儲客戶端操作實現,也就是說基礎的存儲功能用這個類就行了,下面我們來分析一下這個類.
就找一個uploadFile()方法來說一下,其它的也是換湯不換葯的,理解整體思路就行了.

 

 
        

 看到首先從trackClient這個類里取獲取trackServer幫我們根據其自身算法幫我們計算出的存儲節點信息.Debug發現,其實調用的是 DefaultTrackerClient

 

 

 

然后從TrackerConnectionManager這個類中去執行對應的命令,作者把執行的操作用command做接口,各個操作就是最終command的實現類,這樣程序的擴展性維護性就會很高咯,這里new Command對象就是把自定義的request和response包裝一下即可(因為不同的command中的request和response不一樣,所以就需要放到不同的類,不然用AbstractFdfsCommand這個公共類就行了)

 

 

接着進入execute方法了,哦豁一看,執行交易,啥交易,py的那種嗎,嘿嘿皮一下

 

首先該方法是獲取連接,先找到yml里的trackServer地址,trackerLocator.getTrackerAddress(); trackerLocator這個類也是一層套一層,大家可以自己去看一下

 

 

用了@PostConstruct注解,SpringBoot啟動時候就會去執行一層一層的構造函數

獲取到連接(該鏈接還用連接池,作者自己寫的一個連接池FdfsConnectionPool,每次獲取連接的時候就池子里獲取就行了)和地址以后就可以可以去執行具體操作了,最終會定位再AbstractFdfsCommand這個抽象類上去執行execute,與其說是抽象類,倒不如說是一個公共command執行類,所以繼承該抽象類的execute方法都在它這里

 

 我們終於快看到頭,send和receive這兩個方法才是最底層的操作,send顧名思義就是發送,把command里的一些請求信息會發送給StorageServer(StorageServer的地址是被trackServer找到的,也就是我們客戶端只需要trackServer的地址就行了,它會負責幫我們去找負責存儲StorageServer的地址,然后幫助我們之間與其通訊,建立Socket通訊),好了,我們已經把請求發送給fastDFS服務端,接着它會告訴我們哪個存儲節點我們可以去用,也就是receive方法中獲得這些信息,最終一層層的返回給上級,接着我們就可以把文件變成Byte數組,還是之前的套路,最終到send和receive方法,send的時候會把文件寫入到存儲的文件節點上,最后receive方法可以返回路徑信息等(這里就有一個疑問,為什么不用netty這種nio,不是好一點嗎???有沒有大佬能告訴我)

一套基本的文件上傳就完成了,api接口大致都是封裝成具體的command,然后獲取連接,執行方法command,最終就是send和receive方法.

好了,大致的分析,比較通俗,也是自己的一些看法見解,如果有不對的地方,還請指正,工具包我在csdn上購買的,花了1塊5呢 ,送給你們了!!!哈哈哈

 

 

 
        


 
 
 
        
 
 
        
 
        
 
        
 
        

 

 
        

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM