暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

部署FastDFS文件服务器

算法技术猿 2021-01-29
426

目录

  • FastDFS简介

  • 部署FastDFS

  • Springboot demo

fastdfs简介

FastDFS是一个开源的分布式文件系统,对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage),跟踪器主要做调度工作,在访问上起负载均衡的作用;存储节点存储文件,完成文件管理的所有功能,包括存储、同步和提供存取接口。

FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

FastDFS系统架构图:

上传文件交互过程:

  1. client询问tracker上传到的storage,不需要附加参数;

  2. tracker返回一台可用的storage;

  3. client直接和storage通讯完成文件上传。

下载文件交互过程:

  1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);

  2. tracker返回一台可用的storage;

  3. client直接和storage通讯完成文件下载。

上述内容摘自:https://www.oschina.net/p/fastdfs?hmsr=aladdin1e1

部署FastDFS

在docker官方仓库中有很多fastdfs镜像,本例以delron/fastdfs 镜像作为参考,并进行部署使用;

在服务器data目录下新建文件夹存储文件

mkdir -p /data/fastdfs/storage
mkdir -p /data/fastdfs/tracker

拉取镜像,并启动fastdfs的tracker节点和storage节点

docker pull delron/fastdfs
#启动tracker节点,并暴露22122端口
docker run -d --name tracker -p 22122:22122 -v /data/fastdfs/tracker:/var/fdfs delron/fastdfs tracker
#启动storage节点,指定tracker服务器地址和储存卷名称
docker run -d --name storage --net=host -e TRACKER_SERVER=192.168.1.1:22122 -e GROUP_NAME=group1 -v /data/fastdfs/storage:/var/fdfs delron/fastdfs storage

启动成功后,可以到容器中测试上传文件功能

#进入storage容器
docker exec -it storage bash
# 使用(/usr/bin/fdfs_upload)命令,并指定client配置文件(/etc/fdfs/client.conf),以及要上传的文件(1.txt)
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 1.txt
#上传成功后,输出结果:group1/M00/00/00/wKgH_WAT7qmAFw8kAAAACM_m2yg016.txt

上传成功后,在浏览器中输入下面地址,即可下载1.txt文件

http://192.168.1.1:8888/group1/M00/00/00/wKgH_WAT7qmAFw8kAAAACM_m2yg016.txt


Springboot demo

1、在pom.xml文件中引入jar包

<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>

2、在application.yml配置文件中添加配置

fdfs:
so-timeout: 6000
connect-timeout: 6000
network-timeout: 3000
tracker-list: 192.168.1.1:22122

3、写个连接fastdfs的客户端

@Component
public class FastDFSClient {


@Autowired
private FastFileStorageClient fastFileStorageClient;


/**
* 上传文件
* @param file
* @return
* @throws IOException
*/
public StorePath upload(MultipartFile file) {
StorePath storePath = null;
try {
FastFile fastFile = new FastFile.Builder()
.toGroup("group1")
.withFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename())).build();
storePath = fastFileStorageClient.uploadFile(fastFile);
} catch (IOException e) {
e.printStackTrace();
}
return storePath;
}


/**
* 文件下载
* @param path 文件路径,例如:/group1/path=M00/00/00/1.txt
* @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, DEFAULT_CHARSET));
ServletOutputStream out = response.getOutputStream();
out.write(bytes);
out.close();
}
}

4、接下来调用接口,上传文件即可

@RestController
@RequestMapping(value = "/test")
public class TextController {


@Autowired
private FastDFSClient fastDFSClient;


@PostMapping(value = "/upload")
public void saveSpace(@RequestParam(value="file",required=false) MultipartFile file){
fastDFSClient.upload(file);
}
}


推荐阅读:

搭建prometheus监控服务

搭建maven私服和docker私有镜像仓库

文章转载自算法技术猿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论