如果您希望實現Bucket遠距離資料轉送加速,例如從中國內地向非中國內地Bucket請求加速上傳或下載檔案,您可以開啟傳輸加速。傳輸加速利用全球分布的雲機房,將全球各地使用者對Bucket的訪問,經過智能路由解析至就近的存取點,使用最佳化後的網路及協議,為雲端儲存的上傳、下載提供端到端的加速方案。
前提條件
當前帳號已完成實名登記。具體步驟,請參見如何進行實名登記?
使用情境
遠距離資料轉送加速
例如全球論壇、線上協同辦公平台等,部分客戶會因傳輸距離較遠導致上傳和下載體驗非常差。傳輸加速功能可以讓全球各地的客戶使用最佳化後的網路來傳輸資料,極大地提升上傳和下載速度,讓不同地區的使用者都能有很好的訪問體驗。
GB、TB級大檔案上傳和下載
通過互連網遠距離上傳和下載大檔案時,經常會因為網路延遲過大而導致傳輸失敗。傳輸加速功能使用最佳化的互連網傳輸鏈路、調優的協議棧與傳輸演算法,可大幅減少遠距離互連網傳輸逾時的比例。您還可以結合使用傳輸加速功能與分區上傳、斷點續傳下載,形成遠距離大檔案上傳和下載的解決方案。
非靜態、非熱點資料下載加速
例如相簿應用、遊戲、電商、社交應用的評論內容、企業門戶網站、金融類APP等,使用者的下載體驗直接影響產品競爭力和客戶留存率。傳輸加速功能作為專為OSS上傳、下載加速而設計的功能,可以最大限度利用用戶端的網路能力,提升使用者的下載體驗。
注意事項
華東1(杭州)、華東2(上海)、華東5(南京-本地地區)、華東6(福州-本地地區)、華北1(青島)、華北2(北京)、華北 3(張家口)、華北5(呼和浩特)、華北6(烏蘭察布)、華南1(深圳)、華南2(河源)、華南3(廣州)、西南1(成都)、中國香港、美國(矽谷)、美國(維吉尼亞)、日本(東京)、韓國(首爾)、新加坡、馬來西亞(吉隆坡)、印尼(雅加達)、菲律賓(馬尼拉)、泰國(曼穀)、德國(法蘭克福)、英國(倫敦)、阿聯酋(杜拜)地區支援開啟傳輸加速。
通過傳輸加速Endpoint上傳資料時,會產生加速上傳流量。通過傳輸加速Endpoint下載資料時,會產生加速下載流量,同時會與OSS外網流出流量同時計算。例如,通過傳輸加速Endpoint從開啟傳輸加速功能的儲存空間中下載了1 GB的資料,則會產生1 GB傳輸加速費用和1 GB外網流出流量費用。更多資訊,請參見傳輸加速費用和流量費用。
開啟傳輸加速功能後,必須使用OSS的傳輸加速網域名稱才會提升訪問速度。此外,OSS提供的預設Endpoint仍可正常使用。在不需要傳輸加速的情境中,您可以使用預設Endpoint以減少傳輸加速的費用。關於預設Endpoint,請參見OSS地區和訪問網域名稱。
傳輸加速Endpoint僅支援HTTP/HTTPS協議的API接入,不支援RTMP協議等非HTTP/HTTPS協議的API接入。
為保證資料轉送安全,傳輸加速後端加速邏輯會視情況選擇使用HTTPS協議進行資料轉送。所以,用戶端使用HTTP協議通過傳輸加速網域名稱訪問OSS時,在OSS的訪問日誌中查看到訪問協議可能是HTTPS。
開啟傳輸加速
開啟傳輸加速後,Bucket會新增以下兩種傳輸加速Endpoint,同時保留預設Endpoint。
Global AccelerationEndpoint:地址為
oss-accelerate.aliyuncs.com
。傳輸加速存取點分布在全球各地,全球各地的Bucket均可以使用該網域名稱進行傳輸加速。非中國內地加速Endpoint:地址為
oss-accelerate-overseas.aliyuncs.com
。傳輸加速存取點分布在除中國內地以外的各地區,僅在中國香港及海外各地區Bucket綁定未備案的網域名稱做CNAME指向時使用。
您可以通過以下多種方式開啟傳輸加速。
使用OSS控制台
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇Bucket 配置>傳輸加速。
在傳輸加速頁面,開啟開啟傳輸加速開關,然後在彈出的對話方塊單擊確定。
傳輸加速開啟操作會在30分鐘內全網生效。關閉傳輸加速操作也需要在30分鐘內全網生效。
使用阿里雲SDK
以下僅列舉常見SDK開啟傳輸加速的程式碼範例。關於其他SDK的開啟傳輸加速的程式碼範例,請參見SDK簡介。
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請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 建立OSSClient執行個體。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 設定Bucket的傳輸加速狀態。
// 當設定enabled為true時,表示開啟傳輸加速;當設定enabled為false時,表示關閉傳輸加速。
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
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# examplebucket填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 設定Bucket的傳輸加速狀態。
# 當設定enabled為true時,表示開啟傳輸加速;當設定enabled為false時,表示關閉傳輸加速。
enabled = 'true'
bucket.put_bucket_transfer_acceleration(enabled)
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令列參數
flag.Parse()
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立設定儲存空間傳輸加速的請求
request := &oss.PutBucketTransferAccelerationRequest{
Bucket: oss.Ptr(bucketName), // 儲存空間名稱
TransferAccelerationConfiguration: &oss.TransferAccelerationConfiguration{
Enabled: oss.Ptr(true), // 啟用傳輸加速
},
}
// 執行設定儲存空間傳輸加速的請求
result, err := client.PutBucketTransferAcceleration(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket transfer acceleration %v", err)
}
// 列印設定儲存空間傳輸加速的結果
log.Printf("put bucket transfer acceleration result:%#v\n", result)
}
使用命令列工具ossutil
您可以使用命令列工具ossutil來開啟傳輸加速,ossutil的安裝請參見安裝ossutil。
以下命令用於為儲存空間examplebucket配置傳輸加速。
ossutil api put-bucket-transfer-acceleration --bucket examplebucket --transfer-acceleration-configuration "{\"Enabled\":\"true\"}"
關於該命令的更多資訊,請參見put-bucket-transfer-acceleration。
使用傳輸加速
使用瀏覽器
通過瀏覽器訪問OSS時,將檔案URL的Endpoint欄位替換為傳輸加速Endpoint,例如https://test.oss-cn-shenzhen.aliyuncs.com/myphoto.jpg
需改為https://test.oss-accelerate.aliyuncs.com/myphoto.jpg
。如果檔案存取權限為私人,則還需要加上籤名資訊。
使用命令列工具ossutil
通過ossutil訪問OSS時持久啟用傳輸加速功能,您可以將設定檔內的Endpoint替換為傳輸加速Endpoint。
首先,找到並開啟ossutil的設定檔。預設情況下,設定檔位於以下路徑:
Linux:
/home/user/.ossutilconfig
Windows:
C:\Users\user\.ossutilconfig
macOS:
/Users/user/.ossutilconfig
如果您在配置ossutil時指定了不同的路徑,請使用您指定的路徑。
修改Endpoint,在設定檔中,找到
endpoint
欄位,並將其值修改為傳輸加速Endpoint:[Credentials] endpoint = oss-accelerate.aliyuncs.com accessKeyID = LTAI4Fw2NbDUCV8z******** accessKeySecret = 67DLVBkH7EamOjy2W5RVAH******** region=cn-hangzhou
儲存對設定檔的修改。
在使用ossutil相關命令時,還可以在命令樣本中增加
-e oss-accelerate.aliyuncs.com
,僅對當前命令有效。以下命令表示在cp命令上傳情境中使用了傳輸加速Endpoint。ossutil cp /path/to/local/file oss://examplebucket/exampleobject -e oss-accelerate.aliyuncs.com
使用圖形化管理工具ossbrowser 1.0
通過ossbrowser訪問OSS時,除了要填寫AccessKey(AK)資訊以外,還必須指定預設OSS路徑。
各配置項說明如下:
參數 | 說明 |
Endpoint | 選擇自訂,並填寫傳輸加速Endpoint |
AccessKeyId、AccessKeySecret | 填寫帳號的AccessKey(AK)資訊。擷取AccessKey的方式,請參見建立AccessKey。 重要 為保證資料安全,推薦您使用RAM使用者的AccessKey登入ossbrowser。使用RAM使用者登入之前,需要為RAM使用者授予 |
預設OSS路徑 | 指定訪問某個Bucket或Bucket某個路徑下資源的存取權限。預設OSS路徑格式為 |
配置樣本如下:
使用阿里雲SDK
通過各語言SDK訪問OSS時,將Endpoint設定為傳輸加速Endpoint,此處以簡單上傳和簡單下載為例介紹。
簡單上傳
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。以Global AccelerationEndpoint為例。 String endpoint = "https://oss-accelerate.aliyuncs.com"; // 強烈建議不要把訪問憑證儲存到工程代碼裡,否則可能導致訪問憑證泄露,威脅您帳號下所有資源的安全。本程式碼範例以從環境變數中擷取訪問憑證為例。運行本程式碼範例之前,請先配置環境變數。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 填寫Bucket名稱,例如examplebucket。 String bucketName = "examplebucket"; // 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。 String objectName = "exampledir/exampleobject.txt"; // 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。 // 如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。 String filePath= "D:\\localpath\\examplefile.txt"; // 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。 String region = "cn-hangzhou"; // 建立OSSClient執行個體。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // 顯式聲明使用V4簽名 clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // 建立PutObjectRequest對象。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, filePath); // 如果需要上傳時設定儲存類型和存取權限,請參考以下範例程式碼。 // 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(); } } } }
package main import ( "context" "flag" "log" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" ) // 定義全域變數 var ( region string // 儲存地區 bucketName string // 儲存空間名稱 objectName string // 對象名稱 ) // init函數用於初始化命令列參數 func init() { flag.StringVar(®ion, "region", "", "The region in which the bucket is located.") flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.") flag.StringVar(&objectName, "object", "", "The name of the object.") } func main() { // 解析命令列參數 flag.Parse() // 檢查bucket名稱是否為空白 if len(bucketName) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, bucket name required") } // 檢查region是否為空白 if len(region) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, region required") } // 檢查object名稱是否為空白 if len(objectName) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, object name required") } // 載入預設配置並設定憑證提供者和地區 cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). WithRegion(region). WithEndpoint("oss-accelerate.aliyuncs.com") // 設定加速網域名稱 // 建立OSS用戶端 client := oss.NewClient(cfg) // 填寫要上傳的本地檔案路徑和檔案名稱,例如 /Users/localpath/exampleobject.txt localFile := "/Users/localpath/exampleobject.txt" // 建立上傳對象的請求 putRequest := &oss.PutObjectRequest{ Bucket: oss.Ptr(bucketName), // 儲存空間名稱 Key: oss.Ptr(objectName), // 對象名稱 StorageClass: oss.StorageClassStandard, // 指定對象的儲存類型為標準儲存 Acl: oss.ObjectACLPrivate, // 指定對象的存取權限為私人訪問 } // 執行上傳對象的請求 result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile) if err != nil { log.Fatalf("failed to put object from file %v", err) } // 列印上傳對象的結果 log.Printf("put object result:%#v\n", result) }
簡單下載
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。以Global AccelerationEndpoint為例。 String endpoint = "https://oss-accelerate.aliyuncs.com"; // 強烈建議不要把訪問憑證儲存到工程代碼裡,否則可能導致訪問憑證泄露,威脅您帳號下所有資源的安全。本程式碼範例以從環境變數中擷取訪問憑證為例。運行本程式碼範例之前,請先配置環境變數。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 填寫Bucket名稱,例如examplebucket。 String bucketName = "examplebucket"; // 填寫不包含Bucket名稱在內的Object完整路徑,例如testfolder/exampleobject.txt。 String objectName = "testfolder/exampleobject.txt"; String filePath = "D:\\localpath\\examplefile.txt"; // 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。 String region = "cn-hangzhou"; // 建立OSSClient執行個體。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // 顯式聲明使用V4簽名 clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // 下載Object到本地檔案,並儲存到指定的本地路徑中。如果指定的本地檔案存在會覆蓋,不存在則建立。 // 如果未指定本地路徑,則下載後的檔案預設儲存到樣本程式所屬專案對應本地路徑中。 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(); } } } }
package main import ( "context" "flag" "log" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" ) // 定義全域變數 var ( region string // 儲存地區 bucketName string // 儲存空間名稱 objectName string // 對象名稱 ) // init函數用於初始化命令列參數 func init() { flag.StringVar(®ion, "region", "", "The region in which the bucket is located.") flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.") flag.StringVar(&objectName, "object", "", "The name of the object.") } func main() { // 解析命令列參數 flag.Parse() // 檢查bucket名稱是否為空白 if len(bucketName) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, bucket name required") } // 檢查region是否為空白 if len(region) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, region required") } // 檢查object名稱是否為空白 if len(objectName) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, object name required") } // 載入預設配置並設定憑證提供者和地區 cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). WithRegion(region). WithEndpoint("oss-accelerate.aliyuncs.com") // 設定加速網域名稱 // 建立OSS用戶端 client := oss.NewClient(cfg) // 填寫本地檔案路徑和檔案名稱,例如 /Users/localpath/downloadobject.txt localFile := "/Users/localpath/exampleobject.txt" // 建立下載對象到本地檔案的請求 getRequest := &oss.GetObjectRequest{ Bucket: oss.Ptr(bucketName), // 儲存空間名稱 Key: oss.Ptr(objectName), // 對象名稱 } // 執行下載對象到本地檔案的操作並處理結果 result, err := client.GetObjectToFile(context.TODO(), getRequest, localFile) if err != nil { log.Fatalf("failed to get object to file %v", err) } log.Printf("Get object sucessfully, Result: HTTPStatusCode=%d, ContentLength=%d\n", result.StatusCode, result.ContentLength) }
測試傳輸加速效果
使用命令列工具ossutil
通過在ossutil命令樣本中測試未開啟傳輸加速前(即使用-e oss-us-west-1.aliyuncs.com
)以及開啟傳輸加速後(即使用-e oss-accelerate.aliyuncs.com
)上傳檔案所需時間的差異。
常見問題
除傳輸加速外,OSS是否提供其他加速方案?
是否支援同時配置多種加速方案?
為什麼使用傳輸加速Endpoint無法列舉Bucket?
相關API
以上操作方式底層基於API實現,如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketTransferAcceleration。