SpringBoot 2.0 开发案例之整合FastDFS分布式文件系统

点击▲关注 “爪哇笔记”   给公众号标星置顶
更多精彩 第一时间直达
640?wx_fmt=jpeg 前言
最近在做一款图床服务,前面的文章也有提到,之前整合了阿里云 OSS 做图片存储,虽然小批量的存储并不贵,然而再少也是肉,还是有点心疼的。
恰好,双十一搞活动,顺手购买了腾讯云的  2C4G3MB的云服务器,不得不说真香!入手六百多,真香,毕竟是3MB的带宽。
不要问我双十一为嘛不买阿里云,因为我等老用户狗都不如,只有续费和满多少减几块的所谓福利了。

简介

FastDFS是用c语言编写的一款开源的分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合中小文件(建议范围:  4KB < file_size <500MB),对以文件为载体的在线服务,如相册网站、视频网站等。

架构

640?wx_fmt=png

软件

  • SpringBoot2.0,不说了都懂

  • Nginx,提供HTTP服务

  • Docker,一件安装容器,后面的就都不需要了

  • FastDFS,C语言编写的一款开源的分布式文件系统

  • libfastcommon,包含了FastDFS运行所需要的一些基础库

  • Fastdfs-nginx-module,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/fastdfs:/var/local/fdfs \	
         -d --restart=always \	
         registry.cn-beijing.aliyuncs.com/itstyle/fastdfs:1.0
安装成功以后,会在  /home/fastdfs 目录下生成两个目录文件夹,  tracker 和  storage
这里需要注意几点:
  • 一定要映射宿机存储文件路径

  • IP一定要配置为内网或者公网地址

  • 网络类型一定要设置为 host 类型

安装完成以后,浏览器访问:  http://ip:8080 如果显示  Nginx欢迎页说明安装配置成功。
整合
接下来我们就要与  SpringBoot整合了,  pom.xml引入第三方工具类:
<dependency>	
    <groupId>com.github.tobato</groupId>	
    <artifactId>fastdfs-client</artifactId>	
    <version>1.26.6</version>	
</dependency>
在  application.properties 引入配置:
# ===================================	
# 分布式文件系统FDFS配置	
# ===================================	
# 连接超时时间	
fdfs.connect-timeout=600	
# 读取超时时间	
fdfs.so-timeout=1500	
# 缩略图的宽高	
fdfs.thumb-image.height=150	
fdfs.thumb-image.width=150	
# tracker服务配置地址列表,替换成自己服务的IP地址,支持多个	
fdfs.tracker-list=192.168.1.15:22122	
fdfs.pool.jmx-enabled=false
最后写个工具类,基本搞定,坐等上传:
@Component	
public class FastdfsUtils {	
    public static final String DEFAULT_CHARSET = "UTF-8";	
    @Autowired	
    private FastFileStorageClient fastFileStorageClient;	
    /**	
     * 上传	
     * @param file	
     * @return	
     * @throws IOException	
     */	
    public StorePath upload(MultipartFile file) throws IOException {	
        // 设置文件信息	
        Set<MetaData> 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);	
        return storePath;	
    }	
    /**	
     * 删除	
     * @param path	
     */	
    public void delete(String path) {	
        fastFileStorageClient.deleteFile(path);	
    }	
    /**	
     * 删除	
     * @param group	
     * @param path	
     */	
    public void delete(String group,String path) {	
        fastFileStorageClient.deleteFile(group,path);	
    }	
    /**	
     * 文件下载	
     * @param path 文件路径,例如:/group1/path=M00/00/00/itstyle.png	
     * @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, "UTF-8"));	
        ServletOutputStream out = response.getOutputStream();	
        out.write(bytes);	
        out.close();	
    }	
}
图床预览
640?wx_fmt=png
640?wx_fmt=png

注意事项

  • 生产环境中建议集群使用,搭建高可靠的云存储服务。

  • 如果是本地开发,云服务器需要开放 808022122 端口,生产环境不建议开启,所有的请求最好走内网。

640?wx_fmt=jpeg
▲一个有温度的公众号,期待与你一起进步
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值