国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

FastDFS Docker化部署 以及 Java SpringMVC實踐

lemanli / 3463人閱讀

摘要:啟動后會連接到告知自己的信息,形成映射關聯,并采用心跳機制保持狀態。存儲節點負責文件的存儲,可以集群部署。一個卷組內之間相互通信,文件進行同步,保證卷內完全一致,所以一個卷的容量以最小的服務器為準。

簡介

FastDFS是一個輕量級分布式文件系統。可以對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,而且可以集群部署,有高可用保障。相應的競品有Ceph、TFS等。相比而言FastDFS對硬件的要求比較低,所以適合中小型公司。

概念

FastDFS服務端由兩個重要部分組成:跟蹤器(Tracker)和存儲節點(Storage)。

Tracker主要做調度工作,在訪問上起負載均衡的作用。Tracker可以做集群部署,各個節點之間是平等的,客戶端請求時采用輪詢機制,某個Tracker不能提供服務時就換另一個。Storage啟動后會連接到Tracker Server告知自己的Group信息,形成映射關聯,并采用心跳機制保持狀態。
Storage存儲節點負責文件的存儲,Storage可以集群部署。

Storage集群有以下特點:

以組(Group)為單位(也有稱呼為卷 Volume的),集群的總容量為所有組的集合。

一個卷(組)內storage server之間相互通信,文件進行同步,保證卷內storage完全一致,所以一個卷的容量以最小的服務器為準。不同的卷之間相互不通信。

當某個卷的壓力較大時可以添加storage server(縱向擴展),如果系統容量不夠可以添加卷(橫向擴展)。

上傳流程

此章節根據資料整理,可能隨著版本有所改變,這里只介紹大致的,以便了解整個運作流程。如果需要深入研究,建議還是以官方文檔為標準。

一,客戶端請求會打到負載均衡層,到tracker server時,由于每個server之間是對等的關系,所以可以任意選擇一個tracker server。

二,到storage層:tracker server接收到upload file請求時,會為該請求分配一個可以存儲該文件的group。

分配group規則:

Round robin 輪詢

Specified group 指定一個group

Load balance 剩余存儲空間多的group優先

三,確定group后,tracker會在group內選擇一個storage server給客戶端。

在group內選擇storage server時規則:

Round robin 輪詢

First server ordered by ip 按ip排序

First server ordered by priority,按優先級排序(優先級在storage上配置)

四,選擇storage path:當分配好storage server后,客戶端向storage發送寫文件請求,storage將會為文件分配一個數據存儲目錄,支持規則如下:

round robin 輪詢

剩余存儲空間最多的優先

五,生成File id:選定存儲目錄之后,storage會為文件生成一個File id。規則如下:

由storage server ip、文件創建時間、文件大小,文件crc32和一個隨機數拼接而成,然后將這個二進制串進程base64編碼,轉換為可打印的字符串。

六,選擇兩級目錄:每個存儲目錄下有兩級256 * 256的子目錄,storage會按文件Field進行兩次hash,路由到其中的一個目錄,然后將文件以file id為文件名存儲到該子目錄下。

一個文件路徑最終由如下組成:組名/磁盤/目錄/文件名

七,客戶端upload file成功后,會拿到一個storage生成的文件名,接下來客戶端根據這個文件名即可訪問到該文件。

下載流程

下載流程如下:

一,選擇tracker server:和upload file一樣,在download file時隨機選擇tracker server。

二,選擇group:tracker發送download請求給某個tracker,必須帶上文件名信息,tracker從文件名中解析出group、大小、創建時間等信息,根據group信息獲取對于的group。

三,選擇storage server:從group中選擇一個storage用來服務讀請求。由于group內的文件同步時在后臺異步進行的,所以有可能出現在讀到的時候,文件還沒有同步到某些storage server上,為了盡量避免反問道這樣的storage,tracker按照一定的規則選擇group內可讀的storage。

文件HTTP預覽服務

Storage還可以結合nginx的fastdfs-nginx-module提供http服務,以實現圖片等預覽功能。

這個部分這里不做介紹,后續可能多帶帶寫篇文章,因為我發現對fastDFS集群提供http服務還是挺復雜,包括我下面找的docker鏡像都不完善,主要是規劃的問題,包括衍生的服務,緩存,以及對圖片的處理(nginx+lua)這些,后續打算研究下,重新開源個docker構建鏡像。

實戰 安裝、部署規劃

FastDFS安裝方法網上有很多教程,這里不多講,我建議使用docker來運行FastDFS,可以自己根據安裝步驟構建自己的鏡像。然后在需要的機器直接運行,后續擴容也方便,再啟動一個storage容器就可以了。

詳細版安裝推薦篇文章:https://segmentfault.com/a/11...

Docker集群搭建

我這里從github上找的一個別人構建好的鏡像,可以直接使用。地址:https://github.com/luhuiguo/f...

使用方法也很簡單

# 啟動一個tracker服務器
docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs luhuiguo/fastdfs tracker

# 啟動storage0
docker run -dti --network=host --name storage0 -e TRACKER_SERVER=10.1.5.85:22122 -v /var/fdfs/storage0:/var/fdfs luhuiguo/fastdfs storage

# 再啟動一個storage1
docker run -dti --network=host --name storage1 -e TRACKER_SERVER=10.1.5.85:22122 -v /var/fdfs/storage1:/var/fdfs luhuiguo/fastdfs storage

# 啟動一個新組的storage
docker run -dti --network=host --name storage2 -e TRACKER_SERVER=10.1.5.85:22122 -e GROUP_NAME=group2 -e PORT=22222 -v /var/fdfs/storage2:/var/fdfs luhuiguo/fastdfs storage
部署注意點

1,原github地址上的usage介紹,啟動storage0和storage1有一個參數錯誤(多一個-e),以我上面發的命令為準。
2,這里的TRACKER_SERVER注意改為你自己的,同一個網段內網ip。

3,實際上這里docker容器之間還是同一個物理主機上部署的(根據network而言),雖然后續可以通過加硬盤,然后新建storage綁定到新加硬盤mount上,但是如果是大公司的生產環境還是推薦建立一個overlay網絡,具體見:https://www.cnblogs.com/bigbe...,這樣可以直接擴物理機集群了。另外這里也提供docker-compose方式啟動服務,實際也不推薦使用,因為tracker和storage server以后必然是分開的,所以還是推薦單個docker容器保持靈活性。這里高級點可以用k8s進行自動擴容(后續打算重新開源個鏡像)。

Java實踐 導入需要包

這里使用官方的客戶端包:https://github.com/happyfish1...

# 下載源碼
git clone https://github.com/happyfish100/fastdfs-client-java.git

cd fastdfs-client-java

# 打jar包
mvn clean install

# 輸出目錄
cd target

# 導入到本地倉庫 注意這里version根據實際生成的來
mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java -Dversion=1.27-SNAPSHOT -Dpackaging=jar -Dfile=fastdfs-client-java-1.27-SNAPSHOT.jar
在pom.xml中引入依賴
    
        org.csource
        fastdfs-client-java
        1.27-SNAPSHOT
    

    
      commons-fileupload
      commons-fileupload
      1.3.1
    

    
      commons-io
      commons-io
      2.2
    

    
      org.apache.commons
      commons-lang3
      3.1
    
添加Client配置

在resource目錄下,添加conf/fdfs_client.conf配置文件

connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 80
http.anti_steal_token = no
http.secret_key = FastDFS1234567890

tracker_server = 192.168.1.163:22122

測試時實際上只需關注tracker_server,并且改為你自己的tracker server

添加文件上傳bean

applicationContext.xml配置中添加文件上傳bean

    
        
        
    
建一個Client封裝

建一個簡單的client封裝(勿作生產使用)
FastDFSClient.java

package com.rootrl.fastDFSDemo.utiles;

import org.apache.commons.lang3.StringUtils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

public class FastDFSClient {

    private static StorageClient1 storageClient1 = null;

    static {
        try {
            // 獲取配置文件
            String classPath = new File(FastDFSClient.class.getResource("/").getFile()).getCanonicalPath();
            String CONF_FILENAME = classPath + File.separator + "conf" + File.separator + "fdfs_client.conf";
            ClientGlobal.init(CONF_FILENAME);
            // 獲取觸發器
            TrackerClient trackerClient = new TrackerClient(ClientGlobal.g_tracker_group);
            TrackerServer trackerServer = trackerClient.getConnection();
            // 獲取存儲服務器
            StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
            storageClient1 = new StorageClient1(trackerServer, storageServer);
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    /**
     * 上傳文件
     * @param fis      文件輸入流
     * @param fileName 文件名稱
     * @return
     */
    public static String uploadFile(InputStream fis, String fileName) {
        try {
            NameValuePair[] meta_list = null;

            //將輸入流寫入file_buff數組
            byte[] file_buff = null;
            if (fis != null) {
                int len = fis.available();
                file_buff = new byte[len];
                fis.read(file_buff);
            }

            String fileid = storageClient1.upload_file1(file_buff, getFileExt(fileName), meta_list);
            return fileid;
        } catch (Exception ex) {
            return null;
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    System.out.println(e);
                }
            }
        }
    }


    /**
     * 獲取文件后綴
     * @param fileName
     * @return
     */
    private static String getFileExt(String fileName) {
        if (StringUtils.isBlank(fileName) || !fileName.contains(".")) {
            return "";
        } else {
            return fileName.substring(fileName.lastIndexOf(".") + 1);
        }
    }
}
建立控制器

然后建立一個File控制器,做測試用
FileController.java

package com.rootrl.fastDFSDemo.controller;

import com.rootrl.fastDFSDemo.utiles.FastDFSClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("fastdfs")
public class FileController {

    @RequestMapping(value = "upload")
    @ResponseBody
    public String uploadFileSample(@RequestParam MultipartFile file){

        try {
            String fileId = FastDFSClient.uploadFile(file.getInputStream(), file.getOriginalFilename());

            return fileId;

        } catch (Exception e) {
            System.out.println(e.getMessage());
            return "error";
        }
    }

}

然后使用postman客戶端測試,url為:http://localhost:8080/fastdfs/upload.do(依據自己實際情況變更)

注意postman使用post請求,然后切換到body/form-data標簽項,添加一個Key為file,類型為file,然后value就可以上傳文件了。成功會返回文件id,類似:group1/M00/00/00/wKgBo1zjxnOAT-k1AAAoMlb3hzU996.png

參考

https://blog.csdn.net/yxflove...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74597.html

相關文章

  • FastDFS Docker部署 以及 Java SpringMVC實踐

    摘要:啟動后會連接到告知自己的信息,形成映射關聯,并采用心跳機制保持狀態。存儲節點負責文件的存儲,可以集群部署。一個卷組內之間相互通信,文件進行同步,保證卷內完全一致,所以一個卷的容量以最小的服務器為準。 簡介 FastDFS是一個輕量級分布式文件系統。可以對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,而且可以集群部署,有高可用保障。相應的競品有Ceph、T...

    li21 評論0 收藏0
  • Java 類文章 - 收藏集 - 掘金

    摘要:而調用后端服務就應用了的高級特分布式配置管理平臺后端掘金輕量的分布式配置管理平臺。關于網絡深度解讀后端掘金什么是網絡呢總的來說,網絡中的容器們可以相互通信,網絡外的又訪問不了這些容器。 在 Java 路上,我看過的一些書、源碼和框架(持續更新) - 后端 - 掘金簡書 占小狼轉載請注明原創出處,謝謝!如果讀完覺得有收獲的話,歡迎點贊加關注 物有本末,事有終始,知所先后,則近道矣 ......

    RayKr 評論0 收藏0
  • 從SpringBoot到SpringMVC

    摘要:概述用久了,深受其約定大于配置的便利性毒害之后,我想回歸到時代,看看開發模式中用戶是如何參與的。備注當然本文所使用的全是非注解的配置方法,即需要在中進行配置并且需要遵循各種實現原則。而更加通用主流的基于注解的配置方法將在后續文章中詳述。 showImg(https://segmentfault.com/img/remote/1460000015244684); 概述 用久了Sprin...

    xavier 評論0 收藏0
  • java

    摘要:多線程編程這篇文章分析了多線程的優缺點,如何創建多線程,分享了線程安全和線程通信線程池等等一些知識。 中間件技術入門教程 中間件技術入門教程,本博客介紹了 ESB、MQ、JMS 的一些知識... SpringBoot 多數據源 SpringBoot 使用主從數據源 簡易的后臺管理權限設計 從零開始搭建自己權限管理框架 Docker 多步構建更小的 Java 鏡像 Docker Jav...

    honhon 評論0 收藏0
  • SpringBoot 中 @SpringBootApplication注解背后的三體結構探秘

    摘要:概述約定大于配置的功力讓我們如沐春風,在我之前寫的文章從到也對比過和這兩個框架,不過最終以超高的代碼信噪比和易上手性讓我們映像頗深。至于,我想在非時代大家應該不陌生吧,作用是配置容器,也即形式的容器的配置類所使用。 showImg(https://segmentfault.com/img/remote/1460000015822144); 概 述 SpringBoot 約定大于配置...

    Tecode 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<