1、简述
FastDFS 是一个高性能的分布式文件系统,主要用于处理海量数据的存储需求,尤其在处理图片、视频等大文件时表现优秀。FastDFS 具有很高的效率和灵活性,广泛应用于图片存储和文件管理系统。本文将介绍如何在 Docker 上部署 FastDFS,并提供 Java 示例代码来集成 FastDFS 客户端。
2、什么是 FastDFS?
FastDFS 是一个开源的分布式文件系统,它的设计目标是解决海量文件存储、文件上传下载的效率问题。FastDFS 由两个主要的组件组成:
- Tracker 服务器:用于管理文件上传和下载请求,以及对存储服务器的管理。
- Storage 服务器:用于存储实际的文件数据,并提供文件的读取和写入功能。
FastDFS 支持水平扩展,可以根据需要增加多个存储服务器以提升性能和可用性。
3、 部署 FastDFS
通过 Docker 部署 FastDFS 是一种简单且高效的方式,它能够帮助我们快速搭建环境并进行测试。
3.1 拉取 FastDFS 镜像
我们可以使用官方的 FastDFS Docker 镜像或者社区镜像。下面是使用 Docker Hub 上的社区镜像的步骤:
docker pull delron/fastdfs
3.2 启动 Tracker 服务
Tracker 是 FastDFS 的调度节点,用于管理和跟踪 Storage 节点。运行以下命令启动 Tracker 服务:
docker run -d --name fastdfs-tracker \
--restart=always \
--network=host \
-p 22122:22122 \
delron/fastdfs tracker
3.3 启动 Storage 服务
Storage 是文件存储节点,负责实际的文件存储和访问。运行以下命令启动 Storage 服务,并链接到 Tracker:
#创建映射路径
mkdir -p /data/fastdfs/storage
docker run -d --name fastdfs-storage \
--link fastdfs-tracker:tracker \
--restart=always \
--network=host \
-e TRACKER_SERVER=tracker:22122 \
-v /data/fastdfs/storage:/var/fdfs \
-p 23000:23000 -p 8080:8080 -p 8888:8888 \
delron/fastdfs storage
3.4 对外端口
FastDFS 自带Ngnix,默认的端口有三个8888,23000,22122。8888是默认的nginx代理端口,23000是storage服务端口,22122是tracker服务端口。如果要修改当前8888端口,可以进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在**/etc/fdfs**目录下的storage.conf:
#进入容器
docker exec -it fastdfs-storage /bin/bash
#进入目录
cd /etc/fdfs/
#编辑文件
vi storage.conf
通过以上方式修改好端口,如果有防火墙需要将当前的三个端口开放:
firewall-cmd --zone=public --permanent --add-port=8888/tcp
firewall-cmd --zone=public --permanent --add-port=22122/tcp
firewall-cmd --zone=public --permanent --add-port=23000/tcp
重启防火墙:
systemctl restart firewalld
3.5 验证服务
使用以下命令检查容器状态,确保 Tracker 和 Storage 服务运行正常:
docker ps
通过storage容器,进入/var/fdfs目录:
#进入容器
docker exec -it fastdfs-storage /bin/bash
#进入目录
cd /var/fdfs/
#添加b.txt测试文件
echo hello 测试文件>b.txt
#通过以下指令上传b.txt文件
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf b.txt
#上传成功生成对外访问的地址
group1/M00/00/00/rBEABWdHM8iAGXyhAAAAFy0dlFI076.txt
通过浏览器访问以下地址:
http://ip:8888/group1/M00/00/00/rBEABWdHNC6AH7hIAAAAECkLk8U783.txt
4、实现文件操作
4.1 Maven引用
在使用 FastDFS 之前,需要添加其依赖。以下是 FastDFS 的 Maven 依赖:
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
4.2 配置
在项目的配置文件application.properties 指定 FastDFS 配置:
fdfs.so-timeout=1500
fdfs.connect-timeout=600
#thumbImage param
fdfs.thumb-image.height=150
fdfs.thumb-image.width=150
#TrackerList参数,支持多个
fdfs.tracker-list=192.168.157.129:22122
4.3 文件上传和下载
创建FastDFSUtil 工具类来负责文件系统的上传和下载,通过该组件来请求:
package com.lm.shop.shopeureka.util;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@Component
public class FastDFSUtil {
private final Logger logger = LoggerFactory.getLogger(FastDFSUtil.class);
@Autowired
private FastFileStorageClient fileStorageClient;
/**
* 文件上传
*
* @param multipartFile 附件上传
* @return fastDfs路径
*/
public String uploadFile(MultipartFile multipartFile) throws Exception{
String originalFilename = multipartFile.getOriginalFilename().
substring(multipartFile.getOriginalFilename().
lastIndexOf(".") + 1);
StorePath storePath = this.fileStorageClient.uploadImageAndCrtThumbImage(
multipartFile.getInputStream(),
multipartFile.getSize(),originalFilename , null);
return storePath.getFullPath() ;
}
/**
* 删除文件
*
* @param filePath 附件路径
* @return void
*/
public void delFile(String filePath) {
this.fileStorageClient.deleteFile(filePath);
}
/**
* 文件上传
*
* @param bytes 文件字节
* @param fileSize 文件大小
* @param extension 文件扩展名
* @return fastDfs路径
*/
public String uploadFile(byte[] bytes, long fileSize, String extension) {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
StorePath storePath = fileStorageClient.uploadFile(byteArrayInputStream, fileSize, extension, null);
logger.info(storePath.getGroup() + "===" + storePath.getPath() + "======" + storePath.getFullPath());
return storePath.getFullPath();
}
/**
* 下载文件
*
* @param fileUrl 文件URL
* @return 文件字节
* @throws IOException
*/
public byte[] downloadFile(String fileUrl) throws IOException {
String group = fileUrl.substring(0, fileUrl.indexOf("/"));
String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
DownloadByteArray downloadByteArray = new DownloadByteArray();
byte[] bytes = fileStorageClient.downloadFile(group, path, downloadByteArray);
return bytes;
}
}
5、总结
通过 Docker 搭建 FastDFS 服务非常高效,并且可以快速启动测试环境。使用 Java 客户端可以轻松实现文件的上传、下载等操作。具体的生产环境中,建议优化以下内容:
- 高可用部署:考虑配置多台 Tracker 和 Storage 实现负载均衡和容错。
- 文件访问权限:对上传的文件进行权限控制。
- 日志监控:通过日志和监控工具确保服务运行稳定。
希望这篇博客能帮助您快速上手 FastDFS!
评论区