図1に示すように、分散ファイル・ストレージ・システム
あなたは上記の、そしてあなたが管理画像のファイルサーバーを必要とするどのサーバに画像を見つけることができないので、原因複数のサーバーに、写真をアップロードします。
FastDFSファイルサーバです。
2、FastDFS
1つのサポートアップロード - >私たちのリターンパスを与えます
2件のサポートダウンロード - >パスを使用してダウンロード
小さなファイル分散ファイル・ストレージ・システム:
文書Gが小さなファイルよりも小さい場合、ファイルをせずに分割することができます
大きなファイルを分割する必要があります。
FastDFSは、分散ファイル・ストレージ・システムは、2つの部分から構成されています。
1トラッカー(追跡)
2記憶装置(メモリ)
あなたがFastDFSの容量を拡張したい場合は、非常に便利な、グループがライン上で直接追加しました
ビルドに3、FastDFS
サーバーコンテナに作成3.1、FastDFS
3.1.1準備トラッカーを
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh
3.1.2ストレージを準備
1つのパブリックアドレス:パブリックネットワークを使用して、開発
2プライベートアドレス:上のオンラインサービス、プライベートネットワークの使用
docker run -d --name storage --net=host -e TRACKER_IP=服务器公网:22122 -e GROUP_NAME=g1 morunchang/fastdfs sh storage.sh
あなたは使用することができdocker logs 容器名称
、血管が正常に動作して表示するためのコマンドを。
同一グループ内のストレージ・ファイルがバックアップされます。
負荷分散を使用することができます異なるグループに位置しています。
3.2、プロジェクトの依存関係を追加
<!--spring boot项目导入的依赖-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.7</version>
</dependency>
<!--测试类依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3.3、YMLプロフィール
fdfs:
tracker-list: #TrackerList参数,支持多个
- 192.168.1.105:22122
- 192.168.1.106:22122
3.4テスト動作fastdfs
package com.zxm.test;
import com.github.tobato.fastdfs.domain.fdfs.StorageNode;
import com.github.tobato.fastdfs.domain.fdfs.StorageNodeInfo;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadFileWriter;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.github.tobato.fastdfs.service.TrackerClient;
import com.zxm.utils.FastdfsUtil;
import lombok.SneakyThrows;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileInputStream;
import java.util.HashSet;
@SpringBootTest
@RunWith(SpringRunner.class)
public class FileUploadTest {
@Autowired
private FastFileStorageClient fastFileStorageClient;
@Autowired
private TrackerClient trackerClient;
/**
* 文件的上传
*/
@SneakyThrows
@Test
public void updateLoadTest(){
// 也可以上传视频。只需要填入视频路径,然后将fileExtName换为视频的后缀就行。
File file = new File("C:/Users/86131/Pictures/Saved Pictures/1.jpg");
String path = fastFileStorageClient.uploadFile(
new FileInputStream(file),
file.length(),
"jpg",
new HashSet<>(0)).getFullPath();
System.out.println(path);
}
/**
* 文件的下载
*/
@Test
public void testDownload(){
String path = "C:/Users/86131/Desktop/临时文件夹/d2.jpg";
fastFileStorageClient.downloadFile("g1","M00/00/00/rBHR8l5h-T6AQTubAApSuL6VXKQ831.jpg", new DownloadFileWriter(path));
}
/**
* 文件的删除
* 删除之后,还可以访问,但是不能下载了。
*/
@Test
public void testDelete(){
String fullPath = "g1/M00/00/00/rBHR8l5nSzeAS0pmAAVS7KokxMQ062.jpg";
String groupName = FastdfsUtil.parseGroup(fullPath);
System.out.println(groupName);
String path = fullPath.replaceFirst(groupName+"/", "");
System.out.println(path);
fastFileStorageClient.deleteFile(groupName,path);
System.out.println("删除完成");
// 或者直接使用下述方法就可删除。
// fastFileStorageClient.deleteFile("g1","M00/00/00/rBHR8l5nSzeAS0pmAAVS7KokxMQ062.jpg");
}
@Test
public void trackerTest(){
/**
* 文件下载时候用到。
* fetchStorage对象中包含组名,storage的服务器ip,端口
*/
StorageNodeInfo fetchStorage = trackerClient.getFetchStorage("g1", "M00/00/00/rBHR8l5nSzeAS0pmAAVS7KokxMQ062.jpg");
/**
* 文件上传时候用到
* 得到当前注册到tracker上面的storege
* 不同组可以使用负载均衡。
*/
StorageNode storeStorage = trackerClient.getStoreStorage();
}
}
3.5、コントローラアプリケーションfastDFS
package com.zxm.controller;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
/**
* 负责文件上传的控制器
*/
@RestController
@RequestMapping("/admin/file")
public class FileController {
@Autowired
private FastFileStorageClient fastFileStorageClient;
// http://47.94.225.69:8080 fastDFS自定义地址配置。
// 此处使用@Value注解从yml配置文件中注入。
@Value("${resources.url}")
private String serverAddress;
/**
* 上传一个图片
* @param file
* @return
*/
@SneakyThrows
@PostMapping("/upload/element")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file){
// 开始上传文件
String fullPath = fastFileStorageClient.uploadFile(
file.getInputStream(),
file.getSize(),
"jpg",
null).getFullPath();
return ResponseEntity.ok(serverAddress+"/"+fullPath);
}
}
# fastdfs的自定义地址配置
resources:
url: http://47.94.225.69:8080
原則分析fastdfs 4、
4.1、fastDFSファイルのアップロードプロセス
トラッカーはまた、複数のストレージからの1つの操作を選択、負荷分散の効果を有します。
4.2、fastDFSファイルのダウンロードプロセス
5、FastDFS組み合わせとnginxの
ロード・バランシング・トラッカーを行うには5.1、
同時性の高い金額を運ぶためには、トラッカーのクラスタを行うことができます。nginxの負荷分散を使用する必要があります。
5.2、nginxのfastdfs-nginxの、プラグインモジュールの役割
トラッカーサーバー、ストレージ、ストレージ、ストレージサーバ上のが、ファイルのコピーを入力するには、同じグループの必要性の間でファイルサーバ、ストレージ、同期遅延の問題により、FastDFS
成功したファイルのアップロードIDがクライアントに返された後、ストレージサーバ11にファイルをアップロードするためにトラッカーサーバーを想定しています。この時点で、FastDFSストレージクラスタメカニズムは、ファイルのテイク12ストレージ・サーバー内のファイルIDた場合、ファイルはクライアントのコピーを完了していない場合は、ファイルにアクセスすることはできません、ストレージストレージサーバ12の同じセットにファイルを同期しますエラー。(ストレージサーバ11とストレージサーバ12は、同じストレージグループです)
しかし、ストレージサーバのストレージグループの間で、同期遅延の問題を同じファイルコピーにアクセスする必要があります
成功したファイルのアップロードIDがクライアントに返された後、ストレージサーバ11にファイルをアップロードするためにトラッカーサーバーを想定しています。この時点で、FastDFSストレージクラスタメカニズムは、ファイルのテイク12ストレージ・サーバー内のファイルIDた場合、ファイルはクライアントのコピーを完了していない場合は、ファイルにアクセスすることはできません、ストレージストレージサーバ12の同じセットにファイルを同期しますエラー。(ストレージサーバ11とストレージサーバ12は、同じストレージグループです)
ファイルは、ファイル取るソースサーバー(ストレージサーバ11)をアップロードするときfastdfs-nginxのモジュールの接続は、ファイルにリダイレクトすることができため、到達不能エラーによる遅延を回避ファイルのコピークライアントを。