分布式項目中涉及到的文件上傳與下載,此時使用之前的上傳方式,將上傳的文件與當前項目所在服務器放在同一個位置,顯然不符合分布式項目的理念,此時我們借助FastDFS將上傳的文件數據存儲到單純的一個服務器中。
一、先介紹下什么是FastDFS
FastDFS 是用 c 語言編寫的一款開源的分布式文件系統。包括 Tracker server 和 Storage server,FastDFS 為互聯網量身定制,充分考慮了冗余備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用 FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。
Tracker server 作用是負載均衡和調度,通過 Tracker server 在文件上傳時可以根據一些策略找到 Storage server 提供文件上傳服務。可以將 tracker 稱為追蹤服務器或調度服務器。
Storage server 作用是文件存儲,客戶端上傳的文件最終存儲在 Storage 服務器上,Storageserver 沒有實現自己的文件系統而是利用操作系統的文件系統來管理文件
優點:
建立各種集群,防止高並發,適應分布式的存儲要求
存儲端理論上可以無限擴容
存儲端不會丟失數據,容災性強。
缺點:
客戶端上傳文件后存儲服務器將文件ID
組名:文件上傳后所在的 storage 組名稱,在文件上傳成功后由 storage 服務器返回,需要客戶端自行保存。
虛擬磁盤路徑:storage 配置的虛擬路徑,與磁盤選項 store_path*對應。如果配置了store_path0 則是 M00,如果配置了 store_path1 則是 M01,以此類推。
數據兩級目錄:storage 服務器在每個虛擬磁盤路徑下創建的兩級目錄,用於存儲數據文件。
文件名:與文件上傳時不同。是由存儲服務器根據特定信息生成,文件名包含:源存儲
2.1 FastDFS的一個小demo
public class demo1 { public static void main(String[] args) throws IOException, MyException { // 1、加載配置文件,配置文件中的內容就是 tracker 服務的地址。 ClientGlobal.init("fdfs_client.conf"); // 2、創建一個 TrackerClient 對象。直接 new 一個。 TrackerClient trackerClient = new TrackerClient(); // 3、使用 TrackerClient 對象創建連接,獲得一個 TrackerServer 對象 TrackerServer trackerServer = trackerClient.getConnection(); // 4、創建一個 StorageServer 的引用,值為 null StorageServer storageServer = null; // 5、創建一個 StorageClient 對象,需要兩個參數 TrackerServer 對象、StorageServer 的引用 StorageClient storageClient = new StorageClient(trackerServer, storageServer); // 6、使用 StorageClient 對象上傳圖片,參數1為文件,參數2為文件后綴名。 //擴展名不帶“.” String[] strings = storageClient.upload_file("C:\\Users\\Administrator\\Desktop\\2.jpg", "jpg",null); // 7、返回數組。包含組名和圖片的路徑。 for (String string : strings) { System.out.println(string); } } }
打印的String:group1/M00/00/01/wKjIgF3SRXWAHitEAAB1q5bIEwY138.jpg
所需要的fdfs_client.conf配置文件
# connect timeout in seconds # default value is 30s connect_timeout=30 # network timeout in seconds # default value is 30s network_timeout=60 # the base path to store log files base_path=/home/fastdfs # tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address
# 分布式文件服務器的ip,需要使用更改此處即可
tracker_server=192.168.200.128:22122 #standard log level as syslog, case insensitive, value list: ### emerg for emergency ### alert ### crit for critical ### error ### warn for warning ### notice ### info ### debug log_level=info # if use connection pool # default value is false # since V4.05 use_connection_pool = false # connections whose the idle time exceeds this time will be closed # unit: second # default value is 3600 # since V4.05 connection_pool_max_idle_time = 3600 # if load FastDFS parameters from tracker server # since V4.05 # default value is false load_fdfs_parameters_from_tracker=false # if use storage ID instead of IP address # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # default value is false # since V4.05 use_storage_id = false # specify storage ids filename, can use relative or absolute path # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # since V4.05 storage_ids_filename = storage_ids.conf #HTTP settings http.tracker_server_port=80 #use "#include" directive to include HTTP other settiongs ##include http.conf
三、頁面展示效果
此時說明我們上傳的照片已經上傳到分布式文件服務器上,且能夠訪問到我們上傳的照片
注:
分布式文件服務器自行配置,步驟過於麻煩。