FastDFS引入连接池fastdfs-client

在上篇《记一次fastdfs高并发下上传失败的问题》文章中,我改造了我的程序,本以为是成功解决了dfs在高并发情况下的io问题,但是这个问题解决的不彻底,有时候还会出现。所以我决定引入连接池。

我用的是tobato大神写连接池,在这里简单介绍一下,具体大家可以直接去看源码

地址:GitHub - tobato/FastDFS_Client: Java Client for FastDFS

FastDFS论坛:FastDFS FAQ (欢迎反馈,我将及时整理) - 分布式文件系统(FastDFS)-Chinaunix

主要特性

  1. 对关键部分代码加入单元测试,理解与服务端的接口交流,提高接口质量
  2. 将以前对字节解析样式为使用对象+注解解的形式,努力增强了代码的硬性
  3. 支持对服务端的连接池管理(commons-pool2)
  4. 支持上传图片时检查图片格式,并且自动生成
  5. 在SpringBoot中自动导入依赖

使用接口服务对dfs服务端进行操作

主要接口包括

  1. TrackerClient - TrackerServer 接口
  2. GenerateStorageClient - 一般文件存储(StorageServer接口接口)
  3. FastFileStorageClient - 为方便项目开发集成的简单接口(StorageServer接口)
  4. AppendFileStorageClient - 支持文件续传操作的接口(StorageServer接口)

Maven 依赖

<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.27.2</version>
</dependency>

application.yml配置

配置参数可以根据配置情况自行调整

# 分布式文件系统FDFS配置
fdfs:
  #读取时间
  so-timeout: 20000
  #连接超时时间
  connect-timeout: 20000
  thumb-image:             #缩略图生成参数
    width: 150
    height: 150
  tracker-list:            #TrackerList参数,支持多个
    - 127.0.0.1:22122
  pool:
    #从池中借出的对象的最大数目(配置为-1表示不限制)
    max-total: 30
    #每个key最大连接数
    max-total-per-key: 25
    #每个key对应的连接池最大空闲连接数
    max-idle-per-key: 10
    #每个key对应的连接池最小空闲连接数
    min-idle-per-key: 5

使用方式

直接注入对象调用api即可

注入FastFileStorageClient对象,直接调用api即可

/**
 * 上传一般文件
 *
 * @param inputStream
 * @param fileSize
 * @param fileExtName
 * @param metaDataSet
 * @return
 */
StorePath uploadFile(InputStream inputStream, long fileSize, String fileExtName, Set<MetaData> metaDataSet);

/**
 * 上传图片并且生成缩略图
 * <pre>
 * 支持的图片格式包括"JPG", "JPEG", "PNG", "GIF", "BMP", "WBMP"
 *
 * 缩略图为上传文件名+缩略图后缀 _150x150,如 xxx.jpg,缩略图为 xxx_150x150.jpg
 *
 * 实际样例如下
 *
 *  原图   http://localhost:8098/M00/00/17/rBEAAl33pQaAWNQNAAHYvQQn-YE374.jpg
 *  缩略图 http://localhost:8098/M00/00/17/rBEAAl33pQaAWNQNAAHYvQQn-YE374_150x150.jpg
 *
 * </pre>
 *
 * @param inputStream
 * @param fileSize
 * @param fileExtName
 * @param metaDataSet
 * @return
 */
StorePath uploadImageAndCrtThumbImage(InputStream inputStream, long fileSize, String fileExtName,
                                      Set<MetaData> metaDataSet);

/**
 * 上传图片
 * <pre>
 * 可通过fastImageFile对象配置
 * 1. 上传图像分组
 * 2. 上传元数据metaDataSet
 * 3. 是否生成缩略图
 *   3.1 根据默认配置生成缩略图
 *   3.2 根据指定尺寸生成缩略图
 *   3.3 根据指定比例生成缩略图
 * <pre/>
 *
 * @param fastImageFile 上传文件配置
 * @return
 */
StorePath uploadImage(FastImageFile fastImageFile);


/**
 * 上传文件
 * <pre>
 * 可通过fastFile对象配置
 * 1. 上传图像分组
 * 2. 上传元数据metaDataSet
 * <pre/>
 * @param fastFile
 * @return
 */
StorePath uploadFile(FastFile fastFile);

/**
 * 删除文件
 *
 * @param filePath 文件路径(groupName/path)
 */
void deleteFile(String filePath);

上一篇:nginx添加fastdfs-nginx-module模块(非覆盖安装)(on ubuntu18.04)


下一篇:手把手教你用 FastDFS 构建分布式文件管理系统