搭建FastDFS分布式文件方式一(Docker版本)
生活随笔
收集整理的這篇文章主要介紹了
搭建FastDFS分布式文件方式一(Docker版本)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
FastDFS是一個開源的分布式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網站、視頻網站等等。FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要做調度工作,在訪問上起負載均衡的作用。
1、拉取 FastDFS 鏡像
docker pull morunchang/fastdfs2、啟動容器
1)、運行跟蹤器 Tracker
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh2)、運行存儲節點 Storage
docker run -d --name storage --net=host -e TRACKER_IP=192.168.37.137:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh- 使用的網絡模式是–net=host, 192.168.37.137是宿主機的IP
- group1是組名,即storage的組
- 如果想要增加新的storage服務器,再次運行該命令,注意更換 新組名
- 如果想要掛載到本機目錄,就在命令里面添加-v /data/fastdfs/storage:/data/fast_data
3、需要配置訪問代理 Nginx
因為在 FastDFS 鏡像中有自帶的 Nginx 服務器,所以我們只需要進入容器配置下 Nginx 服務器即可,注意我們需要進入的是存儲節點 Storage,具體的 Shell 命令如下:
docker exec -it storage /bin/bash vi /etc/nginx/conf/nginx.conf // 配置一個訪問規則 location ~ /M00 {root /data/fast_data/data;ngx_fastdfs_module; } // 在 nginx.conf 中配置禁止使用緩存 add_header Cache-Control no-store; // 需要重新啟動容器 docker restart storage搭建好之后,存儲的文件的路徑大概是 http://192.168.37.137:8080/group1/M00/00/00/rBUABl-CwNuAeRPyAAFwqWytcEA860.png 這個樣子,端口 8080 實際上是 Storage 中的 Nginx 服務器的監聽端口,如果需要改,去修改該配置文件即可。
文末彩蛋
提供后端配置 FastDFS 的工具類和配置
1、引入 POM 依賴
<dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId><version>1.27.0.0</version> </dependency>2、配置文件 fdfs_client.conf
connect_timeout=60 network_timeout=60 charset=UTF-8 http.tracker_http_port=8080 tracker_server=192.168.48.132:221223、自定義 FastDFS 文件類
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;/*** @author qiukangming* @version 1.0* @description* @since 2020/11/23 22:18*/@Data @AllArgsConstructor @NoArgsConstructor public class FastDFSFile implements Serializable {//文件名字private String name;//文件內容private byte[] content;//文件擴展名private String ext;//文件MD5摘要值private String md5;//文件創建作者private String author; }4、自定義 FastDFS 文件操作工具類
import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; import org.csource.fastdfs.FileInfo; import org.csource.fastdfs.ServerInfo; import org.csource.fastdfs.StorageClient; import org.csource.fastdfs.StorageServer; import org.csource.fastdfs.TrackerClient; import org.csource.fastdfs.TrackerServer; import org.springframework.core.io.ClassPathResource; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream;/*** @author qiukangming* @version 1.0* @description FastDFS服務器操作類* @since 2020/11/24 11:24*/public class FastDFSClient {/** 初始化tracker信息*/static {try {//獲取tracker的配置文件fdfs_client.conf的位置String filePath = new ClassPathResource("fdfs_client.conf").getPath();//加載tracker配置信息ClientGlobal.init(filePath);} catch (Exception e) {e.printStackTrace();}}/***** 文件上傳* * @param file : 要上傳的文件信息封裝->FastDFSFile* @return String[]* 1:文件上傳所存儲的組名* 2:文件存儲路徑*/public static String[] upload(FastDFSFile file) {//獲取文件作者NameValuePair[] meta_list = new NameValuePair[1];meta_list[0] = new NameValuePair(file.getAuthor());/** 文件上傳后的返回值* uploadResults[0]:文件上傳所存儲的組名,例如:group1* uploadResults[1]:文件存儲路徑,例如:M00/00/00/wKjThF0DBzaAP23MAAXz2mMp9oM26.jpeg*/String[] uploadResults = null;try {//獲取StorageClient對象StorageClient storageClient = getStorageClient();//執行文件上傳uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);} catch (Exception e) {e.printStackTrace();}return uploadResults;}/**** 獲取文件信息* * @param groupName:組名* @param remoteFileName:文件存儲完整名*/public static FileInfo getFile(String groupName, String remoteFileName) {try {//獲取StorageClient對象StorageClient storageClient = getStorageClient();//獲取文件信息return storageClient.get_file_info(groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}return null;}/**** 文件下載* * @param groupName:組名* @param remoteFileName:文件存儲完整名* @return InputStream*/public static InputStream downFile(String groupName, String remoteFileName) {try {//獲取StorageClientStorageClient storageClient = getStorageClient();//通過StorageClient下載文件byte[] fileByte = storageClient.download_file(groupName, remoteFileName);//將字節數組轉換成字節輸入流return new ByteArrayInputStream(fileByte);} catch (Exception e) {e.printStackTrace();}return null;}/**** 文件刪除實現* * @param groupName:組名* @param remoteFileName:文件存儲完整名*/public static void deleteFile(String groupName,String remoteFileName) {try {//獲取StorageClientStorageClient storageClient = getStorageClient();//通過StorageClient刪除文件storageClient.delete_file(groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}}/**** 獲取組信息* * @param groupName :組名*/public static StorageServer getStorages(String groupName) {try {//創建TrackerClient對象TrackerClient trackerClient = new TrackerClient();//通過TrackerClient獲取TrackerServer對象TrackerServer trackerServer = trackerClient.getConnection();//通過trackerClient獲取Storage組信息return trackerClient.getStoreStorage(trackerServer, groupName);} catch (Exception e) {e.printStackTrace();}return null;}/**** 根據文件組名和文件存儲路徑獲取Storage服務的IP、端口信息* * @param groupName :組名* @param remoteFileName :文件存儲完整名*/public static ServerInfo[] getServerInfo(String groupName, String remoteFileName) {try {//創建TrackerClient對象TrackerClient trackerClient = new TrackerClient();//通過TrackerClient獲取TrackerServer對象TrackerServer trackerServer = trackerClient.getConnection();//獲取服務信息return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}return null;}/*** 獲取Tracker服務地址*/public static String getTrackerUrl() {try {//創建TrackerClient對象TrackerClient trackerClient = new TrackerClient();//通過TrackerClient獲取TrackerServer對象TrackerServer trackerServer = trackerClient.getConnection();//獲取Tracker地址return "http://" + trackerServer.getInetSocketAddress().getHostString() + ":" + ClientGlobal.getG_tracker_http_port();} catch (IOException e) {e.printStackTrace();}return null;}/*** 獲取TrackerServer*/public static TrackerServer getTrackerServer() throws Exception {//創建TrackerClient對象TrackerClient trackerClient = new TrackerClient();//通過TrackerClient獲取TrackerServer對象return trackerClient.getConnection();}/*** 獲取StorageClient* * @return StorageClient* @throws Exception e*/public static StorageClient getStorageClient() throws Exception {//獲取TrackerServerTrackerServer trackerServer = getTrackerServer();//通過TrackerServer創建StorageClientreturn new StorageClient(trackerServer, null);} }5、文件上傳接口
import com.qkm.common.utils.Result; import com.qkm.common.utils.StatusCode; import com.qkm.file.dfs.FastDFSFile; import com.qkm.file.utils.FastDFSClient; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile;/*** @author qiukangming* @version 1.0* @description* @since 2020/11/24 11:18*/ @RestController @CrossOrigin @RequestMapping("/file") public class FileController {@PostMapping("/upload")public Result<Object> upload(@RequestParam("file") MultipartFile multipartFile) throws Exception {FastDFSFile fastDFSFile = new FastDFSFile(multipartFile.getOriginalFilename(),multipartFile.getBytes(), StringUtils.getFilenameExtension(multipartFile.getOriginalFilename()), null, null);//文件上傳String[] uploads = FastDFSClient.upload(fastDFSFile);//組裝文件上傳地址String url = FastDFSClient.getTrackerUrl()+"/"+uploads[0]+"/"+ uploads[1];return new Result<>(true, StatusCode.OK, "文件上傳成功", url);}}總結
以上是生活随笔為你收集整理的搭建FastDFS分布式文件方式一(Docker版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 基础学习(Markdown语法
- 下一篇: MyCat学习:使用MySQL搭建主从复