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

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

配置基于 Netty 的 HTTP 客户端

中用于异步操作的默认 HTTP 客户端AWS SDK for Java 2.x是基于 Netty 的。NettyNioAsyncHttpClient基于 Netty 的客户端基于 Netty 项目的异步事件驱动网络框架。

作为替代方案,你可以使用新的AWS基于 CRT 的 HTTP 客户端。本主题向您展示如何配置NettyNioAsyncHttpClient

访问 NettyNioAsyncHttpClient

在大多数情况下,在异步程序中NettyNioAsyncHttpClient无需任何显式配置即可使用。您声明您的异步服务客户端,SDK 将为您配置标准值。NettyNioAsyncHttpClient

如果您想明确配置NettyNioAsyncHttpClient或将其用于多个服务客户端,则需要将其设置为可供配置。

无需配置

当您在 Maven 中声明对服务客户端的依赖关系时,SDK 会为该netty-nio-client构件添加运行时依赖关系。这使得该NettyNioAsyncHttpClient类在运行时可供您的代码使用。如果您没有配置基于 Netty 的 HTTP 客户端,则无需为其指定依赖关系。

在以下 Maven pom.xml 文件的 XML 片段中,使用声明的依赖关系以<artifactId>dynamodb-enhanced</artifactId>传递方式引入了基于 Netty 的 HTTP 客户端。你不需要专门为它声明依赖关系。

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

由于这些依赖关系,您无法进行任何 HTTP 配置更改,因为该NettyNioAsyncHttpClient库仅位于运行时类路径上。

需要配置

要配置NettyNioAsyncHttpClient,你需要在编译时添加对netty-nio-client工件的依赖关系。

请参阅以下 Maven pom.xml 文件示例来配置。NettyNioAsyncHttpClient

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.17.290</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb-enhanced</artifactId> </dependency> <!-- By adding the netty-nio-client dependency, NettyNioAsyncHttpClient will be added to the compile classpath so you can configure it. --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </dependency> </dependencies>

配置NettyNioAsyncHttpClient

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

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

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

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

以下示例创建了一个DynamoDbAsyncClient实例,该实例也使用该DynamoDbEnhancedAsyncClient实例。该DynamoDbAsyncClient实例包含带connectionTimeoutmaxConcurrency值的NettyNioAsyncHttpClient实例。HTTP 实例是使用httpClientBuilder方法创建的DynamoDbAsyncClient.Builder

导入

import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient; import software.amazon.awssdk.enhanced.dynamodb.extensions.AutoGeneratedTimestampRecordExtension; import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; import java.time.Duration;

代码

// DynamoDbAsyncClient is the lower-level client used by the enhanced client. DynamoDbAsyncClient dynamoDbAsyncClient = DynamoDbAsyncClient .builder() .httpClientBuilder(NettyNioAsyncHttpClient.builder() .connectionTimeout(Duration.ofMillis(5_000)) .maxConcurrency(100) .tlsNegotiationTimeout(Duration.ofMillis(3_500))) .defaultsMode(DefaultsMode.IN_REGION) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build(); // Singleton: Use dynamoDbAsyncClient and enhancedClient for all requests. DynamoDbEnhancedAsyncClient enhancedClient = DynamoDbEnhancedAsyncClient .builder() .dynamoDbClient(dynamoDbAsyncClient) .extensions(AutoGeneratedTimestampRecordExtension.create()) .build(); // Perform work with the dynamoDbAsyncClient and enhancedClient. // Requests completed: Close dynamoDbAsyncClient. dynamoDbAsyncClient.close();

替代方法:共享实NettyNioAsyncHttpClient

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

注意

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

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

导入

import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.s3.S3Client;

代码

// Create a NettyNioAsyncHttpClient shared instance. SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.create(); // Singletons: Use the s3AsyncClient, dbAsyncClient, and enhancedAsyncClient for all requests. S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .httpClient(nettyHttpClient) .build(); DynamoDbAsyncClient dbAsyncClient = DynamoDbAsyncClient.builder() .httpClient(nettyHttpClient) .defaultsMode(DefaultsMode.IN_REGION) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build(); DynamoDbEnhancedAsyncClient enhancedAsyncClient = DynamoDbEnhancedAsyncClient.builder() .dynamoDbClient(dbAsyncClient) .extensions(AutoGeneratedTimestampRecordExtension.create()) .build(); // Perform work with s3AsyncClient, dbAsyncClient, and enhancedAsyncClient. // Requests completed: Close all service clients. s3AsyncClient.close(); dbAsyncClient.close() nettyHttpClient.close(); // Explicitly close nettyHttpClient.

代理配置示例

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

SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.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.*系统属性。