申明: 未經(jīng)許可,禁止以任何形式轉(zhuǎn)載,若要引用,請(qǐng)標(biāo)注鏈接地址
全文共計(jì)11577字,閱讀大概需要3分鐘
1、為什么要引入阿里云對(duì)象存儲(chǔ)服務(wù)(OSS)?有什么好處?
在分布式集群系統(tǒng)中,前端通過瀏覽器上傳圖片給服務(wù)器存儲(chǔ)時(shí)存在分庫分表的情況,這就涉及到文件存儲(chǔ)
的情況,在高并發(fā)的情況下,考慮到服務(wù)器的性能和利用率,都會(huì)采用負(fù)載均衡
來緩解服務(wù)器的壓力。比如同時(shí)有3個(gè)商品服務(wù)來響應(yīng)用戶的請(qǐng)求,為了減少查詢的耗時(shí),采用統(tǒng)一的文件存儲(chǔ)
來進(jìn)行讀寫,可以選擇自己搭建文件存儲(chǔ)服務(wù)器,比如:Fast DFS 、 vsftpd,但是搭建一個(gè)專門的服務(wù)器的技術(shù)和費(fèi)用成本很高,后期還需要有專人來維護(hù),不是很方便。
目前火熱的阿里云對(duì)象存儲(chǔ)OSS(Object Storage Service)是一個(gè)不錯(cuò)的選擇。
1.1、什么是對(duì)象存儲(chǔ)OSS
阿里云對(duì)象存儲(chǔ)OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù)。多種存儲(chǔ)類型供選擇,全面優(yōu)化存儲(chǔ)成本。
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ǔ)方式。
1.2、OSS工作原理
可以將數(shù)據(jù)以對(duì)象(Object)的形式存儲(chǔ)在存儲(chǔ)空間(Bucket )中,Object指的是一個(gè)文件和描述該文件的任何元數(shù)據(jù),Bucket是保存Object的容器。
要將Object存儲(chǔ)在OSS中,需要先創(chuàng)建Bucket,然后指定Bucket名稱以及所在地域(Region)。每個(gè)Object都需要定義ObjectName(也稱為ObjectKey或者Key),作為Bucket中數(shù)據(jù)的唯一標(biāo)識(shí)符。Object操作在OSS上具有原子性以及強(qiáng)一致性。
OSS以HTTP RESTful API的形式對(duì)外提供服務(wù),訪問不同地域需要不同的訪問域名(Endpoint)。當(dāng)請(qǐng)求訪問OSS時(shí),OSS通過使用訪問密鑰(AccessKey Id和AccessKey Secret)對(duì)稱加密的方法來驗(yàn)證某個(gè)請(qǐng)求的發(fā)送者身份。
存儲(chǔ)空間
存儲(chǔ)空間是用戶用于存儲(chǔ)對(duì)象(Object)的容器,所有的對(duì)象都必須隸屬于某個(gè)存儲(chǔ)空間。存儲(chǔ)空間具有各種配置屬性,包括地域、訪問權(quán)限、存儲(chǔ)類型等。用戶可以根據(jù)實(shí)際需求,創(chuàng)建不同類型的存儲(chǔ)空間來存儲(chǔ)不同的數(shù)據(jù)。
對(duì)象
對(duì)象是OSS存儲(chǔ)數(shù)據(jù)的基本單元,也被稱為OSS的文件。和傳統(tǒng)的文件系統(tǒng)不同,對(duì)象沒有文件目錄層級(jí)結(jié)構(gòu)的關(guān)系。對(duì)象由元信息(Object Meta),用戶數(shù)據(jù)(Data)和文件名(Key)組成,并且由存儲(chǔ)空間內(nèi)部唯一的Key來標(biāo)識(shí)。對(duì)象元信息是一組鍵值對(duì),表示了對(duì)象的一些屬性,比如最后修改時(shí)間、大小等信息,同時(shí)用戶也可以在元信息中存儲(chǔ)一些自定義的信息。
對(duì)象名稱
在各語言SDK中,ObjectKey、Key以及ObjectName是同一概念,均表示對(duì)Object執(zhí)行相關(guān)操作時(shí)需要填寫的Object名稱。例如向某一存儲(chǔ)空間上傳Object時(shí),ObjectKey表示上傳的Object所在存儲(chǔ)空間的完整名稱,即包含文件后綴在內(nèi)的完整路徑,如填寫為abc/efg/123.jpg。
地域
Region表示OSS的數(shù)據(jù)中心所在物理位置。用戶可以根據(jù)費(fèi)用、請(qǐng)求來源等選擇合適的地域創(chuàng)建Bucket。一般來說,距離用戶更近的Region訪問速度更快。詳情請(qǐng)參見OSS已經(jīng)開通的Region。
訪問域名
Endpoint表示OSS對(duì)外服務(wù)的訪問域名。OSS以HTTP RESTful API的形式對(duì)外提供服務(wù),當(dāng)訪問不同的Region的時(shí)候,需要不同的域名。通過內(nèi)網(wǎng)和外網(wǎng)訪問同一個(gè)Region所需要的Endpoint也是不同的。例如杭州Region的外網(wǎng)Endpoint是oss-cn-hangzhou.aliyuncs.com,內(nèi)網(wǎng)Endpoint是oss-cn-hangzhou-internal.aliyuncs.com。具體的內(nèi)容請(qǐng)參見各個(gè)Region對(duì)應(yīng)的Endpoint。
訪問密鑰
AccessKey簡稱AK,指的是訪問身份驗(yàn)證中用到的AccessKeyId和AccessKeySecret。OSS通過使用AccessKeyId和AccessKeySecret對(duì)稱加密的方法來驗(yàn)證某個(gè)請(qǐng)求的發(fā)送者身份。AccessKeyId用于標(biāo)識(shí)用戶;AccessKeySecret是用戶用于加密簽名字符串和OSS用來驗(yàn)證簽名字符串的密鑰,必須保密。
2、阿里云對(duì)象存儲(chǔ)-普通上傳方式
用戶通過自己的簡單后臺(tái)應(yīng)用服務(wù)器將數(shù)據(jù)以對(duì)象的形式存儲(chǔ)在OSS上
2.1、時(shí)序圖
2.2、登錄并注冊(cè)對(duì)象存儲(chǔ)OSS
官網(wǎng)地址:https://www.aliyun.com/product/oss?spm=5176.19720258.J_3207526240.33.e93976f4FQUO0P
創(chuàng)建bucket
https://oss.console.aliyun.com/overview
填寫B(tài)ucket的名稱,地域,存儲(chǔ)類型的基本信息
點(diǎn)進(jìn)實(shí)例后,會(huì)看到
先簡單測試一下本地上傳
可以看到上傳成功了
通過URL地址可以直接訪問的到:https://gulimall-jerry-jy.oss-cn-hangzhou.aliyuncs.com/5b5e74d0978360a1.jpg
3、 通過API接口上傳數(shù)據(jù)對(duì)象
3.1、引入依賴
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.5.0</version>
</dependency>
3.2、開通遠(yuǎn)程RAM訪問權(quán)限
RAM(Resource Acess Management)資源訪問控制:RAM 用戶是一個(gè)身份實(shí)體,它通常代表您的組織中需要訪問云資源的人員或應(yīng)用程序。
https://ram.console.aliyun.com/users/new
若開通 Open API 調(diào)用訪問,請(qǐng)及時(shí)保存 AccessKey 信息,頁面關(guān)閉后將無法再次獲取信息。
3.3、編寫測試類
@Test
public void testUpload() {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云賬號(hào)AccessKey擁有所有API的訪問權(quán)限,風(fēng)險(xiǎn)很高。強(qiáng)烈建議您創(chuàng)建并使用RAM用戶進(jìn)行API訪問或日常運(yùn)維,請(qǐng)登錄RAM控制臺(tái)創(chuàng)建RAM用戶。
String accessKeyId = "LTAI5tQRCX6FBx77qqhepLo9";
String accessKeySecret = "UGvWNebBJusYPTIv9kRfBsEckthRqF";
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "gulimall-jerry-jy";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
String objectName = "9.png";
// 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路徑,則默認(rèn)從示例程序所屬項(xiàng)目對(duì)應(yīng)本地路徑中上傳文件流。
String filePath = "C:\\Users\\15718\\Desktop\\png\\9.png";
// 創(chuàng)建OSSClient實(shí)例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
InputStream inputStream = new FileInputStream(filePath);
// 創(chuàng)建PutObject請(qǐng)求。
ossClient.putObject(bucketName, objectName, inputStream);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
System.out.println("上傳完成!");
ossClient.shutdown();
}
}
}
3.4、可以看到文件也上傳成功
可以通過URL訪問圖片:https://gulimall-jerry-jy.oss-cn-hangzhou.aliyuncs.com/9.png
4、 使用阿里云封裝的Ali-Cloud OSS SDK進(jìn)行上傳
4.1、引入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
</dependency>
4.2、編寫application.yml配置文件
spring:
cloud:
alicloud:
access-key: LTAI5tQRCX6FBx77qqhepLo9
secret-key: UGvWNebBJusYPTIv9kRfBsEckthRqF
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com
4.3、啟動(dòng)類上調(diào)用OSSClient方法
可以看到控制臺(tái)打印了【上傳成功】
去阿里云控制臺(tái)檢查下是否成功
通過【URL】https://gulimall-jerry-jy.oss-cn-hangzhou.aliyuncs.com/8.png
也能正常訪問,證明上傳成功
4.3、不足
通過我們自己的應(yīng)用服務(wù)器上傳數(shù)據(jù)到OSS,如果前端訪問的數(shù)據(jù)量過大,過造成應(yīng)用服務(wù)器的性能瓶頸,最好的辦法是采用服務(wù)端簽名后直傳
5、阿里云對(duì)象存儲(chǔ)-服務(wù)端簽名后直傳
5.1、原理圖
5.2、controller
package com.jerry.gulimall.thirdparty.controller;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.jerry.common.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;
import java.util.Date;
import java.util.Map;
import java.text.SimpleDateFormat;
import java.util.LinkedHashMap;
/**
* @author 金陽
* @description
* @create 2022-07-22 1:24
*/
@RestController
public class OssController {
@Autowired
OSS ossClient;
@Value("${spring.cloud.alicloud.oss.endpoint}")
private String endpoint;
@Value("${spring.cloud.alicloud.oss.bucket}")
private String bucket;
@Value("${spring.cloud.alicloud.access-key}")
private String accessId;
@RequestMapping("/oss/policy")
public R policy() {
//https://gulimall-hello.oss-cn-beijing.aliyuncs.com/hahaha.jpg
String host = "https://" + bucket + "." + endpoint; // host的格式為 bucketname.endpoint
// callbackUrl為 上傳回調(diào)服務(wù)器的URL,請(qǐng)將下面的IP和Port配置為您自己的真實(shí)信息。
// String callbackUrl = "http://88.88.88.88:8888";
String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dir = format + "/"; // 用戶上傳文件時(shí)指定的前綴。
Map<String, String> respMap = null;
try {
long expireTime = 30;
long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
Date expiration = new Date(expireEndTime);
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);
respMap = new LinkedHashMap<String, String>();
respMap.put("accessid", accessId);
respMap.put("policy", encodedPolicy);
respMap.put("signature", postSignature);
respMap.put("dir", dir);
respMap.put("host", host);
respMap.put("expire", String.valueOf(expireEndTime / 1000));
// respMap.put("expire", formatISO8601Date(expiration));
} catch (Exception e) {
// Assert.fail(e.getMessage());
System.out.println(e.getMessage());
}
return R.ok().put("data",respMap);
}
}
5.3、開啟Nacos注冊(cè)和配置中心
編寫application.yml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
alicloud:
access-key: LTAI5tQRCX6FBx77qqhepLo9
secret-key: UGvWNebBJusYPTIv9kRfBsEckthRqF
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com
bucket: gulimall-jerry-jy
application:
name: gulimall-third-party
server:
port: 30000
配置bootstrap.properties
spring.application.name=gulimall-third-party
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=0b0b4ca3-539e-44ed-ab10-1f9ac6af6458
spring.cloud.nacos.config.ext-config[0].data-id=oss.yml
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
完成Nacos Server配置
配置詳情
5.3、開啟服務(wù)的注冊(cè)與發(fā)現(xiàn)@EnableDiscoveryClient
5.4、配置網(wǎng)關(guān)路由協(xié)議
- id: third_party_route
uri: lb://gulimall-third-party
predicates:
- Path=/api/thirdparty/**
filters:
- RewritePath=/api/thirdparty/(?<segment>.*),/$\{segment}
訪問http://localhost:88/api/thirdparty/oss/policy可以看到能響應(yīng)json數(shù)據(jù),說明服務(wù)的注冊(cè)與發(fā)現(xiàn)功能正常
6、前后聯(lián)調(diào)
6.1、開啟允許跨域訪問
要允許瀏覽器提交的所有的請(qǐng)求和允許所有的請(qǐng)求頭訪問OSS
先啟動(dòng)后端項(xiàng)目,再啟動(dòng)前端項(xiàng)目,上傳我們的本地圖片,可以看到是,圖片回顯是成功的
去阿里云控制臺(tái)檢查,可以看到能正常接受用戶上傳的圖片
【注意】
坑
圖片預(yù)覽沒用回顯,發(fā)現(xiàn)是
請(qǐng)求網(wǎng)址: https://gulimall-jerry-jy.https//oss-cn-hangzhou.aliyuncs.com/2022-07-22/41168c92-c4b5-4be0-8f5d-8bcade308477_1.png
這里多了一個(gè)https
經(jīng)檢查:原因是在application.yml
中的endpoint配置多了一個(gè)https://
應(yīng)該去掉
Nacos Server中的oss.yml
記得也要修改
再次上傳圖片,發(fā)送請(qǐng)求,能正?;仫@了,響應(yīng)頭也是正常文章來源:http://www.zghlxwxcb.cn/news/detail-406219.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-406219.html
到了這里,關(guān)于阿里云對(duì)象存儲(chǔ)服務(wù)OSS前后聯(lián)調(diào)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!