SpringBoot 2.0 開發案例之整合FastDFS分佈式文件系統

前言

最近在做一款圖牀服務,前面的文章也有提到,之前整合了阿里雲 OSS 做圖片存儲,雖然小批量的存儲並不貴,然而再少也是肉,還是有點心疼的。

恰好,雙十一搞活動,順手購買了騰訊雲的 2C4G3MB的雲服務器,不得不說真香!入手六百多,真香,畢竟是3MB的帶寬。

不要問我雙十一爲嘛不買阿里雲,因爲我等老用戶狗都不如,只有續費和滿多少減幾塊的所謂福利了。

簡介

FastDFS是用c語言編寫的一款開源的分佈式文件系統,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合中小文件(建議範圍: 4KB < file_size <500MB),對以文件爲載體的在線服務,如相冊網站、視頻網站等。

架構

SpringBoot 2.0 開發案例之整合FastDFS分佈式文件系統
軟件

SpringBoot2.0,不說了都懂
Nginx,提供HTTP服務
Docker,一件安裝容器,後面的就都不需要了
FastDFS,C語言編寫的一款開源的分佈式文件系統
libfastcommon,包含了FastDFS運行所需要的一些基礎庫
Fastdfs-nginx-module,Nginx結合 fastdfs-nginx-module插件去實現http協議
安裝

如果一步步安裝 FastDFS以及其依賴,極其複雜,有可能你搗鼓一上午不一定能配置好!這裏建議大家使用 Docker一鍵安裝,只需要把存儲目錄映射出來即可。

docker run --name fastdfs --privileged=true --net=host \ -e IP=192.168.1.156 -e WEB_PORT=8080 \ -v /home/fastdfs:/var/local/fdfs \ -d --restart=always \ registry.cn-beijing.aliyuncs.com/itstyle/fastdfs:1.0
安裝成功以後,會在 /home/fastdfs 目錄下生成兩個目錄文件夾, tracker 和 storage。

這裏需要注意幾點:

一定要映射宿機存儲文件路徑
IP一定要配置爲內網或者公網地址
網絡類型一定要設置爲 host 類型
安裝完成以後,瀏覽器訪問: http://ip:8080 如果顯示 Nginx歡迎頁說明安裝配置成功。

整合

接下來我們就要與 SpringBoot整合了, pom.xml引入第三方工具類:

com.github.tobato fastdfs-client 1.26.6
在 application.properties 引入配置:

===================================# 分佈式文件系統FDFS配置# ===================================# 連接超時時間fdfs.connect-timeout=600# 讀取超時時間fdfs.so-timeout=1500# 縮略圖的寬高fdfs.thumb-image.height=150fdfs.thumb-image.width=150# tracker服務配置地址列表,替換成自己服務的IP地址,支持多個fdfs.tracker-list=192.168.1.15:22122fdfs.pool.jmx-enabled=false

最後寫個工具類,基本搞定,坐等上傳:

@Componentpublic class FastdfsUtils { public static final String DEFAULT_CHARSET = “UTF-8”;
@Autowired private FastFileStorageClient fastFileStorageClient;
/** * 上傳 * @param file * @return * @throws IOException / public StorePath upload(MultipartFile file) throws IOException { // 設置文件信息 Set mataData = new HashSet<>(); mataData.add(new MetaData(“author”, “fastdfs”)); mataData.add(new MetaData(“description”,file.getOriginalFilename())); // 上傳 StorePath storePath = fastFileStorageClient.uploadFile( file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null); return storePath; }
/
* * 刪除 * @param path / public void delete(String path) { fastFileStorageClient.deleteFile(path); }
/
* * 刪除 * @param group * @param path / public void delete(String group,String path) { fastFileStorageClient.deleteFile(group,path); }
/
* * 文件下載 * @param path 文件路徑,例如:/group1/path=M00/00/00/itstyle.png * @param filename 下載的文件命名 * @return */ public void download(String path, String filename, HttpServletResponse response) throws IOException { // 獲取文件 StorePath storePath = StorePath.parseFromUrl(path); if (StringUtils.isBlank(filename)) { filename = FilenameUtils.getName(storePath.getPath()); } byte[] bytes = fastFileStorageClient.downloadFile(storePath.getGroup(), storePath.getPath(), new DownloadByteArray()); response.reset(); response.setContentType(“applicatoin/octet-stream”); response.setHeader(“Content-Disposition”, “attachment;filename=” + URLEncoder.encode(filename, “UTF-8”)); ServletOutputStream out = response.getOutputStream(); out.write(bytes); out.close(); }}
圖牀預覽

SpringBoot 2.0 開發案例之整合FastDFS分佈式文件系統
SpringBoot 2.0 開發案例之整合FastDFS分佈式文件系統
注意事項

生產環境中建議集羣使用,搭建高可靠的雲存儲服務。
如果是本地開發,雲服務器需要開放 8080、22122 端口,生產環境不建議開啓,所有的請求最好走內網。
最後,大家如果覺得本文不錯就給點個關注吧~! “點關注,不迷路”,每天帶你分享不一樣的java編程資訊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章