微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

歡迎關注我的頭條號:Wooola,10年Java軟件開發及架構設計經驗,專注於Java、Go語言、微服務架構,致力於每天分享原創文章、快樂編碼和開源技術。 

什麼是FastDFS

FastDFS是由國人餘慶所開發,是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網站、視頻網站等等。

FastDFS為互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。- 來源百科

SpringCloud集成FastDFS

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

maven依賴

<dependencies>
<dependency>
<groupid>com.github.tobato/<groupid>
<artifactid>fastdfs-client/<artifactid>
<version>1.25.2-RELEASE/<version>
/<dependency>
/<dependencies>

bootstrap.yml配置

fdfs:
soTimeout: 30000
connectTimeout: 20000
thumbImage:
width: 150
height: 150
trackerList:
- 192.168.1.156:22122

定義配置類及客戶端操作類

@Configuration
@Import(FdfsClientConfig.class)
public class FastDFSConfig {
}

定義客戶端操作類:FastDFSClient

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

FastDFSClient提供上傳、下載、刪除、獲取元數據等接口。

文件上傳

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

文件下載

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

獲取組元數據

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

刪除文件

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

接口層Controller

上傳接口接收到前端上傳文件請求並獲取MultipartFile文件對象,通過fdw.uploadFile(file)上傳到 192.168.1.156文件服務器。

MultipartFile file = request.getFile(iter.next());
fdw.uploadFile(file);

如果文件上傳成功,會返回圖片存儲相對路徑。

group1/M00/00/09/CuwAXFvgFLeAZukHAAAPZqRE-Dw477.png

一般文件上傳到fastdfs文件服務器是免密訪問的,如果知道文件路徑可以在瀏覽器直接訪問。

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

示例代碼

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

FastDFS存儲路徑說明

示例

group1/M00/00/09/CuwAXFvgFLeAZukHAAAPZqRE-Dw477.png

參數說明

  • group1表示文件存儲服務器(storage)組ID
  • M00表示存儲路徑(存儲設備)編號
  • 00/09表示兩級目錄分層,其中09表示九月份。storage配置的虛擬路徑,與磁盤選項store_path*對應。如果配置了store_path0則是M00,如果配置了store_path1則是M01,以此類推。
  • CuwAXFvgFLeAZukHAAAPZqRE-Dw477.png表示文件名,不是用戶上傳時文件名,而是由服務器生成hash文件名

FastDFS原理分析

FastDFS部署架構

微服務架構下,SpringCloud集成分佈式文件存儲中間件:FastDFS

來源網絡

FastDFS有兩種角色:trackerstorage

tracker負責文件訪問的跟蹤和負載均衡。storage負責存儲文件,它的功能包括:文件存儲、文件同步、提供文件訪問接口,storage還負責管理文件的元數據,這些數據是以鍵值對的形式表示的,如:width=1024,鍵是“width”,值是“1024”。

所有服務器都是對等的,不存在Master-Slave關係,存儲服務器採用分組方式,同組內存儲服務器上的文件完全相同,不同組的storage server之間不會相互通信。

tracker和storage可以是一個或多個服務器。在tracker或storage的集群中,任何時候都可以從中刪除服務器,對線上服務沒有任何影響。tracker集群中的服務器是點對點的。由storage server主動向tracker server報告狀態信息,tracker server之間通常不會相互通信

卷/組

存儲服務器以 卷/組 形式組織,以獲取高容量。存儲系統包括一個或多個卷,卷與卷之間的文件是相互獨立的。整個存儲系統的總容量等於所有卷的容量之和。一個文件捲包括一個或多個存儲服務器,一個卷中的存儲服務器之間的文件是一樣的。一個文件卷中的服務器會互相備份,且這些服務器之間是負載均衡的。當添加一個存儲服務器到一個卷的時候,卷中的文件會自動複製到新的服務器,複製完以後,系統會把新服務器切換到線上,已提供存儲服務。

當存儲容量不足時,你可以添加一個或多個捲來擴展存儲容量。一個文件的標識包括兩部分:卷名和文件名

總結

目前FastDFS不支持可視化管理界面維護,同時用戶在把文件上傳的服務器時,原來的文件名變成了FastDFS自創的hash文件名,所以如果有需要,可以在業務層表設計存儲源文件名與hash名的對應關係。


分享到:


相關文章: