同步與異步模式
本文為您介紹阿里云Java SDK的架構模型,您可以根據具體的應用需求選擇不同架構,從而設計出高效、可靠Java程序。
阿里云Java SDK提供了同步(Synchronous)和異步(Asynchronous)兩種編程模型,它們的主要區別在于執行請求和處理響應的方式,以及對調用線程的影響。
同步與異步對比
模式 | 優點 | 缺點 |
同步 |
|
|
異步 |
|
|
同步模式
在同步模式下,發起請求后,調用線程會一直等待操作完成并返回結果,期間不做其他事情,因此線程被阻塞。適用于對延遲較為敏感且對吞吐量要求不高的場景,因為它保證了操作的順序性和結果的即時性。您可以引入阿里云Java SDK來實現該模式,Java SDK的獲取方式:
訪問阿里云門戶。
在頂部菜單欄選擇云產品,例如選擇云服務器ECS。
在所有語言欄目中選擇Java。
選擇您需要的安裝方式,將代碼復制到您的項目中。
在您的項目中安裝該SDK。
示例代碼
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
public class Sample {
public static void main(String[] args) throws Exception {
Config config = new com.aliyun.teaopenapi.models.Config();
// 從環境變量獲取RAM用戶的AccessKey ID
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// 從環境變量獲取RAM用戶的AccessKey SECRET
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// 地域ID
config.setRegionId("cn-hangzhou");
com.aliyun.ecs20140526.Client client = new com.aliyun.ecs20140526.Client(config);
// 運行時參數重試設置,僅對使用了該運行時參數實例的請求有效
RuntimeOptions runtimeOptions = new RuntimeOptions();
DescribeRegionsRequest describeRegionsRequest = new DescribeRegionsRequest();
// 同步調用
DescribeRegionsResponse describeRegionsResponse = client.describeRegionsWithOptions(describeRegionsRequest, runtimeOptions);
System.out.println(describeRegionsResponse.getBody());
}
}
異步模式
在異步模式下,請求發出后,調用者線程可以繼續執行其他任務,不等待操作完成,操作結果通常通過回調、事件、Future等方式通知調用者。適用于追求高吞吐量和系統響應性的場景,尤其是在處理大量并發請求時,能夠有效避免線程被長時間阻塞,提升整體處理效率。您可以引入Java(異步) SDK來實現該模式,Java(異步) SDK的獲取方式:
訪問阿里云門戶。
在頂部菜單欄選擇云產品,例如選擇云服務器ECS。
在所有語言欄目中選擇Java(異步)。
選擇您需要的安裝方式,將代碼復制到您的項目中。
在您的項目中安裝該SDK。
示例代碼
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.ecs20140526.AsyncClient;
import com.aliyun.sdk.service.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.sdk.service.ecs20140526.models.DescribeRegionsResponse;
import com.google.gson.Gson;
import darabonba.core.client.ClientOverrideConfiguration;
import java.util.concurrent.CompletableFuture;
public class DescribeRegions {
public static void main(String[] args) throws Exception {
// 使用靜態憑證提供者,從環境變量中獲取訪問憑證
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
// 從環境變量獲取RAM用戶的AccessKey ID和AccessKey Secret
.accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
.build());
// 構建異步客戶端,指定區域和憑證提供者
AsyncClient client = AsyncClient.builder()
.region("cn-hangzhou") // Region ID
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
// Endpoint 請參考 https://api.aliyun.com/product/Ecs
.setEndpointOverride("ecs.cn-chengdu.aliyuncs.com")
)
.build();
// 創建請求對象,用于查詢所有區域
DescribeRegionsRequest describeRegionsRequest = DescribeRegionsRequest.builder()
.build();
// 發起異步請求,并獲取響應的未來對象
CompletableFuture<DescribeRegionsResponse> response = client.describeRegions(describeRegionsRequest);
// 獲取結果(阻塞調用線程,直到異步調用完成)
DescribeRegionsResponse resp = response.get();
// 打印結果
System.out.println(new Gson().toJson(resp));
// 獲取結果(不阻塞調用線程,使得調用線程可以繼續執行其他任務,提高了程序的并發性和響應性)
/*response.thenAccept(resp -> {
System.out.println(new Gson().toJson(resp));
}).exceptionally(throwable -> { // Handling exceptions
System.out.println(throwable.getMessage());
return null;
});*/
// 關閉客戶端,釋放資源
client.close();
}
}