FastDFS简介

  • FastDFS体系结构
    • 上传流程
  • 文件存储
    • pom.xml依赖
    • FastDFS配置
    • 文件信息封装
    • 文件上传

FastDFS体系结构

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

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

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

Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些策略找到Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storageserver 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。

上传流程


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

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

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

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

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

文件存储

pom.xml依赖

 <!--依赖包-->
<dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId><version>1.27.0.0</version>
</dependency>

FastDFS配置

在resources文件夹下创建fasfDFS的配置文件fdfs_client.conf

connect_timeout=60          //连接超时时间,单位为秒
network_timeout=60         //通信超时时间,单位为秒。发送或接收数据时。假设在超时时间后还不能发送或接收数据,则本次网络通信失败
charset=UTF-8              //字符集
http.tracker_http_port=8080        //tracker的http端口
tracker_server=192.168.211.132:22122   //tracker服务器IP和端口设置

在resources文件夹下创建application.yml

spring:servlet:multipart:max-file-size: 10MB     //单个文件大小max-request-size: 10MB  //设置总上传的数据大小

启动类FileApplication

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})    //这里禁止了DataSource的加载创建
@EnableEurekaClient
public class FileApplication {public static void main(String[] args) {SpringApplication.run(FileApplication.class);}
}

文件信息封装

文件上传一般都有文件的名字、文件的内容、文件的扩展名、文件的md5值、文件的作者等相关属性,我们可以创建一个对象封装这些属性,代码如下:

package com.XXX.file;import java.io.Serializable;
import java.util.Arrays;/*** @Author: cb* @DateTime: 2020/6/3 10:39* @Description: 文件信息封装*/
public class FastDFSFile implements Serializable {//文件名字private String name;//文件内容private byte[] content;//文件扩展名private String ext;//文件MD5摘要值private String md5;//文件创建作者private String author;public FastDFSFile() {}public FastDFSFile(String name, byte[] content, String ext) {this.name = name;this.content = content;this.ext = ext;}public FastDFSFile(String name, byte[] content, String ext, String md5, String author) {this.name = name;this.content = content;this.ext = ext;this.md5 = md5;this.author = author;}@Overridepublic String toString() {return "FastDFSFile{" +"name='" + name + '\'' +", content=" + Arrays.toString(content) +", ext='" + ext + '\'' +", md5='" + md5 + '\'' +", author='" + author + '\'' +'}';}public void setName(String name) {this.name = name;}public void setContent(byte[] content) {this.content = content;}public void setExt(String ext) {this.ext = ext;}public void setMd5(String md5) {this.md5 = md5;}public void setAuthor(String author) {this.author = author;}public String getName() {return name;}public byte[] getContent() {return content;}public String getExt() {return ext;}public String getMd5() {return md5;}public String getAuthor() {return author;}
}

创建util.FastDFSClient类,在该类中实现FastDFS信息获取以及文件的相关操作,代码如下:

package com.XXX.util;import com.XXX.file.FastDFSFile;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import org.springframework.core.io.ClassPathResource;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;/*** @Author: cb* @DateTime: 2020/6/3 10:58* @Description: 文件操作*/
public class FastDFSClient {/*** 初始化tracker信息*/static {try {//获取tracker的配置文件fdfs_client.conf的位置String filePath = new ClassPathResource("fdfs_client.conf").getPath();//加载tracker配置信息ClientGlobal.init(filePath);} catch (Exception e) {e.printStackTrace();}}/***** 文件上传* @param file : 要上传的文件信息封装->FastDFSFile* @return String[]*          1:文件上传所存储的组名*          2:文件存储路径*/public static String[] upload(FastDFSFile file) {//获取文件作者NameValuePair[] meta_list = new NameValuePair[1];meta_list[0] = new NameValuePair(file.getAuthor());/**** 文件上传后的返回值* uploadResults[0]:文件上传所存储的组名,例如:group1* uploadResults[1]:文件存储路径,例如:M00/00/00/wKjThF0DBzaAP23MAAXz2mMp9oM26.jpeg*/String[] uploadResults = null;try {//创建TrackerClient客户端对象StorageClient storageClient = getStorageClient();//执行文件上传uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);} catch (Exception e) {e.printStackTrace();}return uploadResults;}/**** 获取文件信息* @param groupName:组名* @param remoteFileName:文件存储完整名*/public static FileInfo getFile(String groupName,String remoteFileName) {try {//创建TrackerClient对象StorageClient storageClient = getStorageClient();//获取文件信息return storageClient.get_file_info(groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}return null;}/**** 文件下载* @param groupName:组名* @param remoteFileName:文件存储完整名* @return*/public static InputStream downFile(String groupName,String remoteFileName){try {//创建TrackerClient对象StorageClient storageClient = getStorageClient();//通过StorageClient下载文件byte[] fileByte = storageClient.download_file(groupName, remoteFileName);//将字节数组转换成字节输入流return new ByteArrayInputStream(fileByte);} catch (Exception e) {e.printStackTrace();}return null;}/**** 文件删除实现* @param groupName:组名* @param remoteFileName:文件存储完整名*/public static void deleteFile(String groupName, String remoteFileName) {try {StorageClient storageClient = getStorageClient();//通过StorageClient删除文件storageClient.delete_file(groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}}/**** 获取组信息* @param groupName :组名*/public static StorageServer getStorages(String groupName) {try {//创建TrackerClient对象TrackerClient trackerClient = new TrackerClient();//通过TrackerClient获取TrackerServer对象TrackerServer trackerServer = trackerClient.getConnection();//通过trackerClient获取Storage组信息return trackerClient.getStoreStorage(trackerServer, groupName);} catch (Exception e) {e.printStackTrace();}return null;}/**** 根据文件组名和文件存储路径获取Storage服务的IP、端口信息* @param groupName :组名* @param remoteFileName :文件存储完整名*/public static ServerInfo[] getServerInfo(String groupName, String remoteFileName) {try {//创建TrackerClient对象TrackerClient trackerClient = new TrackerClient();//通过TrackerClient获取TrackerServer对象TrackerServer trackerServer = trackerClient.getConnection();//获取服务信息return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}return null;}/**** 获取Tracker服务地址*/public static String getTrackerUrl() {try {TrackerServer trackerServer = getTrackerServer();//获取Tracker地址return "http://"+  trackerServer.getInetSocketAddress().getHostString()+":"+ClientGlobal.getG_tracker_http_port();} catch (Exception e) {e.printStackTrace();}return null;}/**** 获取TrackerServer*/private static TrackerServer getTrackerServer() throws IOException {//创建TrackerClient对象TrackerClient trackerClient = new TrackerClient();//通过TrackerClient获取TrackerServer对象return trackerClient.getConnection();}/**** 获取StorageClient* @return* @throws Exception*/private static StorageClient getStorageClient() throws IOException {//创建TrackerClient对象TrackerServer trackerServer = getTrackerServer();//通过TrackerServer创建StorageClientreturn new StorageClient(trackerServer, null);}
}

文件上传

创建一个FileController,在该控制器中实现文件上传操作,代码如下:

@RestController
@CrossOrigin
public class FileController {/**** 文件上传* @return*/@PostMapping(value = "/upload")public String upload(@RequestParam("file")MultipartFile file) throws Exception {//封装一个FastDFSFileFastDFSFile fastDFSFile = new FastDFSFile(file.getOriginalFilename(), //文件名字file.getBytes(),            //文件字节数组StringUtils.getFilenameExtension(file.getOriginalFilename()));//文件扩展名//文件上传String[] uploads = FastDFSClient.upload(fastDFSFile);//组装文件上传地址return FastDFSClient.getTrackerUrl()+"/"+uploads[0]+"/"+uploads[1];}
}

FastDFS分布式文件系统实践详解相关推荐

  1. GlusterFS/GFS 分布式文件系统--理论详解

    文章目录 一.文件系统简介 1.组成 2.作用 3.文件系统的挂载使用 二.GFS分布式文件系统概述 1.GFS简介 2.GFS的特点 3.GFS专业术语 4. 模块化堆栈式架构 5. GFS 工作流 ...

  2. FastDFS 分布式文件系统详解

    FastDFS 分布式文件系统详解 什么是文件系统 文件系统是操作系统用于在磁盘或分区上组织文件的方法和数据结构.磁盘空间是什么样的我们并不清楚,但文件系统可以给我们呈现一个非常清晰的表象,我们可以创 ...

  3. FastDFS分布式文件系统详解

    FastDFS 简介 FastDFS 是基于 C 语言开发的,是一个轻量级开源的高性能分布式文件系统.主要功能有:文件存储.文件同步.文件访问(文件上传/下载),解决了大容量的文件存储和高并发访问的问 ...

  4. FastDFS分布式文件系统_Linux

    文章目录 一.分布式文件系统概述 1.单机时代 2.独立文件服务器 3.分布式文件系统 4.FastDFS 5.FastDFS核心概念 6.上传机制 7.下载机制 二.分布式文件系统实践 1.环境搭建 ...

  5. FastDFS分布式文件系统(详细入门级介绍)

    分布式文件系统 (Distributed File System) 是一个软件/软件服务器: 这个软件可以用来管理文件: 但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些 ...

  6. FastDFS分布式文件系统使用手册

    FastDFS分布式文件系统使用手册 1.概述 1.1.FastDFS简介 FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100,FastDFS ...

  7. php使用redis分布式锁,php基于redis的分布式锁实例详解

    在使用分布式锁进行互斥资源访问时候,我们很多方案是采用redis的实现. 固然,redis的单节点锁在极端情况也是有问题的,假设你的业务允许偶尔的失效,使用单节点的redis锁方案就足够了,简单而且效 ...

  8. centos 安装mysql5.7_Zabbix 4.2.5 安装部署实践详解

    [导读]云计算背景下,无论是大数据.物联网还是边缘计算,规模化后大量的设备需要保证正常运行,在人员一定的情况下,就需要提高运行维护效率.同时随着智能化被应用在人们生活的方方面面,关联性也越来越紧密,即 ...

  9. 组件化实践详解(二)

    在上一篇文章<组件化实践详解(一)>中我们介绍了组件化实践的目标和实践步骤,本文继续说说关于组件化实践遇到的问题及思考. 1.组件内的架构设计 这条本来我是不想写的,但是很多组件化的文章里 ...

最新文章

  1. mysql key value 排序_MySQL利用索引优化ORDER BY排序语句的方法
  2. 【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )
  3. @JsonProperty的使用
  4. 也议GetLastKnownLocation!!(独家理解)
  5. sap 提取字符串中汉字
  6. flash和html5
  7. 常见工具:dp与px互转,屏幕宽度与高度获取
  8. arm-2009q1-203-arm-none-linux-gnueabi.bin执行错误解决
  9. python第四章选择题_PythonCrashCourse 第四章习题
  10. 阿里优酷视频分类方法???咋理解啊?
  11. Seo搜索引擎优化概述
  12. 黑客利用2012伦敦奥运诈骗个人资料
  13. NOIP 2010 普及组 三国游戏
  14. 互联网行业职位介绍——PM,RD,FE,UE,UI,QA,OP,DBA,BRD,MRD, PRD,FSD等
  15. [机缘参悟-58]:《素书》-5-奉行仁义[遵义章第五]
  16. [Go实战]写一个简单的概率算法(抽奖)
  17. MSN协议分析以及Java实现MSN登陆
  18. 使用CStdioFile读写文件
  19. linux缓存无法写入,Linux下搭建网站提示缓存文件写入失败怎么办?
  20. 【Info】车载芯片的几个大玩家:飞思卡尔(Freescale), 恩智浦(NXP), 高通(Qualcomm)

热门文章

  1. confirm多次点击确认,导致重复提交
  2. 三元:将对20万名贫困家庭儿童进行健康扶贫
  3. nc java 5.7,用友ERP NC v5.7 ——安装详解篇
  4. nc608串口服务器型号,康海时代NC608系列产品信息
  5. 2022中国公司注册亚马逊欧洲站卖家资质审核(KYC)所需资料料及要求!
  6. tsmc 7nm工艺下用做syncCell的stdCell介绍
  7. php查询mysql充值_PHP + MYSQL 实现 用户注册/登录/充值 功能
  8. 微信小程序--自定义组件之搜索框
  9. 交互设计师需要从什么做起?
  10. 马云的双11计算机发展史图片,双11白色系电脑想买就选它们