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 使用 ...
随机推荐
- Vuex状态管理——任意组件间通信
核心概念 在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信. 每一个 Vuex 应用的 ...
- 手撸一个IOC容器
IoC 什么是IoC? IoC是Inversion of Control(控制反转)的简称,注意它是一个技术思想.描述的是对象创建.管理的事情. 传统开发方式:比如类A依赖类B,往往会在类A里面new ...
- 第九届网安竞赛writeup
web easysql[已解决] uname=a') union select 1,extractvalue(1, concat(0x7e, (select database()),0x7e))#&a ...
- IDEA安装热部署插件JRebel
首先说下热部署是什么意思吧,简单了说就是在我们对代码进行更改之后,不需要重启项目,重新编译一下就可以直接运行最新的代码的部署方式.既然是部署方式,项目启动部署的时候当然就会和正常情况下不一样啦~ JR ...
- 9组-Alpha冲刺-1/6
一.基本情况 队名:不行就摆了吧 组长博客:https://www.cnblogs.com/Microsoft-hc/p/15526668.html 小组人数: 8 二.冲刺概况汇报 谢小龙 过去两天 ...
- oracle 连接数据库并查询,返回List<Map<String, Object>> 数据
package JDBC; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; impor ...
- 分布式事务(七)之Seata简介
在前面的文章中,我们介绍了分布式事务的概念以及一些解决方案.fenSeata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用户提供了AT.TCC.SAGA和 ...
- ServerBootstrap的handler()和childHandler()区别
无论服务端还是客户端都进行了handler的设置,通过添加hanlder,我们可以监听Channel的各种动作以及状态的改变,包括连接,绑定,接收消息等. 区别: 1. handler在初始化时就会执 ...
- 【GS文献】基因组选择在植物分子育种应用的最新综述(2020)
目录 1. 简介 2. BLUP类模型 3. Bayesian类模型 4. 机器学习 5. GWAS辅助的GS 6. 杂交育种 7. 多性状 8. 长期选择 9. 预测准确性评估 10. GS到植物育 ...
- 【GS模型】使用R包sommer进行基因组选择的GBLUP和RRBLUP分析?
目录 简介 GS示例代码 简介 R包sommer内置了C++,运算速度还是比较快的,功能也很丰富,可求解各种复杂模型.语法相比于lme4包也要好懂一些. 建议查看文档:vignette("v ...