FastDFS是分布式文件系统。使用 FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
组成部分
1、tracker(调度服务器)作用:负载均衡和调度
2、storage(存储服务器) 作用:文件存储
工作原理
1、FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。
2、Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。
3、Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storage server 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。
FastDFS上传下载流程
1、上传流程:
- Client通过Tracker server查找可用的Storage server。
- Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
- 上传完成,Storage server返回Client一个文件ID,文件上传结束。
2、下载流程:
- Client通过Tracker server查找要下载文件所在的的Storage server。
- Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
- 下载文件成功。
安装
1、下载压缩包
2、使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用)
docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs -v /etc/localtime:/etc/localtime delron/fastdfs tracker
3、 使用docker镜像构建storage容器(存储服务器,提供容量和备份服务)
docker run -dti --network=host --name storage -e TRACKER_SERVER=192.168.253.100:22122 -v /var/fdfs/storage:/var/fdfs -v /etc/localtime:/etc/localtime delron/fastdfs storage
5、测试,进入storage容器,进入/var/fdfs目录
docker exec -it storage bash
cd /var/fdfs
6、添加测试文件
echo hello 这是一个测试用例>a.txt
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf a.txt
和java进行对接
1、导入依赖
<!-- fastDFS分布式文件存储 -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
2、配置启动类
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
@SpringBootApplication
public class JwtDemoApplication {
public static void main(String[] args) {
SpringApplication.run(JwtDemoApplication.class, args);
}
}
3、编写控制层
@PostMapping("/create")
public ImgResult create(@RequestBody MultipartFile file){
return uploadService.create(file);
}
@DeleteMapping("/delete")
public boolean delete(String url){
return uploadService.delete(url);
}
4、编写业务层
@Service
@Log4j2
public class UploadService {
@Autowired
FastFileStorageClient fastFileStorageClient;
@Autowired
private ThumbImageConfig thumbImageConfig;
@Value("${fdfs.view-base-url}")
private String basePath;
//读取缩略图
public ImgResult create(MultipartFile file) {
// 获取文件后缀名
String suffix = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
//上传
StorePath storePath = null;
InputStream is = null;
try {
is = file.getInputStream();
storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(is, file.getSize(), suffix, null);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
log.info("正常图片路径:{}",storePath.getFullPath());
log.info("缩略图片路径:{}",thumbImageConfig.getThumbImagePath(storePath.getFullPath()));
return new ImgResult().setErrno(0).setData(new Image().setUrl(basePath +"/"+storePath.getFullPath()));
}
public boolean delete(String url) {
try {
fastFileStorageClient.deleteFile(url);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
5、开放防火墙端口
firewall-cmd --zone=public --add-port=22122/tcp --permanent
firewall-cmd --zone=public --add-port=23000/tcp --permanent
firewall-cmd --reload
6、输出结果
2023-05-10 16:29:01.034 INFO 17204 --- [io-8080-exec-10] edu.xja.service.UploadService : 正常图片路径:group1/M00/00/00/wKj9ZGQyo02AZK4CAAa_OBFgvWI494.jpg
2023-05-10 16:29:01.034 INFO 17204 --- [io-8080-exec-10] edu.xja.service.UploadService : 缩略图片路径:group1/M00/00/00/wKj9ZGQyo02AZK4CAAa_OBFgvWI494_60x60.jpg