V2.0 SDK 和 V1.0 SDK
本文通過生成方案、語言支持、語言拓展、SDK場景化示例等多方面為您詳細介紹了阿里云SDK升級前后的差異。如果您之前使用過阿里云SDK集成云產品,發現現在文檔中的寫法與以前不同,可參考本文了解不同版本SDK差異,若您是初次使用阿里云SDK,請直接使用V2.0版本SDK。
V1.0 vs V2.0
對比項 | V1.0 SDK(不推薦) | V2.0 SDK(推薦) |
生成方案 | 基于模板生成,各編程語言之間采用不同的模板方案,各個語言之間功能完備程度不一致,使用體驗不一。 | 基于 DSL 語言 Darabonba 方案生成。新方案通過 DSL 語言進行統一的中間表達,并進行了語法校驗,使用體驗一致。 |
語言支持 | 大部分云產品的老版本SDK無法支持超過3門以上的主流語言。 | 支持主流6門語言的SDK生成。 |
語言擴展 | 模板化生成,擴展難度太高,老版本SDK很難擴展新語言。 | 新語言生成器只需接入DSL語言的AST即可完成擴展,未來還會新增更多的語言。 |
SDK 示例 | 各語言間的代碼示例不一致,不能保證代碼的正確性。 | 各語言間的代碼在邏輯行為上保持一致,通過中間語言來統一生成,具有校驗能力,有效保證示例代碼的準確性。 |
SDK 場景化示例 | 多語言場景化示例編寫困難,極少有產品提供,覆蓋語言數極少。 | 通過DSL一次編寫就能生成多語言的SDK場景化示例,可以協助開發者極大的簡化SDK使用的理解成本,更多示例請參見SDK 示例中心。 |
V1.0 SDK(不推薦)
由于V1.0 SDK存在體驗不一致、身份鑒權信息無法隔離等問題,官方不再推薦您繼續使用。
以下是V1.0 SDK的簡單模型圖。
阿里云 V1.0 SDK 主要分為三層:
產品SDK層,處理OpenAPI業務相關的參數。
核心SDK層,過渡OpenAPI業務參數到HTTP請求參數。
HTTP Client層,真正發起請求的部分。
在使用V1.0 SDK方式集成云產品服務時,我們通常需要引入核心SDK和產品SDK。
代碼示例
當我們同時調用多個不同產品的OpenAPI時,通用的Client
對象無法按照產品維度進行隔離,且容易產生線程安全問題。
<!-- ECS sdk -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-ecs</artifactId>
<version>5.11.7</version>
</dependency>
<!-- core sdk -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.1</version>
</dependency>
package com.example;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import com.aliyuncs.ecs.model.v20140526.*;
public class DescribeInstanceStatus {
public static void main(String[] args) {
// Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID
// and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
DefaultProfile profile = DefaultProfile.getProfile(
"<YOUR-REGION-ID>",
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
);
// use STS Token
// DefaultProfile profile = DefaultProfile.getProfile(
// "<YOUR-REGION-ID>", // The region ID
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), // The AccessKey ID of the RAM account
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), // The AccessKey Secret of the RAM account
// System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") // STS Token
// );
// init acs client
IAcsClient client = new DefaultAcsClient(profile);
// Create the request to query instance status
DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest();
request.setRegionId("<YOUR-REGION-ID>");
try {
DescribeInstanceStatusResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}
V2.0 SDK(推薦)
阿里云V1.0 SDK是較早使用的版本,不少老用戶習慣于V1.0的開發。阿里云V2.0 SDK是通過總結開發者在 V1.0中遇到的一系列問題后重新開發的一版SDK,新增了許多特性,主要以易于用戶理解,降低用戶接入成本并提升SDK的健壯性為主。
V2.0 SDK是基于阿里云自研的DSL語言Darabonba生成。DSL的靈活性不僅可以進行更多表達,而且通過解析DSL生成的AST也能抹平阿里云不同產品生產的不同風格OpenAPI的差異,輕松實現OpenAPI到SDK的生成。與V1.0相比,阿里云V2.0 SDK具備以下新特性:
使用體驗一致:解決V1.0 SDK中產品OpenAPI風格不同(RPC或ROA)造成使用方式不一致的問題。升級版SDK中所有云產品的SDK使用方式相同,使用體驗一致。
開發成本降低:通過DSL使SDK具備邏輯表達能力,解決了V1.0 SDK與SDK Core耦合性高的問題,降低了開發者因為SDK的升級帶來的開發成本。
身份和鑒權信息隔離:每個云產品的SDK提供一個Client對象,通過實例化Client對象就可以調用云產品的所有API。通過這樣的方式,不僅解決了V1.0 SDK單Client容易造成線程安全的問題,同時通過該方式使每個云產品之間身份和鑒權信息隔離,從而解決了用戶使用V1.0 SDK造成的profile信息在不同產品之間混用導致的權限管理問題。用戶也可以根據不同云產品OpenAPI的情況配置不同參數,例如服務地域、超時時間、HTTP代理、重試配置等。
支持復雜場景:V2.0 SDK支持更復雜的OpenAPI使用場景,例如智能視覺開放平臺的人臉人體(FaceBody)功能需要上傳圖片到OSS以后,通過生成的鏈接對圖片進行人工智能分析處理,就可以通過V2.0 SDK將上傳鑒權、上傳圖片、圖片分析三個操作組合,從而簡化OpenAPI的使用。
提供場景化示例:V2.0 SDK不僅為SDK中的所有的OpenAPI請求生成相應的示例,同時也通過對SDK中的多個OpenAPI請求進行組合,從而提供SDK的場景化示例,這樣的示例不僅可以幫助開發者降低接入 SDK的成本,也可以幫助開發者更好地理解云產品的業務場景。
因此,對于新用戶建議直接使用V2.0 SDK,老用戶也建議盡早遷移到V2.0 SDK。
代碼示例
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>ecs20140526</artifactId>
<version>5.1.8</version>
</dependency>
package com.example;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeInstanceStatusRequest;
public class Sample {
public static void main(String[] args) throws Exception {
Config config = new Config();
// 必填,您的 AccessKey ID, 請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// 必填,您的 AccessKey Secret, 請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// ECS 的 Endpoint, 請參考 https://api.aliyun.com/product/Ecs
config.setEndpoint("<Endpoint>");
Client client = new Client(config);
DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest()
.setRegionId("<YOUR-REGION-ID>");
try {
// 復制代碼運行請自行打印 API 的返回值
client.describeInstanceStatus(request);
} catch (TeaException error) {
error.printStackTrace();
} catch (Exception error) {
error.printStackTrace();
}
}
}
查看SDK的依賴信息
打開阿里云OpenAPI開發者門戶,選擇產品與服務,以專有網絡為示例。
選擇SDK 版本。
選擇語言,在安裝方式中可以查看產品對應語言所需的SDK依賴信息,在概述中查看SDK最新版本。