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的配置就可以用了,研究了一番发现如下:
![](https://img2020.cnblogs.com/blog/1666804/202004/1666804-20200428181235034-1277447024.png)
接下来我就开始看改jar包的源码了,我们可以直接在IDE里下载,下载后源码可以看到中文注释,十分的爽
![](https://img2020.cnblogs.com/blog/1666804/202004/1666804-20200428181512155-962347698.png)
首先可以看一下,包结构以及各个类的继承关系,这里推荐使用IDE看,对着类名按Ctrl+h就可以看到该类的上下结构 或者使用Ctrl+Alt+Shift+U可以看到更详细的关系层次图.
开始一步步分析源码,客户端API接口为FastFileStorageClient,该类是一个接口,最终的实现类为DefaultFastFileStorageClient
下面我们来分析一下这个类,该类实现了接口FastFileStorageClient,FastFileStorageClient包含了一写上传下载文件等API,该接口继承了
GenerateStorageClient说明这是在根接口上扩展一些APi接口.
FastFileStorageClient继承了类DefaultGenerateStorageClient,该类是基本存储客户端操作实现,也就是说基础的存储功能用这个类就行了,下面我们来分析一下这个类.
就找一个uploadFile()方法来说一下,其它的也是换汤不换药的,理解整体思路就行了.
![](https://img2020.cnblogs.com/blog/1666804/202004/1666804-20200428213044458-1252006529.png)
看到首先从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呢 ,送给你们了!!!哈哈哈