1.fastFDS是什么?有什么作用?
fastFDS是一個(gè)開源的輕量級(jí)的分布式文件系統(tǒng),他對(duì)文件進(jìn)行管理,功能包括:文件存儲(chǔ),文件同步,文件訪問(wèn)(文件上傳,文件下載)等,解決了大容量存儲(chǔ)和負(fù)載均衡的問(wèn)題,特別適合以文件為載體的在線服務(wù),如相冊(cè)網(wǎng)站,視頻網(wǎng)站等等.
2.fastFDS服務(wù)端有兩個(gè)角色:
跟蹤器:tracker,主要做調(diào)度工作,在訪問(wèn)上起負(fù)載均衡的作用
存儲(chǔ)節(jié)點(diǎn):storage,
存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)文件蝇闭,完成文件管理的所有功能:就是這樣的存儲(chǔ)敷矫、同步和提供存取接口,F(xiàn)astDFS同時(shí)對(duì)文件的metadata進(jìn)行管理饱普。所謂文件的meta data(元數(shù)據(jù))就是文件的相關(guān)屬性,以鍵值對(duì)(key valuepair)方式表示,如:width=1024,其中的key為width外潜,value為1024。文件metadata是文件屬性列表挠唆,可以包含多個(gè)鍵值對(duì)处窥。
跟蹤器和存儲(chǔ)節(jié)點(diǎn)都可以由一臺(tái)或多臺(tái)服務(wù)器構(gòu)成。跟蹤器和存儲(chǔ)節(jié)點(diǎn)中的服務(wù)器均可以隨時(shí)增加或下線而不會(huì)影響線上服務(wù)玄组。其中跟蹤器中的所有服務(wù)器都是對(duì)等的滔驾,可以根據(jù)服務(wù)器的壓力情況隨時(shí)增加或減少谒麦。
為了支持大容量,存儲(chǔ)節(jié)點(diǎn)(服務(wù)器)采用了分卷(或分組)的組織方式哆致。存儲(chǔ)系統(tǒng)由一個(gè)或多個(gè)卷組成绕德,卷與卷之間的文件是相互獨(dú)立的,所有卷的文件容量累加就是整個(gè)存儲(chǔ)系統(tǒng)中的文件容量摊阀。一個(gè)卷可以由一臺(tái)或多臺(tái)存儲(chǔ)服務(wù)器組成耻蛇,一個(gè)卷下的存儲(chǔ)服務(wù)器中的文件都是相同的,卷中的多臺(tái)存儲(chǔ)服務(wù)器起到了冗余備份和負(fù)載均衡的作用胞此。 在卷中增加服務(wù)器時(shí)臣咖,同步已有的文件由系統(tǒng)自動(dòng)完成,同步完成后豌鹤,系統(tǒng)自動(dòng)將新增服務(wù)器切換到線上提供服務(wù).
當(dāng)存儲(chǔ)空間不足或即將耗盡時(shí)亡哄,可以動(dòng)態(tài)添加卷。只需要增加一臺(tái)或多臺(tái)服務(wù)器布疙,并將它們配置為一個(gè)新的卷,這樣就擴(kuò)大了存儲(chǔ)系統(tǒng)的容量愿卸。
FastDFS中的文件標(biāo)識(shí)分為兩個(gè)部分:卷名和文件名灵临,二者缺一不可。
上傳交互過(guò)程
- client詢問(wèn)tracker上傳到的storage趴荸,不需要附加參數(shù)儒溉;
- tracker返回一臺(tái)可用的storage;
- client直接和storage通訊完成文件上傳发钝。
FastDFS file download
java實(shí)現(xiàn)文件的上傳功能,
應(yīng)用:
1.上傳controller:
/**
* 采用分布式文件上傳系統(tǒng)完成圖片異步上傳
* @param file
* @return
* @throws Exception
* @throws Exception
*/
@RequestMapping("console/brand/upload.do")
@ResponseBody
public HashMap<String , String> upload(@RequestParam("pic")MultipartFile file) throws Exception, Exception{
HashMap<String, String> map = new HashMap<>();
System.out.println(file.getOriginalFilename());
//通過(guò)分布式文件系統(tǒng)上傳文件,獲取文件的訪問(wèn)地址
String path = FastDFSTools.uploadFile(file.getBytes(),file.getOriginalFilename());
//打印文件上傳后傳回的文件地址
System.out.println(path);
//將文件上傳后,分布式文件系統(tǒng)返回的圖片路徑放入map中,返回給前端以回顯圖片(通過(guò)ngnix進(jìn)行訪問(wèn)圖片)
map.put("path", Constants.FDFS_SERVER + path);
return map;
}
2.上傳的常量參數(shù)設(shè)置,及ngnix的訪問(wèn)路徑:
package cn.babasport.common;
public class Constants {
public static final String FDFS_SERVER = "http://192.168.57.105:8888/";
}
3.上傳工具類
package cn.babasport.common;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.commons.io.FilenameUtils;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;
public class FastDFSTools {
public static String uploadFile(byte[] bytes, String filename) throws Exception, IOException, Exception {
//獲取配置文件的絕對(duì)路徑
ClassPathResource pathResource = new ClassPathResource("fdfs_client.conf");
//初始化客戶端
ClientGlobal.init(pathResource.getClassLoader().getResource("fdfs_client.conf").getPath());
//創(chuàng)建分布式文件管理客戶端
TrackerClient trackerClient = new TrackerClient();
//獲取文件管理的服務(wù)
TrackerServer tc = trackerClient.getConnection();
//獲取分布式文件存儲(chǔ)端
StorageClient1 storageClient = new StorageClient1(tc, null);
//獲取文件的擴(kuò)展名
String extension = FilenameUtils.getExtension(filename);
//通過(guò)文件存儲(chǔ)端上傳文件,并返回存放在fastFDS中文件中的位置
String upload_file1 = storageClient.upload_file1(bytes, extension, null);
return upload_file1;
}
}