FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题,同时也能做到在集群环境下一台机子上传文件,同时该组下的其他节点下也备份了上传的文件。做分布式系统开发时,其中要解决的一个问题就是图片、音视频、文件共享的问题和数据备份,分布式文件系统正好可以解决这个需求。FastDFS的服务主要有两个角色Tracker和Storage,Tracker服务用于负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽,Storage用于保存文件
1.FastDFS集群部署
整体部署模块图
环境准备
名称 | 描述 |
---|---|
centos系统版本 | 6.9 |
libfatscommon | FastDFS分离出的一些公用函数包 |
FastDFS | FastDFS主程序 |
fastdfs-nginx-module | FastDFS和nginx的关联模块 |
nginx | nginx1.15.5 |
安装编译环境
1 | yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y |
磁盘安装路径说明
说明 | 位置 |
---|---|
FastDFS所以安装包安装位置 | /usr/local/src |
tracker数据 | /data/fdfs/tracker |
Storage数据 | /data/fdfs/Storage |
配置文件路径 | /etc/fdfs |
安装libfatscommon
解压、安装
1 | unzip libfastcommon-master.zip |
安装FastDFS
- 下载FastDFS
- 解压、安装
1 | unzip fastdfs-master.zip |
安装fastdfs-nginx-module
- 下载fastdfs-nginx-module
- 解压、安装
1 | unzip fastdfs-nginx-module-master.zip |
安装nginx
- 下载nginx
- 解压、安装
1 | tar -zxvf nginx-1.15.5.tar.gz |
FastDFS集群部署配置
tracker配置
1
2
3
4
5#服务器ip为 xxx.xxx.78.12, xxx.xxx.78.13
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122 # tracker服务器端口(默认22122,一般不修改)
base_path=/data/fdfs/tracker #存储日志和数据的根目录
- Storage配置
1 | vim /etc/fdfs/storage.conf |
- client配置
1 | vim /etc/fdfs/client.conf |
- 配置nginx访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=xxx.xxx.78.12:22122 # 服务器1
tracker_server=xxx.xxx.78.13:22122 # 服务器2
url_have_group_name=true
store_path0=/data/fdfs/storage
#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
listen 8888; ## 该端口为storage.conf中的http.server_port相同
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
......
......
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
启动服务、测试
1 | 启动之前我们还需要在防火墙开通端口 |
- 每个服务的启动、关闭和重启操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
init.d/fdfs_trackerd start
init.d/fdfs_trackerd restart
init.d/fdfs_trackerd stop
chkconfig fdfs_trackerd on
init.d/fdfs_storaged start
init.d/fdfs_storaged restart
init.d/fdfs_storaged stop
chkconfig fdfs_storaged on
local sbin/nginx
local sbin/nginx -s reload
local sbin/nginx -s stop
检测集群
1 | # 会显示会有几台storage服务器,有2台就会显示 Storage 1-Storage 2的详细信息 |
图片上传测试
1 | #上传成功返回 文件访问 ID |
测试文件访问
1 | http://xxx.xxx.78.12/group1/M00/00/00/rB9ODFvXuSiAWBYBAALSAkm_6RQ360.png |
- 测试nginx默认端口80 访问刚刚上传的文件,两个地址都能访问通一个文件,达到数据备份目的。
至此,FastDFS服务器部署完成
FastDFS客户端集成到SpringBoot
编译获取FastDFS jar包
- 首先根据官方源码提示,我们先下载源码使用maven编译成jar包放到公司maven私服(Nexus),或者你本地的maven私服(也有其他ant等方式,具体请查看github)FastDFS-java-client-SDK源码下载地址
1
2#编译jar包(解压下载的FastDFS-java-client-SDK源码,使用mvn命令需要先有maven环境)
mvn clean install
maven项目pom.xml中添加依赖
1 | <dependency> |
- 接下来我们在项目resources目录下添加fdfs_client.conf文件
1 | connect_timeout = 30 |
代码编写
- 写一个上传文件对象类
1 | /** |
- 编写FastDFS操作类,主要是加载初始化配置Tracker服务器,文件上传,下载,删除等操作工具类
1 | /** |
- Controller编写,接收请求并上传文件返回文件访问路径(这里写一个文件上传的例子,其他文件下载,删除等功能可根据自己需求进行编写)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60/**
* @Author maoqitian
* @Description 上传文件
* @Date 2018/10/30 0030 15:07
* @Param [file]
* @return com.gxxmt.common.utils.ResultApi
**/
"/upload") (
public ResultApi upload( ("file") MultipartFile file) throws Exception {
if (file.isEmpty()) {
throw new RRException("上传文件不能为空");
}
String url;
//此处域名获取可以根据自需求编写
String domainUrl = OSSFactory.build().getDomainPath();
logger.info("配置的域名为"+domainUrl);
if (StringUtils.isNotBlank(domainUrl)){
url = uploadFile(file,domainUrl);
return ResultApi.success.put("url",url);
}else {
return ResultApi.error("域名配置为空,请先配置对象存储域名");
}
}
/**
* @Author maoqitian
* @Description 上传文件到 FastDFS
* @Date 2018/10/29 0029 11:11
* @Param [file]
* @Param [domainName] 域名
* @return path 文件访问路径
**/
public String uploadFile(MultipartFile file,String domainName) throws IOException {
String[] fileAbsolutePath={};
String fileName=file.getOriginalFilename();
String ext=fileName.substring(fileName.lastIndexOf(".")+1);
byte[] file_buff=null;
InputStream inputStream = file.getInputStream();
if(inputStream!=null){
int available = inputStream.available();
file_buff=new byte[available];
inputStream.read(file_buff);
}
inputStream.close();
FastDFSFileEntity fastDFSFileEntity=new FastDFSFileEntity(fileName,file_buff,ext);
try {
fileAbsolutePath=FastDFSClient.getInstance().upload(fastDFSFileEntity);
logger.info(fileAbsolutePath.toString());
}catch (Exception e){
logger.error("upload file Exception!",e);
throw new RRException("文件上传出错"+e);
}
if(fileAbsolutePath == null){
logger.error("upload file failed,please upload again!");
throw new RRException("文件上传失败,请重新上传");
}
String path=domainName+fileAbsolutePath[0]+ "/"+fileAbsolutePath[1];
return path;
}
测试部署成果
- 上传一个图片,由日志打印我们可以看出图片已经上传成功
- 测试访问上传的图片
最后说点
- 到此,FastDFS服务器集群部署和集成客户端到SpringBoot中已经完成,以后我们就可以愉快的使用FastDFS服务保存我们的图片等并备份。如果文章中有写得不对的地方,请给我留言指出,大家一起学习进步。如果觉得我的文章给予你帮助,也请给我一个喜欢和关注。