zoukankan      html  css  js  c++  java
  • FastDFS

    一、是什么?

      fastDFS 是以C语言开发的一项开源轻量级分布式文件系统

      他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载)

      特别适合以文件为载体的在线服务,如图片网站,视频网站等

     二、架构

      由跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)构成。

      客户端请求Tracker server进行文件上传、下载,通过Trackerserver调度最终由Storage server完成文件上传和下载。

           Trackerserver:负载均衡和调度,通过Trackerserver在文件上传时可以根据一些策略找到Storageserver提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。

           Storageserver:文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。

      Client:主要是上传下载数据的服务器,也就是我们自己的项目所部署在的服务器

      1)Tracker 集群
             FastDFS集群中的Tracker server可以有多台,Trackerserver之间是相互平等关系同时提供服务,Trackerserver不存在单点故障。客户端请求Trackerserver采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

      2)Storage集群
             Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storageserver之间不会相互通信,同组内的Storageserver之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。

             采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

    三、上传配置文件

    FastDFSClient工具类 :
    package cn.liuhuan.core.util;
    
    import org.csource.fastdfs.TrackerClient;
    
    import org.apache.commons.io.FilenameUtils;
    import org.csource.common.NameValuePair;
    import org.csource.fastdfs.ClientGlobal;
    import org.csource.fastdfs.StorageClient1;
    import org.csource.fastdfs.StorageServer;
    
    import org.csource.fastdfs.TrackerServer;
    
    public class FastDFSClient {
    
       private TrackerClient trackerClient = null;
       private TrackerServer trackerServer = null;
       private StorageServer storageServer = null;
       private StorageClient1 storageClient = null;
    
       public FastDFSClient(String conf) throws Exception {
          if (conf.contains("classpath:")) {
             conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
          }
          ClientGlobal.init(conf);
          trackerClient = new TrackerClient();
          trackerServer = trackerClient.getConnection();
          storageServer = null;
          storageClient = new StorageClient1(trackerServer, storageServer);
       }
    
       /**
        * 上传文件方法
        * <p>Title: uploadFile</p>
        * <p>Description: </p>
        * @param fileName 文件全路径
        * @param extName 文件扩展名,不包含(.)
        * @param metas 文件扩展信息
        * @return
        * @throws Exception
        */
       public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
          String result = storageClient.upload_file1(fileName, extName, metas);
          return result;
       }
    
       public String uploadFile(byte[] file, String fileName, long fileSize) throws Exception {
          NameValuePair[] metas = new NameValuePair[3];
          metas[0] = new NameValuePair("fileName", fileName);
          metas[1] = new NameValuePair("fileSize", String.valueOf(fileSize));
          metas[2] = new NameValuePair("fileExt", FilenameUtils.getExtension(fileName));
          String result = storageClient.upload_file1(file, FilenameUtils.getExtension(fileName), metas);
          return result;
       }
    
       public String uploadFile(String fileName) throws Exception {
          return uploadFile(fileName, null, null);
       }
    
       public String uploadFile(String fileName, String extName) throws Exception {
          return uploadFile(fileName, extName, null);
       }
    
       /**
        * 上传文件方法
        * <p>Title: uploadFile</p>
        * <p>Description: </p>
        * @param fileContent 文件的内容,字节数组
        * @param extName 文件扩展名
        * @param metas 文件扩展信息
        * @return
        * @throws Exception
        */
       public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {
    
          String result = storageClient.upload_file1(fileContent, extName, metas);
          return result;
       }
    
       public String uploadFile(byte[] fileContent) throws Exception {
          return uploadFile(fileContent, null, null);
       }
    
       public String uploadFile(byte[] fileContent, String extName) throws Exception {
          return uploadFile(fileContent, extName, null);
       }
    }

    pom.xml依赖:
    <!--fastDFS-->
    <dependency>
        <groupId>org.csource.fastdfs</groupId>
        <artifactId>fastdfs</artifactId>
        <version>1.2</version>
    </dependency>
    <!-- 文件上传组件 -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>${commons-fileupload.version}</version>
    </dependency>

    UploadController :
    public class UploadController {
        //文件服务器地址
        @Value("${FILE_SERVER_URL}")
        private String FILE_SERVER_URL;
        //上传文件
        @RequestMapping("/uploadFile")
        public Result uploadFile(MultipartFile file){
            try{
                FastDFSClient fastDFSClient = new FastDFSClient("classpath:fastDFS/fdfs_client.conf");
                String path = fastDFSClient.uploadFile(file.getBytes(), file.getOriginalFilename(), file.getSize());
                return new Result(true,FILE_SERVER_URL+path);
            }catch (Exception e){
                e.printStackTrace();
                return new Result(false,"上传失败");
            }
        }
    }
    

      

            

    ————————————————
    版权声明:本文为CSDN博主「bug发现与制造」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/KamRoseLee/article/details/80334621

  • 相关阅读:
    别折腾自己
    在线工具集合
    搜索新技能
    saml login的流程
    给学网 好网站
    drush .. drupal console
    地铁健身操
    js扩展符号
    for in | for in 比较 解释 | 以后找知识点先从这里面搜索
    grep 查找字符串 在文件或者文件夹中
  • 原文地址:https://www.cnblogs.com/shiliuhuanya/p/12073540.html
Copyright © 2011-2022 走看看