主流分布式文件系统(分布式文件系统问题)
作者:小琪地址:https://blog.52itstyle.vip/archives/4837/
前言
最近在做一个图片床服务。如前一篇文章所述,阿里巴巴云OSS之前是集成存储图片的。虽然小批量储存不贵,但少肉还是有点痛苦。正好双十一搞活动,顺手买了腾讯云的2C4G3MB云服务器,不得不说真香!从600多开始,真的很甜。毕竟,这是3MB带宽。
不要问我为什么不买阿里巴巴云双十一,因为我不如老用户和狗,只有续费和所谓的福利少多少。
简介
FastDFS是用C语言编写的开源分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩展等机制,注重高可用性、高性能等指标。其功能包括文件存储、文件同步、文件访问(文件上传和文件下载)等。解决了海量存储和负载均衡的问题。特别适合中小文件(推荐范围:4KB file_size 500MB)、以文件为载体的在线服务,如相册网站、视频网站等。
结构
软件
SpringBoot2.0就更不用说了,它了解Nginx,提供http服务Docker,一个安装容器,而在它的背后,不需要用C语言编写的开源分布式文件系统libfastconly FastDFS,里面包含了FastDFS操作所需的一些基本库,Nginx结合Fastdfs-nginx-module插件实现HTTP协议安装。
如果一步一步地安装FastDFS及其依赖项,那就极其复杂了,有可能你一上午都配置不了!在这里,建议大家使用Docker一键安装,只需映射存储目录即可。
docker run-name fastdfs-privileged=true-net=host \
-e IP=192 . 168 . 1 . 156-e WEB _ PORT=8080 \
-v/home/fast DFS 3360/var/local/fdfs \
-d -重启=始终\
registry.cn-beijing.aliyuncs.com/itstyle/fastdfs:1.0
成功安装后,将在/home/fastdfs目录中生成两个目录文件夹,即跟踪器和存储。
这里有几点需要注意:
要映射主机的存储文件路径IP,必须将其配置为内部网或公共地址,并且网络类型必须设置为主机类型。安装完成后,浏览器访问:http://ip:8080如果显示Nginx欢迎页面,说明安装配置成功。
合并
接下来,我们将与SpringBoot集成。pom.xml引入了第三方工具类:
属国
groupIdcom.github.tobato/groupId
artifactIdfastdfs-客户端/artifactId
版本1 . 26 . 6/版本
/依赖性
在应用程序中引入配置。属性:
#===================================
#分布式文件系统FDFS配置
#===================================
#连接超时
fdfs . connect-超时=600
#读取超时
fdfs.so-timeout=1500
#缩略图的宽度和高度
fdfs.thumb-image.height=150
fdfs.thumb-image.width=150
#跟踪器服务配置地址列表,替换为自己服务的IP地址,并支持多个
跟踪者列表=192 . 168 . 1 . 136868666616
fdfs.pool.jmx-enabled=false
最后,写一个工具类,基本搞定,等待上传:
@组件
公共类FastdfsUtils {
公共静态最终字符串DEFAULT _ CHARSET=' UTF-8 ';
@自动连线
私有FastFileStorageClient FastFileStorageClient;
/**
*上传
* @param文件
* @返回
* @抛出IOException
*/
公共存储路径上传(多部分文件)引发IOException(
//设置文件信息
SetMetaData mataData=new HashSet();
matadata . add(new MetaData(' author ',' fastdfs ');
matadata . add(new MetaData(' description ',file . getoriginalfilename()));
//上传
StorePath StorePath=fastfilestorageclient . uploadfile(
file.getInputStream()、file.getSize(),
filenameutils . getextension(file . getoriginalfilename()),
null);
返回storePath
}
/**
*删除
* @param路径
*/
公共无效删除(字符串路径){ 0
fastfilestorageclient . delete file(路径);
}
/**
*删除
* @param组
* @param路径
*/
公共无效删除(字符串组,字符串路径){ 0
fastfilestorageclient . delete file(组,路径);
}
/**
*文件下载
* @param path文件路径,例如:/group 1/path=M00/00/00/it style . png。
* @param文件名下载的文件名
* @返回
*/
公共无效下载(字符串路径、字符串文件名、HttpServletResponse响应)引发IOException {
//获取文件
存储路径存储路径=存储路径。ParseFromURl(路径);
if (StringUtils.isBlank(文件名)){ 0
filenameutils。getname(存储路径。getpath());
}
byte[]bytes=fastfilestorageclient。downloadfile(storepath。getgroup()、storePath.getPath()、new DownloadByteArray());
回应。reset();
回应。setcontenttype('应用程序in/octet-stream ');
回应。setheader('内容处理','附件;filename=' URLEncoder.encode(文件名,《UTF-8》);
ServletOutputStream out=响应。getoutputstream();
out.write(字节);
出去。close();
}
}
图床预览
注意事项
生产环境中建议集群使用,搭建高可靠的云存储服务。如果是本地开发云服务器需要开放8080、22122 端口,生产环境不建议开启,所有的请求最好走内网。