文件系统FastDFS和阿里云OSS
文章目錄
- 1. 分布式文件存儲(chǔ)-FastDFS
- 1.1 FastDFS簡介
- 1.1.1 FastDFS體系結(jié)構(gòu)
- 1.1.2 上傳流程
- 1.2 FastDFS搭建(容器化部署)
- 1.2.0 Vmware虛擬機(jī)配置
- 1.2.1. 拉取鏡像
- 1.2.2. 運(yùn)行tracker
- 1.2.3. 運(yùn)行storage
- 1.2.4. 修改nginx的配置
- 1.2.5. 設(shè)置開機(jī)啟動(dòng)容器
- 1.3 文件存儲(chǔ)微服務(wù)
- 1.3.1. 創(chuàng)建文件管理微服務(wù)
- 1.3.2. 修改pom.xml引入依賴
- 1.3.3. 創(chuàng)建fasfDFS的配置文件
- 1.3.4. 創(chuàng)建微服務(wù)配置文件
- 1.3.5. 創(chuàng)建啟動(dòng)類
- 1.4 文件上傳
- 1.4.1 文件信息封裝
- 1.4.2 文件操作
- 1.4.3 文件上傳
- 1.5 Postman測試文件上傳
- 2. 阿里云對象存儲(chǔ) - OSS
- 2.1. 什么是對象存儲(chǔ)OSS
- 2.2. 對象存儲(chǔ)OSS作用
- 2.3. 對象存儲(chǔ)OSS中的概念
- 2.4. 對象存儲(chǔ)OSS管理方式
- 2.5. 阿里云對象存儲(chǔ)OSS [官網(wǎng)]
- 2.6. 對象存儲(chǔ)OSS注冊和配置
- 2.6.1. 注冊和登錄
- 2.6.2. 開通對象存儲(chǔ)OSS服務(wù)
- 2.6.3. 管理控制臺(tái)
- 2.6.4. 使用控制臺(tái)上傳圖片
- 2.7. AccessKey管理
- 2.7.1. 什么是AccessKey
- 2.7.2. 如何使用AccessKey
- 2.8. OSS-Browser管理工具使用
- 2.9. 寫代碼前準(zhǔn)備工作
- 2.9.1. 下載SDK安裝包
- 2.9.2. SDK包安裝到本地maven倉庫
- 2.10. 代碼操作使用案例
- 2.10.1. 搭建項(xiàng)目環(huán)境
- 2.10.2. 上傳文件
- 2.10.3. 下載文件到本地目錄
- 2.10.4. 上傳圖片并返回訪問路徑
- 2.10.5. 刪除文件
- 3. 總結(jié)
- 3.1. FastDFS優(yōu)缺點(diǎn)
- 3.2. 阿里對象存儲(chǔ)OSS優(yōu)缺點(diǎn) :
1. 分布式文件存儲(chǔ)-FastDFS
1.1 FastDFS簡介
1.1.1 FastDFS體系結(jié)構(gòu)
FastDFS是一個(gè)開源的輕量級(jí)分布式文件系統(tǒng),它對文件進(jìn)行管理,功能包括:文件存儲(chǔ)、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲(chǔ)和負(fù)載均衡的問題。特別適合以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等等。
FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制,并注重高可用、高性能等指標(biāo),使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳、下載等服務(wù)。
|
FastDFS 架構(gòu)包括 Tracker server 和 Storage server。客戶端請求 Tracker server 進(jìn)行文件上傳、下載,通過Tracker server 調(diào)度最終由 Storage server 完成文件上傳和下載。
Tracker server 作用是負(fù)載均衡和調(diào)度,通過 Tracker server 在文件上傳時(shí)可以根據(jù)一些策略找到Storage server 提供文件上傳服務(wù)。可以將 tracker 稱為追蹤服務(wù)器或調(diào)度服務(wù)器。Storage server作用是文件存儲(chǔ),客戶端上傳的文件最終存儲(chǔ)在 Storage 服務(wù)器上,Storageserver 沒有實(shí)現(xiàn)自己的文件系統(tǒng)而是利用操作系統(tǒng)的文件系統(tǒng)來管理文件。可以將storage稱為存儲(chǔ)服務(wù)器。
1.1.2 上傳流程
客戶端上傳文件后存儲(chǔ)服務(wù)器將文件 ID 返回給客戶端,此文件 ID用于以后訪問該文件的索引信息。文件索引信息包括:組名,虛擬磁盤路徑,數(shù)據(jù)兩級(jí)目錄,文件名。
組名:文件上傳后所在的 storage 組名稱,在文件上傳成功后有storage 服務(wù)器返回,需要客戶端自行保存。
虛擬磁盤路徑:storage 配置的虛擬路徑,與磁盤選項(xiàng)store_path對應(yīng)。如果配置了
store_path0 則是 M00,如果配置了 store_path1 則是 M01,以此類推。
數(shù)據(jù)兩級(jí)目錄:storage 服務(wù)器在每個(gè)虛擬磁盤路徑下創(chuàng)建的兩級(jí)目錄,用于存儲(chǔ)數(shù)據(jù)
文件。
文件名:與文件上傳時(shí)不同。是由存儲(chǔ)服務(wù)器根據(jù)特定信息生成,文件名包含:源存儲(chǔ)
服務(wù)器 IP 地址、文件創(chuàng)建時(shí)間戳、文件大小、隨機(jī)數(shù)和文件拓展名等信息。
1.2 FastDFS搭建(容器化部署)
注意 :
提供的虛擬機(jī)中FastDFS已經(jīng)搭建完成, 并且是開機(jī)自動(dòng)啟動(dòng), 配置好虛擬機(jī)網(wǎng)絡(luò)后直接使用即可。
1.2.0 Vmware虛擬機(jī)配置
虛擬機(jī)ip地址固定為 : 自己默認(rèn)地址
用戶名 : xxx
密碼 : xxx
- 導(dǎo)入虛擬機(jī)鏡像步驟:
- 文件菜單 -> 打開選項(xiàng) -> 選擇需要打開的虛擬機(jī)鏡像文件(鏡像文件需要提前解壓)
如需使用本課程提供的虛擬機(jī)鏡像, Vmware軟件配置如下:
注意: vmware軟件中只能有一個(gè)nat模式網(wǎng)絡(luò)連接, 如果沒有點(diǎn)擊添加網(wǎng)絡(luò)添加一個(gè),如果已經(jīng)存在那么照著下面配置內(nèi)容修改,
子網(wǎng)ip必須是: 192.168.200.0
因?yàn)樘摂M機(jī)鏡像中已經(jīng)將虛擬機(jī)的ip鎖死為192.168.200.128
所以在本地windows網(wǎng)絡(luò)適配器選項(xiàng)中找到 以太網(wǎng)8虛擬網(wǎng)卡進(jìn)行配置.
因?yàn)槲覀僾mware軟件中配置的時(shí)候VMnet8, 右鍵屬性配合如下:
注意 : 配置本地虛擬網(wǎng)卡的時(shí)候, ip地址一定要處于200網(wǎng)段
網(wǎng)關(guān)一定要寫上面配置的網(wǎng)關(guān)地址, 否則windows本機(jī)和虛擬機(jī)網(wǎng)絡(luò)無法連通
我們使用Docker容器化搭建FastDFS
1.2.1. 拉取鏡像
docker pull morunchang/fastdfs1.2.2. 運(yùn)行tracker
創(chuàng)建FastDFS管理端tracker容器
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh1.2.3. 運(yùn)行storage
創(chuàng)建FastDFS存儲(chǔ)端storage容器
docker run -d --name storage --net=host -e TRACKER_IP=<your tracker server address>:22122 -e GROUP_NAME=<group name> morunchang/fastdfs sh storage.sh#創(chuàng)建storage容器例子: docker run -d --name storage --net=host -e TRACKER_IP=192.168.200.128:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh- 使用的網(wǎng)絡(luò)模式是–net=host
- 其中 位置替換為你機(jī)器的Ip即可
- 其中 是組名,即storage的組, 例如: group1, group2, group3等
- 如果想要增加新的storage服務(wù)器,再次運(yùn)行該命令,注意更換 新組名
1.2.4. 修改nginx的配置
進(jìn)入storage的容器內(nèi)部,修改nginx.conf
# 進(jìn)入到storage容器內(nèi)部 docker exec -it storage /bin/bash進(jìn)入到容器內(nèi)部后
#1. 通過命令來查詢Nginx的安裝位置: root@iZ8vb6w2xyjemtqcxtmaj4Z:/# whereis nginx #顯示如下: nginx: /etc/nginx#2. 查看當(dāng)前Nginx的進(jìn)程 root@iZ8vb6w2xyjemtqcxtmaj4Z:/# ps aux | grep nginx #顯示如下: root 16 0.0 0.0 32480 1480 ? Ss 13:18 0:00 nginx: master process /etc/nginx/sbin/nginx nobody 100 0.0 0.0 33036 2116 ? S 14:15 0:00 nginx: worker process root 118 0.0 0.0 11272 728 pts/1 S+ 14:54 0:00 grep --color=auto nginx在storage存儲(chǔ)端容器的nginx中添加以下內(nèi)容:
#3. 修改Nginx的配置文件 vi /etc/nginx/conf/nginx.conf#4. 修改Nginx配置內(nèi)容server {listen 80;server_name localhost;location ~ /M00 {# storage 實(shí)際存儲(chǔ)圖片的位置root /data/fast_data/data;ngx_fastdfs_module;} }#5. 進(jìn)入到Nginx sbin目錄從新加載Nginx配置文件 cd /etc/nginx/sbin#6. 重新加載配置文件, 讓nginx配置生效 ./nginx -s reload修改后:
storage存儲(chǔ)的位置/data/fast_data/data
1.2.5. 設(shè)置開機(jī)啟動(dòng)容器
docker update --restart=always tracker docker update --restart=always storage如果更新不成功,查看是否是下面錯(cuò)誤
IPv4 forwarding is disabled. Networking will not work解決:https://www.cnblogs.com/python-wen/p/11224828.html
1.3 文件存儲(chǔ)微服務(wù)
1.3.1. 創(chuàng)建文件管理微服務(wù)
創(chuàng)建文件管理微服務(wù)fastdfsDemo,該工程主要用于實(shí)現(xiàn)文件上傳以及文件刪除等功能。
創(chuàng)建微服務(wù)時(shí), 項(xiàng)目為Maven項(xiàng)目, 不要選擇骨架.
1.3.2. 修改pom.xml引入依賴
<!-- 繼承Spring boot工程 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.5.RELEASE</version> </parent><properties><!-- 項(xiàng)目源碼及編譯輸出的編碼 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!-- 項(xiàng)目編譯JDK版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><!-- 依賴包版本管理 --><spring.boot.version>2.1.5.RELEASE</spring.boot.version><fastdfs.client.version>1.27.0.0</fastdfs.client.version> </properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.boot.version}</version></dependency><dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId><version>${fastdfs.client.version}</version></dependency> </dependencies>1.3.3. 創(chuàng)建fasfDFS的配置文件
在resources文件夾下創(chuàng)建fasfDFS的配置文件fdfs_client.conf
connect_timeout = 60 network_timeout = 60 charset = UTF-8 http.tracker_http_port = 80 tracker_server = 192.168.200.128:22122-
connect_timeout:連接超時(shí)時(shí)間,單位為秒。
-
network_timeout:通信超時(shí)時(shí)間,單位為秒。發(fā)送或接收數(shù)據(jù)時(shí)。假設(shè)在超時(shí)時(shí)間后還不能發(fā)送或接收數(shù)據(jù),則本次網(wǎng)絡(luò)通信失敗
-
charset: 字符集
-
http.tracker_http_port :.tracker的http端口
-
tracker_server: tracker服務(wù)器IP和端口設(shè)置
1.3.4. 創(chuàng)建微服務(wù)配置文件
在resources文件夾下創(chuàng)建application.yml
spring:servlet:multipart:max-file-size: 10MBmax-request-size: 10MBapplication:name: fastdfs-demo server:port: 9001max-file-size是單個(gè)文件大小,max-request-size是設(shè)置總上傳的數(shù)據(jù)大小
1.3.5. 創(chuàng)建啟動(dòng)類
創(chuàng)建com.qianfeng包,創(chuàng)建啟動(dòng)類FastDFSApplication
package com.qianfeng;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;/*** 項(xiàng)目啟動(dòng)類* @Author zhaojian*/ @SpringBootApplication public class FastDFSApplication {public static void main(String[] args) {SpringApplication.run(FastDFSApplication.class, args);} }1.4 文件上傳
1.4.1 文件信息封裝
文件上傳一般都有文件的名字、文件的內(nèi)容、文件的擴(kuò)展名、文件的md5值、文件的作者等相關(guān)屬性,我們可以創(chuàng)建一個(gè)對象封裝這些屬性,代碼如下:
創(chuàng)建com.ymk.pojo.FastDFSFile
package com.qianfeng.pojo;/*** 自定義封裝, 文件實(shí)體類* @Author zhaojian*/ public class FastDFSFile {//文件名字private String name;//文件內(nèi)容private byte[] content;//文件擴(kuò)展名private String ext;//文件MD5摘要值private String md5;//文件創(chuàng)建作者private String author;public FastDFSFile(String name, byte[] content, String ext, String height, String width, String author) {super();this.name = name;this.content = content;this.ext = ext;this.author = author;}public FastDFSFile(String name, byte[] content, String ext) {super();this.name = name;this.content = content;this.ext = ext;}// getter and setter ... }1.4.2 文件操作
創(chuàng)建FastDFSClient類,放在com.ymk.util下, 在該類中實(shí)現(xiàn)FastDFS信息獲取以及文件的相關(guān)操作,
代碼如下:
package com.ymk.util;import com.ymk.pojo.FastDFSFile; import org.csource.common.NameValuePair; import org.csource.fastdfs.*; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource;import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream;/*** 上傳下載等文件操作工具類* @Author zhaojian*/ public class FastDFSClient {private static org.slf4j.Logger logger = LoggerFactory.getLogger(FastDFSClient.class);/**** 初始化加載FastDFS的TrackerServer配置*/static {try {String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();ClientGlobal.init(filePath);} catch (Exception e) {logger.error("FastDFS Client Init Fail!",e);}}/**** 文件上傳* @param file* @return*/public static String[] upload(FastDFSFile file) {//獲取文件的作者NameValuePair[] meta_list = new NameValuePair[1];meta_list[0] = new NameValuePair("author", file.getAuthor());//接收返回?cái)?shù)據(jù)String[] uploadResults = null;StorageClient storageClient=null;try {//創(chuàng)建StorageClient客戶端對象storageClient = getTrackerClient();/**** 文件上傳* 1)文件字節(jié)數(shù)組* 2)文件擴(kuò)展名* 3)文件作者*/uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);} catch (Exception e) {logger.error("Exception when uploadind the file:" + file.getName(), e);}if (uploadResults == null && storageClient!=null) {logger.error("upload file fail, error code:" + storageClient.getErrorCode());}//獲取組名String groupName = uploadResults[0];//獲取文件存儲(chǔ)路徑String remoteFileName = uploadResults[1];return uploadResults;}/**** 獲取文件信息* @param groupName:組名* @param remoteFileName:文件存儲(chǔ)完整名* @return*/public static FileInfo getFile(String groupName, String remoteFileName) {try {StorageClient storageClient = getTrackerClient();return storageClient.get_file_info(groupName, remoteFileName);} catch (Exception e) {logger.error("Exception: Get File from Fast DFS failed", e);}return null;}/**** 文件下載* @param groupName* @param remoteFileName* @return*/public static InputStream downFile(String groupName, String remoteFileName) {try {//創(chuàng)建StorageClientStorageClient storageClient = getTrackerClient();//下載文件byte[] fileByte = storageClient.download_file(groupName, remoteFileName);InputStream ins = new ByteArrayInputStream(fileByte);return ins;} catch (Exception e) {logger.error("Exception: Get File from Fast DFS failed", e);}return null;}/**** 文件刪除* @param groupName* @param remoteFileName* @throws Exception*/public static void deleteFile(String groupName, String remoteFileName)throws Exception {//創(chuàng)建StorageClientStorageClient storageClient = getTrackerClient();//刪除文件int i = storageClient.delete_file(groupName, remoteFileName);}/**** 獲取Storage組* @param groupName* @return* @throws IOException*/public static StorageServer[] getStoreStorages(String groupName)throws IOException {//創(chuàng)建TrackerClientTrackerClient trackerClient = new TrackerClient();//獲取TrackerServerTrackerServer trackerServer = trackerClient.getConnection();//獲取Storage組return trackerClient.getStoreStorages(trackerServer, groupName);}/**** 獲取Storage信息,IP和端口* @param groupName* @param remoteFileName* @return* @throws IOException*/public static ServerInfo[] getFetchStorages(String groupName,String remoteFileName) throws IOException {TrackerClient trackerClient = new TrackerClient();TrackerServer trackerServer = trackerClient.getConnection();return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);}/**** 獲取Tracker服務(wù)地址* @return* @throws IOException*/public static String getTrackerUrl() throws IOException {return "http://"+getTrackerServer().getInetSocketAddress().getHostString()+":"+ ClientGlobal.getG_tracker_http_port()+"/";}/**** 獲取Storage客戶端* @return* @throws IOException*/private static StorageClient getTrackerClient() throws IOException {TrackerServer trackerServer = getTrackerServer();StorageClient storageClient = new StorageClient(trackerServer, null);return storageClient;}/**** 獲取Tracker* @return* @throws IOException*/private static TrackerServer getTrackerServer() throws IOException {TrackerClient trackerClient = new TrackerClient();TrackerServer trackerServer = trackerClient.getConnection();return trackerServer;} }1.4.3 文件上傳
創(chuàng)建一個(gè)FileController,在該控制器中實(shí)現(xiàn)文件上傳操作,代碼如下:
package com.ymk.controller;import com.ymk.pojo.FastDFSFile; import com.ymk.util.FastDFSClient; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile;import java.io.IOException;/*** 文件操作controller接口* @Author zhaojian*/ @RestController @CrossOrigin @RequestMapping("/file") public class FileController {/*** 上傳接口* @param file 接收文件參數(shù), 參數(shù)名必須叫做file* @Author zhaojian*/@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) {String path ="";try {path=saveFile(file);System.out.println(path);} catch (Exception e) {e.printStackTrace();}return path;}/*** 上傳文件到FastDFS分布式文件系統(tǒng)* @param multipartFile* @Author zhaojian*/public String saveFile(MultipartFile multipartFile) throws IOException {//1. 獲取文件名String fileName = multipartFile.getOriginalFilename();//2. 獲取文件內(nèi)容byte[] content = multipartFile.getBytes();//3. 獲取文件擴(kuò)展名String ext = "";if (fileName != null && !"".equals(fileName)) {ext = fileName.substring(fileName.lastIndexOf("."));}//4. 創(chuàng)建文件實(shí)體類對象FastDFSFile fastDFSFile = new FastDFSFile(fileName, content, ext);//5. 上傳String[] uploadResults = FastDFSClient.upload(fastDFSFile);//6. 拼接上傳后的文件的完整路徑和名字, uploadResults[0]為組名, uploadResults[1]為文件名稱和路徑String path = FastDFSClient.getTrackerUrl() + uploadResults[0] + "/" + uploadResults[1];//7. 返回return path;} }1.5 Postman測試文件上傳
步驟:
1、選擇post請求方式,輸入請求地址 http://localhost:9001/file/upload
2、填寫Headers
Key:Content-Type Value:multipart/form-data3、填寫body
選擇form-data 然后選擇文件file 點(diǎn)擊添加文件,最后發(fā)送即可。
postman填寫信息如下:
注意Headers請求頭中內(nèi)容
注意body請求體中內(nèi)容:
上傳結(jié)果可以通過瀏覽器訪問顯示如下:
2. 阿里云對象存儲(chǔ) - OSS
2.1. 什么是對象存儲(chǔ)OSS
阿里云對象存儲(chǔ)OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存儲(chǔ)服務(wù)。其數(shù)據(jù)設(shè)計(jì)持久性不低于99.9999999999%(12個(gè)9),服務(wù)可用性(或業(yè)務(wù)連續(xù)性)不低于99.995%。
OSS具有與平臺(tái)無關(guān)的RESTful API接口,您可以在任何應(yīng)用、任何時(shí)間、任何地點(diǎn)存儲(chǔ)和訪問任意類型的數(shù)據(jù)。
您可以使用阿里云提供的API、SDK接口或者OSS遷移工具輕松地將海量數(shù)據(jù)移入或移出阿里云OSS。數(shù)據(jù)存儲(chǔ)到阿里云OSS以后,您可以選擇標(biāo)準(zhǔn)存儲(chǔ)(Standard)作為移動(dòng)應(yīng)用、大型網(wǎng)站、圖片分享或熱點(diǎn)音視頻的主要存儲(chǔ)方式,也可以選擇成本更低、存儲(chǔ)期限更長的低頻訪問存儲(chǔ)(Infrequent
Access)、歸檔存儲(chǔ)(Archive)、冷歸檔存儲(chǔ)(Cold Archive)作為不經(jīng)常訪問數(shù)據(jù)的存儲(chǔ)方式。
2.2. 對象存儲(chǔ)OSS作用
-
阿里云對象存儲(chǔ)OSS簡單的說就是我們花錢在阿里購買存儲(chǔ)空間
-
然后我們可以將項(xiàng)目中的圖片文件等資源存儲(chǔ)在對象存儲(chǔ)OSS服務(wù)器上
-
對象存儲(chǔ)OSS提供對文件的上傳,下載, 刪除等管理操作
-
這樣我們就省去了購買存儲(chǔ)服務(wù)器, 搭建存儲(chǔ)服務(wù)器, 運(yùn)營管理存儲(chǔ)服務(wù)器的繁瑣操作.
-
本方案適用于中小型規(guī)模公司, 對于并發(fā)量, 存儲(chǔ)的數(shù)據(jù)量不大的情況下使用, 因?yàn)槿绻卟l(fā)大數(shù)據(jù)量阿里雖然也支持,
-
但是每年付出的費(fèi)用相當(dāng)昂貴, 這個(gè)時(shí)候可以選用FastDFS自己去購買服務(wù)器搭建并運(yùn)營管理. 則更省錢.
2.3. 對象存儲(chǔ)OSS中的概念
- 存儲(chǔ)類型(Storage Class)
OSS提供標(biāo)準(zhǔn)、低頻訪問、歸檔、冷歸檔四種存儲(chǔ)類型,全面覆蓋從熱到冷的各種數(shù)據(jù)存儲(chǔ)場景。其中標(biāo)準(zhǔn)存儲(chǔ)類型提供高持久、高可用、高性能的對象存儲(chǔ)服務(wù),能夠支持頻繁的數(shù)據(jù)訪問;低頻訪問存儲(chǔ)類型適合長期保存不經(jīng)常訪問的數(shù)據(jù)(平均每月訪問頻率1到2次),存儲(chǔ)單價(jià)低于標(biāo)準(zhǔn)類型;歸檔存儲(chǔ)類型適合需要長期保存(建議半年以上)的歸檔數(shù)據(jù);冷歸檔存儲(chǔ)適合需要超長時(shí)間存放的極冷數(shù)據(jù)。
- 存儲(chǔ)空間(Bucket)
存儲(chǔ)空間是您用于存儲(chǔ)對象(Object)的容器,所有的對象都必須隸屬于某個(gè)存儲(chǔ)空間。存儲(chǔ)空間具有各種配置屬性,包括地域、訪問權(quán)限、存儲(chǔ)類型等。您可以根據(jù)實(shí)際需求,創(chuàng)建不同類型的存儲(chǔ)空間來存儲(chǔ)不同的數(shù)據(jù)。
- 對象(Object)
對象是OSS存儲(chǔ)數(shù)據(jù)的基本單元,也被稱為OSS的文件。對象由元信息(Object
Meta)、用戶數(shù)據(jù)(Data)和文件名(Key)組成。對象由存儲(chǔ)空間內(nèi)部唯一的Key來標(biāo)識(shí)。對象元信息是一組鍵值對,表示了對象的一些屬性,例如最后修改時(shí)間、大小等信息,同時(shí)您也可以在元信息中存儲(chǔ)一些自定義的信息。
- 地域(Region)
地域表示OSS的數(shù)據(jù)中心所在物理位置。您可以根據(jù)費(fèi)用、請求來源等選擇合適的地域創(chuàng)建Bucket。
- 訪問域名(Endpoint)
Endpoint表示OSS對外服務(wù)的訪問域名。OSS以HTTP RESTful
API的形式對外提供服務(wù),當(dāng)訪問不同地域的時(shí)候,需要不同的域名。通過內(nèi)網(wǎng)和外網(wǎng)訪問同一個(gè)地域所需要的域名也是不同的。
- 訪問密鑰(AccessKey)
AccessKey簡稱AK,指的是訪問身份驗(yàn)證中用到的AccessKey ID和AccessKey
Secret。OSS通過使用AccessKey ID和AccessKey
Secret對稱加密的方法來驗(yàn)證某個(gè)請求的發(fā)送者身份。AccessKey ID用于標(biāo)識(shí)用戶;AccessKey
Secret是用戶用于加密簽名字符串和OSS用來驗(yàn)證簽名字符串的密鑰,必須保密。
2.4. 對象存儲(chǔ)OSS管理方式
OSS提供多種靈活的上傳、下載和管理方式。
-
通過控制臺(tái)管理OSS
OSS提供了Web服務(wù)頁面,您可以登錄OSS控制臺(tái)管理您的OSS資源。
-
通過API或SDK管理OSS
OSS提供RESTful API和各種語言的SDK開發(fā)包,方便您快速進(jìn)行二次開發(fā)。
-
通過工具管理OSS
OSS提供圖形化管理工具ossbrowser、命令行管理工具ossutil、FTP管理工具ossftp等各種類型的管理工具。
-
通過云存儲(chǔ)網(wǎng)關(guān)管理OSS
OSS的存儲(chǔ)空間內(nèi)部是扁平的,沒有文件系統(tǒng)的目錄等概念,所有的對象都直接隸屬于其對應(yīng)的存儲(chǔ)空間。如果您想要像使用本地文件夾和磁盤那樣來使用OSS存儲(chǔ)服務(wù),可以通過配置云存儲(chǔ)網(wǎng)關(guān)來實(shí)現(xiàn)。
2.5. 阿里云對象存儲(chǔ)OSS [官網(wǎng)]
阿里云對象存儲(chǔ)OSS官網(wǎng)地址 :
https://cn.aliyun.com/product/oss
阿里云對象存儲(chǔ)OSS在線文檔地址:
https://help.aliyun.com/product/31815.html?spm=5176.19720258.J_2686872250.3.54212c4ac3QCCP
2.6. 對象存儲(chǔ)OSS注冊和配置
2.6.1. 注冊和登錄
進(jìn)入官網(wǎng)后, 首先就是注冊和登錄, 可以使用支付寶登錄, 阿里云手機(jī)客戶端掃碼登錄, 賬號(hào)密碼登錄, 阿里云提供多種登錄形式。
2.6.2. 開通對象存儲(chǔ)OSS服務(wù)
- 首先找到阿里云的對象存儲(chǔ)OSS服務(wù)進(jìn)入
- 點(diǎn)擊開通按鈕進(jìn)行開通對象存儲(chǔ)OSS服務(wù)
2.6.3. 管理控制臺(tái)
- 注冊, 登錄, 開通OSS服務(wù)后點(diǎn)擊管理控制臺(tái), 進(jìn)入控制臺(tái)界面
- 進(jìn)入到控制臺(tái)界面
- 創(chuàng)建Bucket桶, 點(diǎn)擊Bucket列表菜單, 點(diǎn)擊創(chuàng)建Bucket按鈕, 按照下面內(nèi)容填寫:
2.6.4. 使用控制臺(tái)上傳圖片
- 創(chuàng)建完Bucket桶后就可以使用控制臺(tái)上傳圖片進(jìn)行測試了, 上傳操作如下:
- 成功上傳結(jié)果如下:
2.7. AccessKey管理
2.7.1. 什么是AccessKey
寫代碼的時(shí)候, 需要在項(xiàng)目配置文件中配置自己阿里云服務(wù)的賬號(hào)和密碼,如果寫真實(shí)的支付寶賬號(hào)密碼會(huì)造成賬號(hào)密碼泄露, 不安全,所以創(chuàng)建AccessKey也就是在當(dāng)前賬戶下, 創(chuàng)建子賬戶和密碼使用, 可以隨時(shí)更換, 啟用, 停用。
2.7.2. 如何使用AccessKey
- 鼠標(biāo)懸停在那個(gè)小人的頭像上不動(dòng), 就會(huì)出現(xiàn)下面菜單, 然后點(diǎn)擊AccessKey管理
- 點(diǎn)擊繼續(xù)使用AccessKey
- 點(diǎn)擊創(chuàng)建AccessKey創(chuàng)建密鑰對
- 查看生成后的密鑰對, 一定要復(fù)制保存下來, 一會(huì)寫代碼的時(shí)候需要用到
2.8. OSS-Browser管理工具使用
在資料的 軟件文件夾 中有兩個(gè)壓縮包, 就是OSS-Browser工具, 此工具為阿里提供的管理對象存儲(chǔ)OSS的桌面工具.
下面演示以Windows版本為例
-
oss-browser-mac-x64.zip 為mac版本
-
oss-browser-win32-x64.zip 為windows版本
- 解壓windows版本后, 看到下面內(nèi)容, oss-browser.exe為此工具啟動(dòng)文件
- 啟動(dòng)后, 輸入子賬戶名稱和密碼進(jìn)行登錄, 也就是AccessKey和AccessSecret
- 進(jìn)入后, 可以點(diǎn)擊 新建Bucket按鈕, 創(chuàng)建桶, 填寫內(nèi)容如下, 也可以對桶進(jìn)行維護(hù)操作
- 創(chuàng)建好桶后, 點(diǎn)擊桶, 可以進(jìn)入桶中
- 在桶中, 可以使用文件按鈕上傳文件, 對上傳的文件還有下載和刪除功能可以使用, 對文件進(jìn)行維護(hù)管理
2.9. 寫代碼前準(zhǔn)備工作
2.9.1. 下載SDK安裝包
阿里云對象存儲(chǔ)OSS在線文檔地址:
https://help.aliyun.com/product/31815.html?spm=5176.19720258.J_2686872250.3.54212c4ac3QCCP
2.9.2. SDK包安裝到本地maven倉庫
- 將下載的SDK安裝包解壓, 然后安裝到本地的maven倉庫, 命令如下:
命令解釋如下:
mvn install:install-file //安裝到maven本地倉庫命令
-
DgroupId=com.aliyun.oss //pom文件坐標(biāo)的groupId
-
DartifactId=aliyun-sdk-oss //pom文件坐標(biāo)的artifactId
-
Dversion=3.10.2 //版本號(hào)
-
Dpackaging=jar //打包方式
-
Dfile=aliyun-sdk-oss-3.10.2.jar //解壓后的jar包
2.10. 代碼操作使用案例
2.10.1. 搭建項(xiàng)目環(huán)境
- 創(chuàng)建項(xiàng)目名稱為aliyunossDemo, maven項(xiàng)目, 不要選擇骨架.
- 在pom.xml中導(dǎo)入依賴
JDK如果是1.9或者以上版本需要加入jaxb相關(guān)依賴, 其他JDK版本不需要.
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version> </dependency> <dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version> </dependency> <!-- no more than 2.3.3--> <dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version> </dependency>- 在resources目錄下創(chuàng)建application.yml配置文件
- 創(chuàng)建啟動(dòng)類AliyunOssApplication.java
- 創(chuàng)建com.ymk.util包, 放入文件操作工具類AliyunOSSUtil.java
2.10.2. 上傳文件
package com.ymk.controller;import com.ymk.util.AliyunOSSUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile;/*** 文件管理接口* 提供文件各種形式上傳, 下載, 刪除等操作* @Author zhaojian*/ @RestController @RequestMapping("/file") public class FileManagerController {//OSS服務(wù)器訪問域名@Value("${aliyun.oss.endpoint}")private String endpoint;//子賬戶名@Value("${aliyun.oss.accessKeyId}")private String accessKeyId;//子賬戶密碼@Value("${aliyun.oss.accessKeySecret}")private String accessKeySecret;//桶名字@Value("${aliyun.oss.bucketName}")private String bucketName;/*** byte數(shù)組形式上傳* @param file* @Author zhaojian*/@PostMapping("/upload1")public void upload(@RequestParam("file") MultipartFile file) throws Exception {AliyunOSSUtil.uploadByByteArrayFile(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getBytes());}/*** 輸入流形式上傳* @param file* @Author zhaojian*/@PostMapping("/upload2")public void upload2(@RequestParam("file") MultipartFile file) throws Exception {AliyunOSSUtil.uploadByInputStreamFile(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getInputStream());} }2.10.3. 下載文件到本地目錄
/*** 下載文件到本地* @param objName 需要下載的對象名稱* @param filePath 將對象下載到本地的路徑和文件名, 重名則覆蓋. * 例如: F:\test\7.jpg* @Author zhaojian*/ @GetMapping("/download") public void download(String objName, String filePath) throws Exception {AliyunOSSUtil.downFile(endpoint, accessKeyId, accessKeySecret, bucketName, objName, filePath); }2.10.4. 上傳圖片并返回訪問路徑
/*** 上傳圖片并返回上傳后的URL地址* @param file* @Author zhaojian*/ @PostMapping("/upload3") public String upload3(@RequestParam("file") MultipartFile file) throws Exception {String url = AliyunOSSUtil.uploadImage(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getBytes());System.out.println("=====" + url);return url; }2.10.5. 刪除文件
/*** 刪除文件* @param objName 需要?jiǎng)h除的對象名稱* @Author zhaojian*/ @DeleteMapping("/delete") public void deleteFile(String objName) {AliyunOSSUtil.deleteFile(endpoint, accessKeyId, accessKeySecret, bucketName, objName); }3. 總結(jié)
3.1. FastDFS優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
-
Tracker管理端和Storage存儲(chǔ)端服務(wù)器都有心跳檢測機(jī)制, 高可用
-
Storage存儲(chǔ)端服務(wù)器, 主機(jī)和備機(jī)自動(dòng)同步數(shù)據(jù), 冗余備份, 容災(zāi)性強(qiáng)
-
Tracker管理端服務(wù)器具有對Storage存儲(chǔ)端服務(wù)器負(fù)載均衡的功能, 可以抗高并發(fā).
-
Storage存儲(chǔ)端服務(wù)器具有線性擴(kuò)容功能, 理論上FastDFS存儲(chǔ)容量無上限, 實(shí)時(shí)擴(kuò)容.
缺點(diǎn) :
-
費(fèi)錢
-
FastDFS分布式文件系統(tǒng)對服務(wù)器需求量大
-
搭建FastDFS需要自己搭建機(jī)房, 并且運(yùn)維.
-
如果存儲(chǔ)數(shù)據(jù)量不是特別大, 成本則無法降低.
使用場景 :
適合大公司,自有IDC機(jī)房. 數(shù)據(jù)量和并發(fā)量得有一定規(guī)模才適用.
3.2. 阿里對象存儲(chǔ)OSS優(yōu)缺點(diǎn) :
優(yōu)點(diǎn) :
-
支持高并發(fā)
-
支持海量數(shù)據(jù)
-
支持高可用, 高可靠.
-
以上特點(diǎn)都由阿里對象存儲(chǔ)OSS提供保障, 無需自己運(yùn)維.
缺點(diǎn) :
-
數(shù)據(jù)量和并發(fā)量不高的情況下, 費(fèi)用適中.
-
并發(fā)和數(shù)據(jù)量越大越貴. 這個(gè)時(shí)候不如自己購買服務(wù)器搭建FastDFS分布式文件系統(tǒng)使用
使用場景 :
-
適合中小型公司, 數(shù)據(jù)量不大,并發(fā)不高情況使用.
-
并不是阿里OSS不支持高并發(fā)和大數(shù)據(jù)量, 而是并發(fā)越高, 數(shù)據(jù)量越大, 越貴.
總結(jié)
以上是生活随笔為你收集整理的文件系统FastDFS和阿里云OSS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: weblogic 启动很慢_【转】解决w
- 下一篇: web高级程序员必备知识