SpringBoot2整合FastDFS中间件,实现文件分布式管理

SpringBoot2整合FastDFS中间件,实现文件分布式管理

一、FastDFS

​ FastDFS是由淘宝的余庆先⽣生所开发,是⼀一个轻量量级、⾼高性能的开源分布式⽂文件系统,⽤用纯C语⾔言开 发,包括⽂文件存储、⽂文件同步、⽂文件访问(上传、下载)、存取负载均衡、在线扩容、相同内容只存储 ⼀一份等功能,适合有⼤大容量量存储需求的应⽤用或系统。做分布式系统开发时,其中要解决的⼀一个问题就是 图⽚片、⾳音视频、⽂文件共享的问题,分布式⽂文件系统正好可以解决这个需求。同类的分布式⽂文件系统有⾕谷 歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。

二、FastDFS系统架构:

三、FastDFS⽂文件上传流程

  1. client询问tracker上传到的storage,不需要附加参数;
  2. tracker返回⼀台可用的storage;
  3. client直接和storage通讯完成文件上传。

四、FastDFS文件下载流程

  1. client询问tracker下载文件的storage,参数为⽂文件标识(组名和⽂文件名);
  2. tracker返回⼀台可⽤用的storage;
  3. client直接和storage通讯完成⽂文件下载。

五、核心角色

FastDFS是由跟踪服务器(trackerserver)、存储服务器(storageserver)和客户端(client)三个部分组成。

1)跟踪服务器

FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group到[storage server list]的映射表。

2)存储服务器

以组(group)为单位,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。

3)客户端

业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。

六、创建SpringBoot工程

6.1、pom文件

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- FastDFS依赖 -->
        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.5</version>
        </dependency>
        <!-- Swagger2 核心依赖 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

6.2、application.yml

spring:
  application:
    name: zms-fast-dfs
  servlet:
    multipart:
      enabled: true
      max-file-size: 10MB
      max-request-size: 20MB
server:
  port: 8122

fdfs:
  # 链接超时
  connect-timeout: 300
  # 读取时间
  so-timeout: 300
  # 生成缩略图参数
  thumb-image:
    width: 150
    height: 150
  tracker-list: 118.24.39.10:22122

6.3、配置

6.3.1、FastDfsConfiguration
@Configuration
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration= RegistrationPolicy.IGNORE_EXISTING)
public class FastDfsConfiguration {

}
6.3.2、SwaggerConfig
@Configuration
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.springboot.fastdfs"))
                .paths(PathSelectors.any())
                .build();
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SpringBoot整合fastDF接口测试")
                .description("作者:ZongMan")
                .termsOfServiceUrl("http://zongmansheng.gitee.io/")
                .version("version 1.0")
                .build();
    }
}

6.4、工具类

@Component
public class FileDfsUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(FileDfsUtil.class);
    @Resource
    private FastFileStorageClient storageClient ;
    /**
     * 上传文件
     */
    public String upload(MultipartFile multipartFile) throws Exception{
        String originalFilename = multipartFile.getOriginalFilename().
                substring(multipartFile.getOriginalFilename().
                        lastIndexOf(".") + 1);
        StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
                multipartFile.getInputStream(),
                multipartFile.getSize(),originalFilename , null);
        return storePath.getFullPath() ;
    }
    /**
     * 删除文件
     */
    public void deleteFile(String fileUrl) {
        if (StringUtils.isEmpty(fileUrl)) {
            LOGGER.info("fileUrl ------> 文件路径为空");
            return;
        }
        try {
            StorePath storePath = StorePath.parseFromUrl(fileUrl);
            storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
        } catch (Exception e) {
            LOGGER.info(e.getMessage());
        }
    }
}

6.5、controller

@RestController
public class FileController {

    @Resource
    private FileDfsUtil fileDfsUtil ;
    /**
     * 文件上传
     */
    @ApiOperation(value="上传文件", notes="测试FastDFS文件上传")
    @RequestMapping(value = "/uploadFile",headers="content-type=multipart/form-data", method = RequestMethod.POST)
    public ResponseEntity<String> uploadFile (@RequestParam("file") MultipartFile file){
        String result ;
        try{
            String path = fileDfsUtil.upload(file) ;
            if (!StringUtils.isEmpty(path)){
                result = path ;
            } else {
                result = "上传失败" ;
            }
        } catch (Exception e){
            e.printStackTrace() ;
            result = "服务异常" ;
        }
        return ResponseEntity.ok(result);
    }
    /**
     * 文件删除
     */
    @RequestMapping(value = "/deleteByPath", method = RequestMethod.GET)
    public ResponseEntity<String> deleteByPath (){
           String filePathName = "group1/M00/00/00/rBAAB12HNaeAdfRXAAA4ubrcS4o415_150x150.jpg";
        fileDfsUtil.deleteFile(filePathName);
        return ResponseEntity.ok("看到这个你就删除成功啦!报仇啦!!!") ;
    }
}

七、启动并访问Swagger

访问地址:http://127.0.0.1:8122/swagger-ui.html#/

八、源码地址

https://gitee.com/zongmansheng/springboot-zms


 上一篇
RabbitMQ RabbitMQ
2019-09-24 ZongMan
下一篇 
CentOS7安装软件 CentOS7安装软件
CentOS7安装软件一、工具 云服务器:安装CentOS 7 远程连接工具:FinalShell 二、安装java环境下载jdk1.8 wget –no-cookies –no-check-certificate –header “Co
2019-09-20