FastDFS分布式文件系统及源码解析
记录一次本人学习FastDFS-分布式文件系统的学习过程,希望能帮助到有需要的人.
首选得对此技术有个大概的了解,可以参考 https://www.cnblogs.com/centos2017/p/7896761.html ,其实大致看下图知道一下就行了.
然后我们就直接开装了,网上有一大堆的安装教程这里也就不做介绍了,可以直接百度,如果有需要可以直接用我的百度网盘的
链接:https://pan.baidu.com/s/1Y07hC2tiDy_E18ZAD4YKvg
提取码:j5d0
装完测通以后就开始撸JAVA代码,经过我一番研究发现了一位大佬,封装了一个工具jar包十分好用,maven里引入
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.5</version>
</dependency>
具体的demo已经介绍可以参考 https://github.com/MarsNumberOne/FastDFS-Demo
引入了大佬jar包后用起来十分爽

只要改一下
trackerList的地址换成自己的就行了
然后调具体的api即可使用
我发现十分方便都没有做bean的配置就可以用了,研究了一番发现如下:
接下来我就开始看改jar包的源码了,我们可以直接在IDE里下载,下载后源码可以看到中文注释,十分的爽
首先可以看一下,包结构以及各个类的继承关系,这里推荐使用IDE看,对着类名按Ctrl+h就可以看到该类的上下结构 或者使用Ctrl+Alt+Shift+U可以看到更详细的关系层次图.
开始一步步分析源码,客户端API接口为FastFileStorageClient,该类是一个接口,最终的实现类为DefaultFastFileStorageClient
下面我们来分析一下这个类,该类实现了接口FastFileStorageClient,FastFileStorageClient包含了一写上传下载文件等API,该接口继承了
GenerateStorageClient说明这是在根接口上扩展一些APi接口.
FastFileStorageClient继承了类DefaultGenerateStorageClient,该类是基本存储客户端操作实现,也就是说基础的存储功能用这个类就行了,下面我们来分析一下这个类.
就找一个uploadFile()方法来说一下,其它的也是换汤不换药的,理解整体思路就行了.
看到首先从trackClient这个类里取获取trackServer帮我们根据其自身算法帮我们计算出的存储节点信息.Debug发现,其实调用的是 DefaultTrackerClient

然后从TrackerConnectionManager这个类中去执行对应的命令,作者把执行的操作用command做接口,各个操作就是最终command的实现类,这样程序的扩展性维护性就会很高咯,这里new Command对象就是把自定义的request和response包装一下即可(因为不同的command中的request和response不一样,所以就需要放到不同的类,不然用AbstractFdfsCommand这个公共类就行了)

接着进入execute方法了,哦豁一看,执行交易,啥交易,py的那种吗,嘿嘿皮一下

首先该方法是获取连接,先找到yml里的trackServer地址,trackerLocator.getTrackerAddress(); trackerLocator这个类也是一层套一层,大家可以自己去看一下

用了@PostConstruct注解,SpringBoot启动时候就会去执行一层一层的构造函数
获取到连接(该链接还用连接池,作者自己写的一个连接池FdfsConnectionPool,每次获取连接的时候就池子里获取就行了)和地址以后就可以可以去执行具体操作了,最终会定位再AbstractFdfsCommand这个抽象类上去执行execute,与其说是抽象类,倒不如说是一个公共command执行类,所以继承该抽象类的execute方法都在它这里

我们终于快看到头,send和receive这两个方法才是最底层的操作,send顾名思义就是发送,把command里的一些请求信息会发送给StorageServer(StorageServer的地址是被trackServer找到的,也就是我们客户端只需要trackServer的地址就行了,它会负责帮我们去找负责存储StorageServer的地址,然后帮助我们之间与其通讯,建立Socket通讯),好了,我们已经把请求发送给fastDFS服务端,接着它会告诉我们哪个存储节点我们可以去用,也就是receive方法中获得这些信息,最终一层层的返回给上级,接着我们就可以把文件变成Byte数组,还是之前的套路,最终到send和receive方法,send的时候会把文件写入到存储的文件节点上,最后receive方法可以返回路径信息等(这里就有一个疑问,为什么不用netty这种nio,不是好一点吗???有没有大佬能告诉我)
一套基本的文件上传就完成了,api接口大致都是封装成具体的command,然后获取连接,执行方法command,最终就是send和receive方法.
好了,大致的分析,比较通俗,也是自己的一些看法见解,如果有不对的地方,还请指正,工具包我在csdn上购买的,花了1块5呢 ,送给你们了!!!哈哈哈
FastDFS分布式文件系统及源码解析的更多相关文章
- MIT 2012分布式课程基础源码解析一-源码概述
课程主页 课程介绍:本课程会在给出的源码的基础上要求完成8个lab Lab overviewLab 1 - Lock ServerLab 2 - Basic File ServerLab 3 - MK ...
- MIT 2012 分布式课程基础源码解析-底层通讯实现
本节内容和前节事件管理封装是息息相关的,本节内容主要包含的代码在connection{.h, .cc}中. 这里面最主要的有两个类:connection类和tcpsconn类,connetion类主要 ...
- MIT 2012分布式课程基础源码解析-事件管理封装
这部分的内容主要包括Epoll/select的封装,在封装好相应函数后,再使用一个类来管理相应事件,实现的文件为pollmgr.{h, cc}. 事件函数封装 可看到pollmgr.h文件下定一个了一 ...
- MIT 2012分布式课程基础源码解析-线程池实现
主要内容 ScopedLock 队列实现 线程池实现 在正式讲解线程池实现之前,先讲解两个有用的工具类: ScopedLock fifo队列 ScopedLock: ScopedLock是局域锁的实现 ...
- [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路
[源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路 目录 [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路 0x00 摘要 0x01 痛点 0x02 难点 0 ...
- [源码解析] TensorFlow 之 分布式变量
[源码解析] TensorFlow 之 分布式变量 目录 [源码解析] TensorFlow 之 分布式变量 1. MirroredVariable 1.1 定义 1.2 相关类 1.2.1 类体系 ...
- [源码解析] TensorFlow 分布式之 ParameterServerStrategy V1
[源码解析] TensorFlow 分布式之 ParameterServerStrategy V1 目录 [源码解析] TensorFlow 分布式之 ParameterServerStrategy ...
- [源码解析] TensorFlow 分布式之 ParameterServerStrategy V2
[源码解析] TensorFlow 分布式之 ParameterServerStrategy V2 目录 [源码解析] TensorFlow 分布式之 ParameterServerStrategy ...
- [源码解析] TensorFlow 分布式之 ClusterCoordinator
[源码解析] TensorFlow 分布式之 ClusterCoordinator 目录 [源码解析] TensorFlow 分布式之 ClusterCoordinator 1. 思路 1.1 使用 ...
随机推荐
- url的hash和HTML5的history
url的hash和HTML5的history 第一种方法是改变url的hash值. **显示当前路径 : **location.href http://localhost:8080/# 切换路径: l ...
- 模块化开发 | es6模块暴露与引入
CommonJS模块开发 CommonJS定义 每个文件就一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. 私有作用域不会污染全局作用域. 模块可加载多次, ...
- 彻底掌握 Commonjs 和 Es Module
目录 Commonjs commonjs 实现原理 require 文件加载流程 require 模块引入与处理 require 加载原理 require 避免重复加载 require 避免循环引用 ...
- LeetCode刷题 二分专题
二分专题 二分的题目类型 对于满足二段性的题目的两套模板 模板一 模板如下 模板二 模板如下 解决二分题目的一般流程 LeeCode实战 LC69.x的平方根 解法思路 LC35.搜索插入位置 解法思 ...
- sqlalchemy mysql server has gone
mixing multiprocessing and SQLAlchemy is a bad idea. In general your processes should each contain a ...
- Failed to start connector [Connector[HTTP/1.1-8080]]
错误提示:Failed to start connector [Connector[HTTP/1.1-8080]]错误原因:Tomcat端口被占用解决方案(window下):1.cmd打开命令控制台2 ...
- Part 1 to 10 Basic in C#
Part 1 Introduction The struct of C# program: namespace , class and Main method what is namespace? t ...
- 『学了就忘』Linux软件包管理 — 43、RPM包的校验和证书
目录 1.RPM包的校验 (1)RPM包校验基本命令 (2)校验某个系统文件是否被修改举例 (3)验证内容中8个信息的具体内容 (4)文件类型有哪些 2.RPM包的证书 (1)数字证书 (2)数字证书 ...
- NFS导致df -h卡主解决
NFS导致df -h无法使用解决 NFS服务意外断开,导致挂载的客户端"df -Th"命令无法使用,及挂载目录无法"cd""ls"解决思路: ...
- 1-Introduction(介绍)
目录: 正文: (一)機器學習就是让机器自動找函式 语音/图像识别 (二)你想找什麼樣的函式? (2.1)Regression 找出的函数其输出是一个数值 (2.2)Classification (2 ...


