fastdfs(代码片段)

hq0422 hq0422     2023-04-09     110

关键词:

1.什么是FastDFS

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

FastDFS充分考虑了冗余备份,负载均衡,线性扩容等机制,并注重高可用,高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传,下载等服务

FastDFS架构包括Tracker server 和Storage server 客户端请求Tracker server 进行文件上传,下载,通过Tracker server调度最终由Storage server完成文件上传和下载

 

2.Tracker server作用

Tracker server 的作用是负载均衡和调度,通过Tracker server 在文件上传时可以根据一些策略找到Storage server 提供上传服务,可以将tracker称为追踪服务器或调度服务器

 

3.Storage server作用

客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将Storage server称为存储服务器

 

4.服务端两个角色

1.Tracker :管理集群,tracker也可以实现集群。每个tracker节点的地位平等。负责收集Storage集群的状态

2.Storage:保存文件,Storage分为多个分组,每组之间保存的文件是不同的,每个组内部可以有多个成员,成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念

 

上传流程图 技术图片

 技术图片

 

客户端上传文件后存储服务器将文件Id返回给客户端,此文件Id用于以后访问改文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录级文件名

例:

group1/M00/00/32/wKgCS114sHiAT4pGAAdRFLGbXaw.d52ca2

group1(组名):文件上传后所在的storage组名称,在文件上传成功后由storage服务器返回,需要客户端自行保存

M00(虚拟磁盘路径):storage配置的虚拟路径,与磁盘选项store_path对应,如果配置了store_path0则是M00,如果配置了store_path1则是M01以此类推

00/32(数据两级目录):storage服务在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件

wKgCS114sHiAT4pGAAdRFLGbXaw.d52ca2(文件名):与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址,文件创建时间戳,文件大小,随机数据和文件拓展名等信息

 

5.文件下载流程

技术图片

 

 

tracker根据请求的文件路径即文件ID来快速定义文件

例:

  group1/M00/00/32/wKgCS114sHiAT4pGAAdRFLGbXaw.d52ca2

通过tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问

存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位

 

例:

  前台:

this.axios(
                method:‘GET‘,
                url:"/upload/upload/downloadFile",
                    headers:this.headers,
                    params:
                        id:id,
                    ,responseType: ‘blob‘
                ).then(data=>
                    if (!data) 
                        this.$message.warning("文件下载失败")
                        return
                    
                    if (typeof window.navigator.msSaveBlob !== ‘undefined‘) 
                        window.navigator.msSaveBlob(new Blob([data]),fileName)
                    else
                        let url = window.URL.createObjectURL(new Blob([data]))
                        let link = document.createElement(‘a‘)
                        link.style.display = ‘none‘
                        link.href = url
                        link.setAttribute(‘download‘,fileName)
                        document.body.appendChild(link)
                        link.click()
                        document.body.removeChild(link); //下载完成移除元素
                        window.URL.revokeObjectURL(url); //释放掉blob对象
                    
                )

  后台:

     //通过id获得图片
        Upload a = getById(id);
        //获得文件服务器连接    
        FastFileStorageClient storageClient = getStorageClient();
        //下载文件
        byte[] bytes = storageClient.downloadFile(a.getFileGroup(), a.getFilePath());

        //设置文件类型和字符编码
        response.setContentType("application/octet-stream;charset=UTF-8");
        
        //设置返回的头部信息
        response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(a.getFileName()+a.getFileType(), "UTF-8"))));
         
        response.addHeader("Content-Length", "" + bytes.length);
        
        //获得输出流
        OutputStream outputStream = response.getOutputStream();
         
        //将数组写出 
        outputStream.write(bytes);
        
        //冲刷缓冲区
        outputStream.flush();
        
        //关闭流
        outputStream.close();
//获得文件服务器地址
    public  FastFileStorageClient getStorageClient()    
        //初始化连接池
        FdfsConnectionPool pool = new FdfsConnectionPool();
        // 设置tracker
        List<String> trackers = Arrays.asList("文件服务器ip地址:端口", "文件服务器IP地址:端口");
        TrackerConnectionManager tcm = new TrackerConnectionManager(pool, trackers);
        TrackerClient trackerClient = new DefaultTrackerClient(tcm);
        // 得到storage客户端
        ConnectionManager cm = new ConnectionManager(pool);
        FastFileStorageClient storageClient = new DefaultFastFileStorageClient(trackerClient, cm);
        return storageClient;
    

下载图片转为base64码发送到前台

    //获得文件服务链接
        FastFileStorageClient sClient = getStorageClient();
        //获得文件数组
        byte[] bytes = sClient.downloadFile(a.getFileGroup(), a.getFilePath());

        BASE64Encoder npBase64Encoder = new BASE64Encoder();
        
        String s=npBase64Encoder.encode(bytes);

前台显示

<img width="40" height="30" src="data:image/jpeg;base64,/9j/4QMZRXhp" />

 

SpringBoot整合FastDFS

1.引入协议

     <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>0.4.0</version>
        </dependency>

2.获得文件服务器地址

public  FastFileStorageClient getStorageClient()    
               //初始化连接池
            FdfsConnectionPool pool = new FdfsConnectionPool();
        
            // 设置tracker
            List<String> trackers = Arrays.asList("192.168.2.77:55122", "192.168.2.78:55122");
    
            TrackerConnectionManager tcm = new TrackerConnectionManager(pool, trackers);
    
            TrackerClient trackerClient = new DefaultTrackerClient(tcm);
    
            // 得到storage客户端
            ConnectionManager cm = new ConnectionManager(pool);
    
            FastFileStorageClient storageClient = new DefaultFastFileStorageClient(trackerClient, cm);
    
            return storageClient;
    

3.下载文件

    //获得文件服务器
      FastFileStorageClient sclient = getStorageClient();
    
      //获得文件名加后缀
      String fileName =  file.getOriginalFilename();
    
      //得到文件类型
      String type = fileName.substring(fileName.indexOf(".")+1);
    
      //得到文件名称
      String name = fileName.substring(0, fileName.indexOf("."));
    
      //将文件发送到服务器
      StorePath storePath = sclient.uploadFile(file.getBytes(), type);

      String group = storePath.getGroup();
      String path = storePath.getPath();

      //1.通过group和payh下载文件
      byte[] bytes = sClient.downloadFile(group ,path );
          或
      //2.通过文件路径访问
      String url =文件服务器地址 + "/" + group + "/" + path;

 

fastdfs(代码片段)

分布式图片服务器FastDFS什么是FastDFS  FastDFS使用c编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗(rong余备份,负载均衡,线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套... 查看详情

fastdfs(代码片段)

FastDFSjava上传下载配置文件dfs.properties##fastdfs-clientfastdfs.connect_timeout_in_seconds=5fastdfs.network_timeout_in_seconds=30fastdfs.charset=UTF-8fastdfs.http_anti_steal_token=truefastdfs.http_secret_key 查看详情

fastdfs(代码片段)

一、简介#FastDFS是一个轻量级的开源分布式文件系统#FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡#FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储#支持存储服务器在线扩容#支... 查看详情

fastdfs基于group扩容(代码片段)

#新建pathmkdir/home/fastdfs1#storage.conf配置修改vim/etc/fdfs/storage.conf配置mod_fastdfs.confvim/etc/fdfs/mod_fastdfs.conf 查看详情

fastdfs专有术语(代码片段)

FastDFS专有术语本篇文章转载于FastDFS作者余庆大佬的FastDFS分享与交流公众号。1.trackerserver中心服务器,FastDFSserver端两大主角之一。trackerserver作为FastDFS集群管理中心,管理集群拓扑结构,对storageserver文件上传和文件... 查看详情

docker安装fastdfs(代码片段)

什么是FastDFS?FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提... 查看详情

fastdfs架构分析(代码片段)

本系列文章将使用FastDFS框架来搭建一个基于分布式文件系统的网络云盘 1.FastDFS架构分析FastDFS是由国人余庆所开发,其项目地址是:https://github.com/happyfish100FastDFS主要功能包括:文件存储,同步和访问,设计... 查看详情

fastdfs运维友好那些事儿(代码片段)

FastDFS运维友好那些事儿本篇文章转载于FastDFS作者余庆大佬的FastDFS分享与交流公众号。FastDFS运维友好那些事儿(一)FastDFS运维友好那些事儿(二)最近有人在FastDFSQQ技术交流群里爆料,说网上有人吐槽FastDFS... 查看详情

fastdfs的三大误解(代码片段)

FastDFS的三大误解本篇文章转载于FastDFS作者余庆大佬的FastDFS分享与交流公众号。整理个别同学对FastDFS的三个误解,我将逐一澄清。误解一、FastDFS不易安装和配置网上有人吐槽说FastDFS是他见过最难安装和配置的一款开源软件... 查看详情

fastdfs(代码片段)

简介FastDFS是一个高性能的分布式文件系统。功能文件存储、文件同步、文件访问(文件上传、文件下载)。目标大容量存储和负载均衡的问题。依赖<dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-jav... 查看详情

fastdfs安全注意事项(代码片段)

FastDFS安全注意事项本篇文章转载于FastDFS作者余庆大佬的FastDFS分享与交流公众号。对于互联网应用,FastDFS的标准使用姿势:通过FastDFSAPI进行文件上传等更新操作,storageserver上通过FastDFSnginx扩展模块使用HTTP方式下载... 查看详情

springboot集成fastdfs(代码片段)

官方文档:https://github.com/happyfish100/fastdfs-client-java一、首先,maven工程添加依赖<!--fastdfs--><dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifa 查看详情

fastdfs依赖无法导入(代码片段)

fastdfs-client-java导入爆红<!--FastDFS--><dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifactId><version>1.29-SNAPSHOT</version& 查看详情

fastdfs安装使用(代码片段)

...器,有的可能选择搭建ftp+nginx做简单图片处理,或者搭建FastDFS+nginx来存储和管理图片。这篇博客主要讲解下如何在云服务器上搭建FastDFS和springboot如何整合FastDFS客户端上传图片。正文:一、FastDFS的介绍1.1什么是Fas 查看详情

fastdfs集群搭建(代码片段)

所需软件包https://github.com/happyfish100/libfastcommonhttps://github.com/happyfish100/fastdfshttps://github.com/happyfish100/fastdfs-nginx-modulehttps://nginx.org/en/yuminstall-ylibeventgccpcre-develzlib- 查看详情

fastdfs集群部署(代码片段)

FastDFS集群部署官网https://github.com/happyfish100FastDFS是一款开源的高性能分布式文件系统(DFS)。主要功能:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围... 查看详情

安装部署fastdfs(代码片段)

环境准备使用的系统软件名称说明centos7.xlibfatscommonFastDFS分离出的一些公用函数包FastDFSFastDFS本体fastdfs-nginx-moduleFastDFS和nginx的关联模块nginxnginx1.15.4编译环境yuminstallgitgccgcc-c++makeautomakeautoconflibtoolpcrepcre-develzlibzli 查看详情

docker搭建fastdfs文件系统(代码片段)

1、检索和拉取fastDFS镜像#检索fastdfsdockersearchfastdfs#拉取fastdfsdockerpulldelron/fastdfs2、使用docker镜像构建tracker容器跟踪服务器,起到调度的作用#创建tracker挂载文件目录mkdir-p/usr/local/fdfs/tracker#创建fastdfs跟踪服务器trackerdockerrun- 查看详情