记录一次本人学习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分布式文件系统及源码解析的更多相关文章

  1. MIT 2012分布式课程基础源码解析一-源码概述

    课程主页 课程介绍:本课程会在给出的源码的基础上要求完成8个lab Lab overviewLab 1 - Lock ServerLab 2 - Basic File ServerLab 3 - MK ...

  2. MIT 2012 分布式课程基础源码解析-底层通讯实现

    本节内容和前节事件管理封装是息息相关的,本节内容主要包含的代码在connection{.h, .cc}中. 这里面最主要的有两个类:connection类和tcpsconn类,connetion类主要 ...

  3. MIT 2012分布式课程基础源码解析-事件管理封装

    这部分的内容主要包括Epoll/select的封装,在封装好相应函数后,再使用一个类来管理相应事件,实现的文件为pollmgr.{h, cc}. 事件函数封装 可看到pollmgr.h文件下定一个了一 ...

  4. MIT 2012分布式课程基础源码解析-线程池实现

    主要内容 ScopedLock 队列实现 线程池实现 在正式讲解线程池实现之前,先讲解两个有用的工具类: ScopedLock fifo队列 ScopedLock: ScopedLock是局域锁的实现 ...

  5. [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路

    [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路 目录 [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路 0x00 摘要 0x01 痛点 0x02 难点 0 ...

  6. [源码解析] TensorFlow 之 分布式变量

    [源码解析] TensorFlow 之 分布式变量 目录 [源码解析] TensorFlow 之 分布式变量 1. MirroredVariable 1.1 定义 1.2 相关类 1.2.1 类体系 ...

  7. [源码解析] TensorFlow 分布式之 ParameterServerStrategy V1

    [源码解析] TensorFlow 分布式之 ParameterServerStrategy V1 目录 [源码解析] TensorFlow 分布式之 ParameterServerStrategy ...

  8. [源码解析] TensorFlow 分布式之 ParameterServerStrategy V2

    [源码解析] TensorFlow 分布式之 ParameterServerStrategy V2 目录 [源码解析] TensorFlow 分布式之 ParameterServerStrategy ...

  9. [源码解析] TensorFlow 分布式之 ClusterCoordinator

    [源码解析] TensorFlow 分布式之 ClusterCoordinator 目录 [源码解析] TensorFlow 分布式之 ClusterCoordinator 1. 思路 1.1 使用 ...

随机推荐

  1. 开源支持东财自动交易的简单量化交易框架pytrader

    pytrader是基于 easytrader 和 easyquotation 的量化交易框架,支持东方财富自动交易,支持进行策略回测. 开源地址:https://github.com/jadepeng ...

  2. 终论到底该不该写isDebugEnabled

    以前: 很多日志框架都不支持{}模板的写法(如Log4j1.X, Apache Commons Logging),于是只能通过字符串拼接来输出日志内容: log.debug("debug日志 ...

  3. python实现膨胀与腐蚀

    目录: (一)膨胀 (二)腐蚀 (三)腐蚀代码(erode) (四)膨胀代码(dilate) (一)膨胀(或) (二)腐蚀(与) (三)腐蚀代码(erode) 1 def erode_demo(ima ...

  4. request.setAttribute()和session.setAttribute()的区别详解

    我们在Servlet和页面间传值时,经常会用到request.setAttribute()和session.setAttribute(),下面是两段示例用法 request.setAttribute( ...

  5. 【JavaSE】finally块不被执行的情况总结

    finally块不被执行的情况总结 2019-08-03  22:23:02  by冲冲 finally块的作用 通常用于处理善后工作.当try块里出现异常时,会立即跳出try块,到catch块匹配对 ...

  6. Redis线程模型的前世今生

    一.概述 众所周知,Redis是一个高性能的数据存储框架,在高并发的系统设计中,Redis也是一个比较关键的组件,是我们提升系统性能的一大利器.深入去理解Redis高性能的原理显得越发重要,当然Red ...

  7. [NOI2020] 超现实树

    我们定义链树为:在该树上的任意节点,左右子树大小的最小值小于2. 举个例子: 那么我们思考,链树显然可以在叶子节点任意替换成其他子树. 那么在主链上,我们可以做到生成任意深度大于主链长度的树. 反过来 ...

  8. 洛谷 P4183 - [USACO18JAN]Cow at Large P(点分治)

    洛谷题面传送门 点分治 hot tea. 首先考虑什么样的点能够对以 \(u\) 为根的答案产生 \(1\) 的贡献.我们考虑以 \(u\) 为根对整棵树进行一遍 DFS.那么对于一个点 \(v\), ...

  9. Augustus 进行基因注释

      目前的从头预测软件大多是基于HMM(隐马尔科夫链)和贝叶斯理论,通过已有物种的注释信息对软件进行训练,从训练结果中去推断一段基因序列中可能的结构,在这方面做的最好的工具是AUGUSTUS它可以仅使 ...

  10. go定义接口以及类怎么使用接口

    go定义接口以及类怎么使用接口 多态是指代码可以根据类型的具体实现采取不同行为的能力.如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值. 接口是用来定义行为的类型.这些被定义 ...