加速OSS資源遠(yuǎn)距離上傳和下載
如果您希望實(shí)現(xiàn)Bucket遠(yuǎn)距離數(shù)據(jù)傳輸加速,例如從中國(guó)內(nèi)地向非中國(guó)內(nèi)地Bucket請(qǐng)求加速上傳或下載文件,您可以開(kāi)啟傳輸加速。傳輸加速利用全球分布的云機(jī)房,將全球各地用戶對(duì)Bucket的訪問(wèn),經(jīng)過(guò)智能路由解析至就近的接入點(diǎn),使用優(yōu)化后的網(wǎng)絡(luò)及協(xié)議,為云存儲(chǔ)的上傳、下載提供端到端的加速方案。
前提條件
當(dāng)前賬號(hào)已完成實(shí)名認(rèn)證。具體步驟,請(qǐng)參見(jiàn)未實(shí)名認(rèn)證賬號(hào)認(rèn)證引導(dǎo)。
使用場(chǎng)景
遠(yuǎn)距離數(shù)據(jù)傳輸加速
例如全球性的論壇、Top在線協(xié)同辦公平臺(tái)等,部分客戶會(huì)因傳輸距離較遠(yuǎn)導(dǎo)致上傳和下載體驗(yàn)非常差。傳輸加速功能可以讓全球各地的客戶使用優(yōu)化后的網(wǎng)絡(luò)來(lái)傳輸數(shù)據(jù),極大地提升上傳和下載速度,讓不同地域的用戶都能有很好的訪問(wèn)體驗(yàn)。
GB、TB級(jí)大文件上傳和下載
通過(guò)互聯(lián)網(wǎng)遠(yuǎn)距離上傳和下載大文件時(shí),經(jīng)常會(huì)因?yàn)榫W(wǎng)絡(luò)延遲過(guò)大而導(dǎo)致傳輸失敗。傳輸加速功能使用優(yōu)化的互聯(lián)網(wǎng)傳輸鏈路、調(diào)優(yōu)的協(xié)議棧與傳輸算法,可大幅減少遠(yuǎn)距離互聯(lián)網(wǎng)傳輸超時(shí)的比例。您還可以結(jié)合使用傳輸加速功能與分片上傳、斷點(diǎn)續(xù)傳下載,形成遠(yuǎn)距離大文件上傳和下載的解決方案。
非靜態(tài)、非熱點(diǎn)數(shù)據(jù)下載加速
例如相冊(cè)應(yīng)用、游戲、電商、社交應(yīng)用的評(píng)論內(nèi)容、企業(yè)門戶網(wǎng)站、金融類APP等,用戶的下載體驗(yàn)直接影響產(chǎn)品競(jìng)爭(zhēng)力和客戶留存率。傳輸加速功能作為專為OSS上傳、下載加速而設(shè)計(jì)的功能,可以最大限度利用客戶端的網(wǎng)絡(luò)能力,提升用戶的下載體驗(yàn)。
注意事項(xiàng)
華東1(杭州)、華東2(上海)、華東5(南京-本地地域)、華東6(福州-本地地域)、華北1(青島)、華北2(北京)、華北 3(張家口)、華北5(呼和浩特)、華北6(烏蘭察布)、華南1(深圳)、華南2(河源)、華南3(廣州)、西南1(成都)、中國(guó)香港、美國(guó)(硅谷)、美國(guó)(弗吉尼亞)、日本(東京)、韓國(guó)(首爾)、新加坡、馬來(lái)西亞(吉隆坡)、印度尼西亞(雅加達(dá))、菲律賓(馬尼拉)、泰國(guó)(曼谷)、德國(guó)(法蘭克福)、英國(guó)(倫敦)、阿聯(lián)酋(迪拜)地域支持開(kāi)啟傳輸加速。
通過(guò)傳輸加速Endpoint上傳數(shù)據(jù)時(shí),會(huì)產(chǎn)生加速上傳流量。通過(guò)傳輸加速Endpoint下載數(shù)據(jù)時(shí),會(huì)產(chǎn)生加速下載流量,同時(shí)會(huì)與OSS外網(wǎng)流出流量同時(shí)計(jì)算。例如,通過(guò)傳輸加速Endpoint從開(kāi)啟傳輸加速功能的存儲(chǔ)空間中下載了1 GB的數(shù)據(jù),則會(huì)產(chǎn)生1 GB傳輸加速費(fèi)用和1 GB外網(wǎng)流出流量費(fèi)用。更多信息,請(qǐng)參見(jiàn)傳輸加速費(fèi)用和流量費(fèi)用。
開(kāi)啟傳輸加速功能后,必須使用OSS的傳輸加速域名才會(huì)提升訪問(wèn)速度。此外,OSS提供的默認(rèn)Endpoint仍可正常使用。在不需要傳輸加速的場(chǎng)景中,您可以使用默認(rèn)Endpoint以減少傳輸加速的費(fèi)用。關(guān)于默認(rèn)Endpoint,請(qǐng)參見(jiàn)OSS地域和訪問(wèn)域名。
傳輸加速Endpoint僅支持HTTP/HTTPS協(xié)議的API接入,不支持RTMP協(xié)議等非HTTP/HTTPS協(xié)議的API接入。
為保證數(shù)據(jù)傳輸安全,傳輸加速后端加速邏輯會(huì)視情況選擇使用HTTPS協(xié)議進(jìn)行數(shù)據(jù)傳輸。所以,客戶端使用HTTP協(xié)議通過(guò)傳輸加速域名訪問(wèn)OSS時(shí),在OSS的訪問(wèn)日志中查看到訪問(wèn)協(xié)議可能是HTTPS。
開(kāi)啟傳輸加速
開(kāi)啟傳輸加速后,Bucket會(huì)在保留默認(rèn)Endpoint的基礎(chǔ)上,新增以下兩種傳輸加速Endpoint。
全球加速Endpoint:地址為
oss-accelerate.aliyuncs.com
。傳輸加速接入點(diǎn)分布在全球各地,全球各地的Bucket均可以使用該域名進(jìn)行傳輸加速。非中國(guó)內(nèi)地加速Endpoint:地址為
oss-accelerate-overseas.aliyuncs.com
。傳輸加速接入點(diǎn)分布在除中國(guó)內(nèi)地以外的各地域,僅在中國(guó)香港及海外各地域Bucket綁定未備案的域名做CNAME指向時(shí)使用。
您可以通過(guò)以下多種方式開(kāi)啟傳輸加速。
使用OSS控制臺(tái)
單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱。
在左側(cè)導(dǎo)航欄,選擇Bucket 配置>傳輸加速。
在傳輸加速頁(yè)面,打開(kāi)開(kāi)啟傳輸加速開(kāi)關(guān),然后在彈出的對(duì)話框單擊確定。
傳輸加速開(kāi)啟操作會(huì)在30分鐘內(nèi)全網(wǎng)生效。關(guān)閉傳輸加速操作也需要在30分鐘內(nèi)全網(wǎng)生效。
使用阿里云SDK
以下僅列舉常見(jiàn)SDK開(kāi)啟傳輸加速的代碼示例。關(guān)于其他SDK的開(kāi)啟傳輸加速的代碼示例,請(qǐng)參見(jiàn)SDK簡(jiǎn)介。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 創(chuàng)建OSSClient實(shí)例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 設(shè)置Bucket的傳輸加速狀態(tài)。
// 當(dāng)設(shè)置enabled為true時(shí),表示開(kāi)啟傳輸加速;當(dāng)設(shè)置enabled為false時(shí),表示關(guān)閉傳輸加速。
boolean enabled = true;
ossClient.setBucketTransferAcceleration(bucketName, enabled);
} 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());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對(duì)應(yīng)的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數(shù)
region = "cn-hangzhou"
# examplebucket填寫存儲(chǔ)空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 設(shè)置Bucket的傳輸加速狀態(tài)。
# 當(dāng)設(shè)置enabled為true時(shí),表示開(kāi)啟傳輸加速;當(dāng)設(shè)置enabled為false時(shí),表示關(guān)閉傳輸加速。
enabled = 'true'
bucket.put_bucket_transfer_acceleration(enabled)
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error: %v", err)
}
// 填寫B(tài)ucket名稱。
bucketName := "examplebucket"
// 開(kāi)啟Bucket的傳輸加速狀態(tài)。
// Enabled表示傳輸加速的開(kāi)關(guān),取值為true表示開(kāi)啟傳輸加速,取值為false表示關(guān)閉傳輸加速。
accConfig := oss.TransferAccConfiguration{
Enabled: true,
}
err = client.SetBucketTransferAcc(bucketName, accConfig)
if err != nil {
log.Fatalf("Error: %v", err)
}
// 輸出成功信息
log.Println("Set bucket transfer accelerate success")
}
使用REST API
如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫代碼計(jì)算簽名。更多信息,請(qǐng)參見(jiàn)PutBucketTransferAcceleration。
使用傳輸加速
使用瀏覽器
通過(guò)瀏覽器訪問(wèn)OSS時(shí),將文件URL的Endpoint字段替換為傳輸加速Endpoint,例如https://test.oss-cn-shenzhen.aliyuncs.com/myphoto.jpg
需改為https://test.oss-accelerate.aliyuncs.com/myphoto.jpg
。如果文件訪問(wèn)權(quán)限為私有,則還需要加上簽名信息。
使用命令行工具ossutil
替換配置文件的Endpoint為傳輸加速Endpoint
通過(guò)ossutil訪問(wèn)時(shí),您可以將配置文件內(nèi)的Endpoint替換為傳輸加速Endpoint。具體操作,請(qǐng)參見(jiàn)ossutil。
在命令示例中增加
-e oss-accelerate.aliyuncs.com
在使用ossutil相關(guān)命令時(shí),在命令示例中增加
-e oss-accelerate.aliyuncs.com
。下圖表示在cp命令上傳場(chǎng)景中使用了傳輸加速Endpoint。
使用圖形化管理工具ossbrowser
通過(guò)ossbrowser訪問(wèn)OSS時(shí),除了要填寫AccessKey(AK)信息以外,還必須指定預(yù)設(shè)OSS路徑。
各配置項(xiàng)說(shuō)明如下:
參數(shù) | 說(shuō)明 |
Endpoint | 選擇自定義,并填寫傳輸加速Endpoint |
AccessKeyId、AccessKeySecret | 填寫賬號(hào)的AccessKey(AK)信息。獲取AccessKey的方式,請(qǐng)參見(jiàn)創(chuàng)建AccessKey。 重要 為保證數(shù)據(jù)安全,推薦您使用RAM用戶的AccessKey登錄ossbrowser。使用RAM用戶登錄之前,需要為RAM用戶授予 |
預(yù)設(shè)OSS路徑 | 指定訪問(wèn)某個(gè)Bucket或Bucket某個(gè)路徑下資源的訪問(wèn)權(quán)限。預(yù)設(shè)OSS路徑格式為 |
配置示例如下:
使用阿里云SDK
通過(guò)各語(yǔ)言SDK訪問(wèn)OSS時(shí),將Endpoint設(shè)置為傳輸加速Endpoint。此處以Java SDK的簡(jiǎn)單上傳和簡(jiǎn)單下載為例介紹。
簡(jiǎn)單上傳
import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.PutObjectRequest; import java.io.File; public class Demo { public static void main(String[] args) throws Exception { // 填寫傳輸加速Endpoint。以全球加速Endpoint為例。 String endpoint = "https://oss-accelerate.aliyuncs.com"; // 強(qiáng)烈建議不要把訪問(wèn)憑證保存到工程代碼里,否則可能導(dǎo)致訪問(wèn)憑證泄露,威脅您賬號(hào)下所有資源的安全。本代碼示例以從環(huán)境變量中獲取訪問(wèn)憑證為例。運(yùn)行本代碼示例之前,請(qǐng)先配置環(huán)境變量。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 填寫Bucket名稱,例如examplebucket。 String bucketName = "examplebucket"; // 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。 String objectName = "exampledir/exampleobject.txt"; // 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。 // 如果未指定本地路徑,則默認(rèn)從示例程序所屬項(xiàng)目對(duì)應(yīng)本地路徑中上傳文件。 String filePath= "D:\\localpath\\examplefile.txt"; // 創(chuàng)建OSSClient實(shí)例。 OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { // 創(chuàng)建PutObjectRequest對(duì)象。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, filePath); // 如果需要上傳時(shí)設(shè)置存儲(chǔ)類型和訪問(wèn)權(quán)限,請(qǐng)參考以下示例代碼。 // ObjectMetadata metadata = new ObjectMetadata(); // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString()); // metadata.setObjectAcl(CannedAccessControlList.Private); // putObjectRequest.setMetadata(metadata); // 上傳文件。 ossClient.putObject(putObjectRequest); } 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()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }
簡(jiǎn)單下載
import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.GetObjectRequest; import java.io.File; public class Demo { public static void main(String[] args) throws Exception { // 填寫傳輸加速Endpoint。以全球加速Endpoint為例。 String endpoint = "https://oss-accelerate.aliyuncs.com"; // 強(qiáng)烈建議不要把訪問(wèn)憑證保存到工程代碼里,否則可能導(dǎo)致訪問(wèn)憑證泄露,威脅您賬號(hào)下所有資源的安全。本代碼示例以從環(huán)境變量中獲取訪問(wèn)憑證為例。運(yùn)行本代碼示例之前,請(qǐng)先配置環(huán)境變量。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 填寫Bucket名稱,例如examplebucket。 String bucketName = "examplebucket"; // 填寫不包含Bucket名稱在內(nèi)的Object完整路徑,例如testfolder/exampleobject.txt。 String objectName = "testfolder/exampleobject.txt"; String filePath = "D:\\localpath\\examplefile.txt"; // 創(chuàng)建OSSClient實(shí)例。 OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { // 下載Object到本地文件,并保存到指定的本地路徑中。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。 // 如果未指定本地路徑,則下載后的文件默認(rèn)保存到示例程序所屬項(xiàng)目對(duì)應(yīng)本地路徑中。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(filePath)); } 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()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }
測(cè)試傳輸加速效果
使用命令行工具ossutil
通過(guò)在ossutil命令示例中測(cè)試未開(kāi)啟傳輸加速前(即使用-e oss-us-west-1.aliyuncs.com
)以及開(kāi)啟傳輸加速后(即使用-e oss-accelerate.aliyuncs.com
)上傳文件所需時(shí)間的差異。
使用在線工具
您可以通過(guò)OSS互聯(lián)網(wǎng)連通與測(cè)速工具測(cè)試您本地訪問(wèn)全球各地?cái)?shù)據(jù)中心時(shí),開(kāi)啟傳輸加速與未開(kāi)啟傳輸加速的訪問(wèn)速度。
常見(jiàn)問(wèn)題
除傳輸加速外,OSS是否提供其他加速方案?
除傳輸加速外,您還可以選擇CDN加速實(shí)現(xiàn)加速訪問(wèn)OSS資源。更多信息,請(qǐng)參見(jiàn)CDN加速訪問(wèn)。
是否支持同時(shí)配置多種加速方案?
支持。例如您已開(kāi)啟CDN加速,并希望同時(shí)使用傳輸加速。您只需要開(kāi)啟傳輸加速,并將CDN回源到傳輸加速域名即可。更多信息,請(qǐng)參見(jiàn)綁定CDN加速域名。
為什么使用傳輸加速Endpoint無(wú)法列舉Bucket?
傳輸加速服務(wù)僅針對(duì)攜帶Bucket名稱信息的三級(jí)域名(格式為https://BucketName.oss-accelerate.aliyuncs.com
)提供解析服務(wù)。而列舉Bucket的請(qǐng)求域名中不攜帶Bucket名稱信息,因此您無(wú)法使用傳輸加速Endpoint列舉Bucket。建議您通過(guò)默認(rèn)Endpoint列舉目標(biāo)地域的Bucket,例如https://oss-cn-hangzhou.aliyuncs.com
。