AWS SDK for Java1.x 和 2.x 有什么区别 - AWS SDK for Java 2.x

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

AWS SDK for Java1.x 和 2.x 有什么区别

本节介绍将应用程序从使用AWS SDK for Java版本 1.x 转换为版本 2.x 时需要注意的主要更改。

包名变更

从适用于 Java 1.x 的 SDK 到适用于 Java 2.x 的 SDK 的一个显著变化是包名称的变化。软件包名称以 software.amazon.awssdk SDK 2.x 开头,而 SDK 1.x 使用。com.amazonaws

这些相同的名称区分了从 SDK 1.x 到 SDK 2.x 的 Maven 工件。SDK 2.x 的 Maven 工件使用 software.amazon.awssdk groupID,而 SDK 1.x 使用 groupID。com.amazonaws

有几次,您的代码需要com.amazonaws依赖于一个项目,否则该项目仅使用 SDK 2.x 构件。其中一个例子是当你在服务器端AWS Lambda工作时。本指南前面的 “设置 Apache Maven 项目” 部分对此进行了介绍。

注意

SDK 1.x 中的多个软件包名称包含v2v2在这种情况下使用通常意味着软件包中的代码旨在与服务的版本 2 一起使用。

由于完整的软件包名称以开头com.amazonaws,因此它们是 SDK 1.x 组件。SDK 1.x 中这些包名称的示例有:

  • com.amazonaws.services.dynamodbv2

  • com.amazonaws.retry.v2

  • com.amazonaws.services.apigatewayv2

  • com.amazonaws.services.simpleemailv2

高级别库

诸如Amazon SQS客户端缓冲之类的高级库在 2.x 版本中尚不可用。有关已发布的库列表,请参阅 AWS SDK for Java 2.x 更新日志

如果您的应用程序依赖于 2.x 版本中未发布的库,请将您的pom.xml文件配置为同时使用 1.x 和 2.x。有关更多信息,请参阅同时使用这两个 SDK。side-by-side

将版本 2.x 添加到您的项目中

使用 AWS SDK for Java 2.x 时,推荐使用 Maven 来管理依赖关系。要将第 2 版组件添加到您的项目中,请使用对 SDK 的依赖项更新您的pom.xml文件。

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.16.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb</artifactId> </dependency> </dependencies>

客户构建器

您必须使用客户端生成器方法来创建所有客户端。构造函数不再可用。

例 在版本 1.x 中创建客户端
AmazonDynamoDB ddbClient = AmazonDynamoDBClientBuilder.defaultClient(); AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient();
例 在版本 2.x 中创建客户端
DynamoDbClient ddbClient = DynamoDbClient.create(); DynamoDbClient ddbClient = DynamoDbClient.builder().build();

客户端配置

在 1.x 中,通过在客户端或客户端生成器上设置ClientConfiguration实例来修改 SDK 客户端配置。在版本 2.x 中,已将客户端配置分为单独的配置类。使用不同的配置类,您可以为异步和同步客户端配置不同的 HTTP 客户端,但仍使用相同的ClientOverrideConfiguration类。

例 版本 1.x 中的客户端配置
AmazonDynamoDBClientBuilder.standard() .withClientConfiguration(clientConfiguration) .build()
例 版本 2.x 中的同步客户端配置
ProxyConfiguration.Builder proxyConfig = ProxyConfiguration.builder(); ApacheHttpClient.Builder httpClientBuilder = ApacheHttpClient.builder() .proxyConfiguration(proxyConfig.build()); ClientOverrideConfiguration.Builder overrideConfig = ClientOverrideConfiguration.builder(); DynamoDbClient client = DynamoDbClient.builder() .httpClientBuilder(httpClientBuilder) .overrideConfiguration(overrideConfig.build()) .build();
例 版本 2.x 中的异步客户端配置
NettyNioAsyncHttpClient.Builder httpClientBuilder = NettyNioAsyncHttpClient.builder(); ClientOverrideConfiguration.Builder overrideConfig = ClientOverrideConfiguration.builder(); ClientAsyncConfiguration.Builder asyncConfig = ClientAsyncConfiguration.builder(); DynamoDbAsyncClient client = DynamoDbAsyncClient.builder() .httpClientBuilder(httpClientBuilder) .overrideConfiguration(overrideConfig.build()) .asyncConfiguration(asyncConfig.build()) .build();

有关 1.x 和 2.x 之间客户端配置方法的完整映射,请参见 2.x 变更日志AWS SDK for Java。

Setter 方法

在 AWS SDK for Java 2.x 中,setter 方法名称不包含setwith前缀。例如,现在*.withEndpoint()*.endpoint()

例 在 1.x 中使用 setting 方法
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withRegion("us-east-1") .build();
例 在 2.x 中使用 setting 方法
DynamoDbClient client = DynamoDbClient.builder() .region(Region.US_EAST_1) .build();

类名

现在,所有客户端类名都完全采用驼色大小写,不再以其为前缀。Amazon这些更改与 AWS CLI 中使用的名称保持一致。有关客户机名称更改的完整列表,请参阅 AWS SDK for Java 2.x 变更日志

例 1.x 中的类名
AmazonDynamoDB AWSACMPCAAsyncClient
例 2.x 中的类名
DynamoDbClient AcmAsyncClient

区域类别

AWS SDK for Java 版本 1.x 在核心包和许多服务包中有多个 RegionRegions 类。版本 2.x 中的 RegionRegions 类现已折叠为一个核心类 Region

例 1.x 中的 Region 和 Regions 类
com.amazonaws.regions.Region com.amazonaws.regions.Regions com.amazonaws.services.ec2.model.Region
例 2.x 中的 Region 类
software.amazon.awssdk.regions.Region

有关与使用该Region类相关的更改的更多详细信息,请参阅区域类名称更改

不可变 POJO

客户端和操作的请求和响应对象现在不可变,并且在创建之后不能更改。要重复使用一个请求或响应变量,您必须生成一个要分配给该请求或响应变量的新对象。

例 在 1.x 中更新请求对象
DescribeAlarmsRequest request = new DescribeAlarmsRequest(); DescribeAlarmsResult response = cw.describeAlarms(request); request.setNextToken(response.getNextToken());
例 在 2.x 中更新请求对象
DescribeAlarmsRequest request = DescribeAlarmsRequest.builder().build(); DescribeAlarmsResponse response = cw.describeAlarms(request); request = DescribeAlarmsRequest.builder() .nextToken(response.nextToken()) .build();

直播操作

诸如Amazon S3getObjectputObject方法之类的流式处理操作现在支持非阻塞 I/O。因此,请求和响应 POJO 不再将请求和响应 POJO 用InputStream作参数。相反,请求对象接受RequestBody的是字节流。异步客户端接受 AsyncRequestBody

例 1.x 中亚马逊 S3 的putObject操作
s3client.putObject(BUCKET, KEY, new File(file_path));
例 2.x 中亚马逊 S3 的putObject操作
s3client.putObject(PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), RequestBody.of(Paths.get("myfile.in")));

响应对象以并行方式接受 ResponseTransformer(对于同步客户端)和 AsyncResponseTransformer(对于异步客户端)。

例 1.x 中亚马逊 S3 的getObject操作
S3Object o = s3.getObject(bucket, key); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key));
例 2.x 中亚马逊 S3 的getObject操作
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("key")));

Exception 更改

异常类名、它们的结构和它们的关系也发生了变化。 software.amazon.awssdk.core.exception.SdkException是所有其他异常都扩展的新基Exception类。

有关映射到 1.x 异常的 2.x 异常类名的完整列表,请参阅异常类名更改

特定服务的变更

亚马逊 S3 操作名称变更

在 AWS SDK for Java 2.x 中,Amazon S3客户端的许多操作名称已更改。在版本 1.x 中,不直接从服务 API 生成 Amazon S3 客户端。这会导致开发工具包操作与服务 API 之间的不一致。在版本 2.x 中,我们现在生成 Amazon S3 客户端以提高与服务 API 的一致性。

例 1.x 中的 Amazon S3 客户端操作
changeObjectStorageClass
例 2.x 中的 Amazon S3 客户端操作
copyObject
例 Amazon S3 服务 API 中的 Amazon S3 客户端操作
CopyObject

有关操作名称映射的完整列表,请参见 AWS SDK for Java 2.x 变更日志。

跨区域访问

出于安全最佳实践,单一客户端不再支持跨区域访问。

在 1.x 版本中,允许Amazon S3Amazon SNS、和Amazon SQS等服务跨区域边界访问资源。在使用相同客户端的 2.x 版中不再允许这样做。如果您需要访问其他地区的资源,则必须在该区域创建客户端,然后使用相应的客户端检索资源。

主题