配置AWS基于 CRT 的 HTTP 客户端 - AWS SDK for Java 2.x

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

配置AWS基于 CRT 的 HTTP 客户端

AwsCrtAsyncHttpClient是一个新的异步 HTTP 客户端,您可以将其与一起使用AWS SDK for Java 2.x。为 SDK 的 HTTP 客户端AwsCrtAsyncHttpClient带来了以下好处。

  • 更快的 SDK 启动时间

  • 更小的内存占用

  • 缩短延迟时间

  • 连接运行状况管理

  • DNS 负载均衡

本主题是关于使用和配置AWS基于 CRT 的 HTTP 客户端。有关配置基于 Netty 的 HTTP 客户端的信息,请参阅上一主题。

AWSSDK 中基于 CRT 的组件

本主题中描述AWS的基于 CRT 的 HTTP 客户端和AWS基于 CRT 的 S3 客户端是 SDK 中的不同组件。

AWS基于 CRT 的 HTTP 客户端SdkAsyncHttpClient接口的实现,用于常规 HTTP 通信。它是该SdkAsyncHttpClient接口的 Netty 实现的替代方案,具有多种好处。

AWS基于 CRT 的 S3 客户端是 S 3 AsyncClient 接口的实现,用于与 Amazon S3 服务配合使用。它是基于 Java 的S3AsyncClient接口实现的替代方案,具有多种优点。

尽管这两个组件都使用 Comm AWSon Runtime 中的库,但AWS基于 CRT 的 HTTP 客户端不使用 aws-c-s3 库,也不支持 S3 分段上传 API 功能。相比之下,AWS基于 CRT 的 S3 客户端是专门为支持 S3 分段上传 API 功能而构建的。

访问 AwsCrtAsyncHttpClient

在使用AWS基于 CRT 的 HTTP 客户端之前,请将aws-crt-client 工件添加到项目的依赖项中。

以下 Maven pom.xml 显示了使用物料清单 (BOM) 机制声明的AWS基于 CRT 的 HTTP 客户端。

<project> <properties> <aws.sdk.version>VERSION</aws.sdk.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> </dependencies> </project>

访问 Maven 中央存储库以获取最新的版本值。

配置AwsCrtAsyncHttpClient

您可以在构建服务客户端的AwsCrtAsyncHttpClient同时配置实例,也可以将单个实例配置为在多个服务客户端之间共享。

无论使用哪种方法,您都可以使用 AwsCrtAsyncHttpClient.Builder 为AWS基于 CRT 的 HTTP 客户端实例配置属性。

最佳实践:将AwsCrtAsyncHttpClient实例专用于服务客户端

如果您需要配置的实例AwsCrtAsyncHttpClient,我们建议您构建专用实AwsCrtAsyncHttpClient例。你可以使用服务客户端的生成器的httpClientBuilder方法来做到这一点。这样,HTTP 客户端的生命周期由 SDK 管理,这有助于避免在不再需要AwsCrtAsyncHttpClient实例时未关闭实例时可能出现的内存泄漏。

以下示例创建了S3Client并将值配置为AwsCrtAsyncHttpClientconnectionTimeoutmaxConcurrency值。

导入

import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.services.s3.S3AsyncClient; import java.time.Duration;

代码

// Singleton: Use s3AsyncClient for all requests. S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .httpClientBuilder(AwsCrtAsyncHttpClient .builder() .connectionTimeout(Duration.ofSeconds(3)) .maxConcurrency(100)) .build(); // Perform work with the s3AsyncClient. // Requests completed: Close the s3AsyncClient. s3AsyncClient.close();

替代方法:共享实AwsCrtAsyncHttpClient

为了帮助降低应用程序的资源和内存使用率,您可以配置AwsCrtAsyncHttpClient并在多个服务客户端之间共享它。HTTP 连接池将被共享,这会降低资源使用量。

注意

共享AwsCrtAsyncHttpClient实例后,您必须在准备好处置时将其关闭。当服务客户端关闭时,SDK 不会关闭实例。

以下示例使用和值配置AWS基于 CRT 的 HTTP 客户端connectionTimeoutmaxConcurrency例。配置的AwsCrtAsyncHttpClient实例将传递给每个服务客户端的生成器的httpClient方法。当不再需要服务客户端和 HTTP 客户端时,它们将被明确关闭。HTTP 客户端最后关闭。

导入

import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; import software.amazon.awssdk.http.async.SdkAsyncHttpClient; import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; import software.amazon.awssdk.services.s3.S3AsyncClient; import java.time.Duration;

代码

// Create an AwsCrtAsyncHttpClient shared instance. SdkAsyncHttpClient crtAsyncHttpClient = AwsCrtAsyncHttpClient.create(); // Singletons: Use the s3AsyncClient and dynamoDbAsyncClient for all requests. S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .httpClient(crtAsyncHttpClient) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .defaultsMode(DefaultsMode.IN_REGION) .region(Region.US_EAST_1) .build(); DynamoDbAsyncClient dynamoDbAsyncClient = DynamoDbAsyncClient.builder() .httpClient(crtAsyncHttpClient) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .defaultsMode(DefaultsMode.IN_REGION) .region(Region.US_EAST_1) .build(); // Requests completed: Close all service clients. s3AsyncClient.close(); dynamoDbAsyncClient.close() crtAsyncHttpClient.close(); // Explicitly close crtAsyncHttpClient.

将基于 C AWS RT 的 HTTP 客户端设置为默认客户端

对于 AWS SDK for Java 2.x 中的异步操作,可以将程序中的默认异步 HTTP 客户端替换NettyNioAsyncHttpClient为。AwsCrtAsyncHttpClient

通过排除每个服务客户端对的依赖关系,可以在项目的 Maven pom.xml 文件中对此netty-nio-client进行设置。或者,您可以在运行应用程序时或在应用程序代码中使用 Java 系统属性来设置默认 HTTP 客户端。

将 Netty 从项目依赖关系中删除

以下pom.xml示例将基于 Netty 的 HTTP 客户端从类路径中移除,以便改用AWS基于 CRT 的 HTTP 客户端。

<project> <properties> <aws.sdk.version>VERSION</aws.sdk.version> </properties> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>${aws.sdk.version}</version> <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> </dependencies> </project>

访问 Maven 中央存储库以获取最新的版本值。

注意

如果在一个pom.xml文件中声明了多个服务客户端,则所有客户机都需要 exclusions XML 元素。

通过 Java 系统属性进行设置

要使用AWS基于 CRT 的 HTTP 客户端作为应用程序的默认 HTTP,可以将 Java 系统属software.amazon.awssdk.http.async.service.impl性的software.amazon.awssdk.http.crt.AwsCrtSdkHttpService值设置为。

要在应用程序启动期间进行设置,请运行与以下类似的命令。

java app.jar -Dsoftware.amazon.awssdk.http.async.service.impl=\ software.amazon.awssdk.http.crt.AwsCrtSdkHttpService

使用以下代码片段在应用程序代码中设置系统属性。

System.setProperty("software.amazon.awssdk.http.async.service.impl", "software.amazon.awssdk.http.crt.AwsCrtSdkHttpService");
注意

使用系统属性配置AWS基于 CRT 的 HTTP 客户端的使用时,需要在poml.xml文件中添加对aws-crt-client构件的依赖关系。

的高级配置 AwsCrtAsyncHttpClient

您可以使用AWS基于 CRT 的 HTTP 客户端配置各种设置,包括连接运行状况配置和最大空闲时间。您可以查看可用的配置选项AwsCrtAsyncHttpClient

连接运行状况配置

您可以使用 HTTP 客户端生成器上的connectionHealthConfiguration方法为AWS基于 CRT 的 HTTP 客户端配置连接运行状况配置。

以下示例创建了一个使用配置S3AsyncClient了连接运行状况配置的AwsCrtAsyncHttpClient实例和连接的最大空闲时间。

// Singleton: Use the s3AsyncClient for all requests. S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .httpClientBuilder(AwsCrtAsyncHttpClient .builder() .connectionHealthConfiguration(builder -> builder .minimumThroughputInBps(32000L) .minimumThroughputTimeout(Duration.ofSeconds(3))) .connectionMaxIdleTime(Duration.ofSeconds(5))) .build(); // Perform work with s3AsyncClient. // Requests complete: Close the service client. s3AsyncClient.close();

支持 HTTP/2

基于 AWS CRT 的 HTTP 客户端尚不支持 HTTP/2 协议,但计划在将来的版本中发布。

同时,如果您使用需要 HTTP/2 支持的服务客户端,例如KinesisAsyncClientTranscribeStreamingAsyncClient,请考虑改用。NettyNioAsyncHttpClient

代理配置示例

以下代码片段使用了AWS基于 CRT 的 HTTP 客户端的代理配置生成器

SdkAsyncHttpClient crtAsyncHttpClient = AwsCrtAsyncHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .scheme("https") .host("myproxy") .port(1234) .username("username") .password("password") .build()) .build();

代理配置的等效 Java 系统属性显示在以下命令行代码片段中。

$ java -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=1234 -Dhttps.proxyUser=username \ -Dhttps.proxyPassword=password -cp ... App
重要

要使用任何 HTTPS 代理系统属性,必须在代码中将该scheme属性设置为https。如果未在代码中设置架构属性,则方案默认为 HTTP,SDK 仅查找http.*系统属性。