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 使用 ...
随机推荐
- 一个校验接口引发的思考--我真的了解Response吗
一个校验接口 最近,我需要对接一个外部接口,基本功能是:校验指定的门店是否完善了货运信息.接口大致是这样的: POST https://******/Dealer/CheckCarrier Heads ...
- c++学习笔记3(动态内存分配)
为了效率,需要按需去进行动态内存分配,在c中,可以用malloc去实现动态内存分配,而在c++中,则用new运算符去实现. 用法一:动态分配一个变量的存储空间 p=new T T为类型名 P则为T*类 ...
- [bzoj2400]Optimal Marks
首先肯定每一位单独考虑,对于每一位,源点连向该位点权为0的节点inf的边,点权为1的节点连向汇点inf的边,每一条无向边拆成两条流量为1的有向边,跑最小割. 考虑一组割,一定将原图划分成源点和汇点两部 ...
- [luogu4548]歌唱王国
(可以参考hdu4652,因此推导过程比较省略) 类似的定义$f_{i}$和$g_{i}$,同样去插入$len$个字符,但注意到并不是任意一个位置都可以作为结尾,$i+j$可以作为结尾当且仅当$s[0 ...
- [bzoj1232]安慰奶牛
先考虑边的代价,容易发现每一条边都需要走两次,也就是2*边权再考虑点的代价,由于上面的结论,那么就是度数*点权然后就可以构造新的边权为2*原边权+连接点的点权,然后求最小生成树即可注意根还有一个点权, ...
- ound interface org.elasticsearch.common.bytes.BytesReference, but class was expected
es得版本和本地项目不一致.. 配置es版本,现在使用得是5.2得版本,可是 maven上看到 elasticsearch-rest-high-level-client 最低也得6版本.下载安装高版本 ...
- 寒武纪加速平台(MLU200系列) 摸鱼指南(四)--- 边缘端实例程序分析
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- JavaSE复习巩固
第二天:复习if语句,扫描器,switch语句,循环语句 1.if语句---流程控制语句 if之前学的语句是顺序结构 1.1 单个if的语法结构 if(条件判断){ 满足条件需要做的事情: } int ...
- CF1575G GCD Festival
\(\sum\sum gcd(i,j) \times gcd(a_i,a_j)\) 考虑枚举这个 \(gcd(i,j)\) . \(\sum_d \varphi(d)\sum_{i|d}\sum_{j ...
- BZOJ 3729 - Gty的游戏(Staircase 博弈+时间轴分块)
题面传送门 介于自己以前既没有写过 Staircase-Nim 的题解,也没写过时间轴分块的题解,所以现在就来写一篇吧(fog 首先考虑最极端的情况,如果图是一条链,并且链的一个端点是 \(1\),那 ...