本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置基于 Apache 的 HTTP 客户端
默认情况下,中的同步服务客户端AWS SDK for Java 2.x使用基于 Apache 的 HTTP 客户端ApacheHttpClientApacheHttpClient
是基于 Apache HttpClient
SDK 还提供 UrlConnectionHttpClientUrlConnectionHttpClient
,请参见配置基于 URL 连接的 HTTP 客户端。
要查看可供您使用的全部配置选项集,请参阅 ApacheHttpClient.Builder 和 ProxyConfiguration.ApacheHttpClient
访问 ApacheHttpClient
在大多数情况下,您ApacheHttpClient
无需任何明确配置即可使用。您声明服务客户端,SDK 将为您配置标准值。ApacheHttpClient
如果您想明确配置ApacheHttpClient
或将其用于多个服务客户端,则需要将其设置为可供配置。
无需配置
当您在 Maven 中声明对服务客户端的依赖关系时,SDK 会为该apache-client
构件添加运行时依赖关系。这使得该ApacheHttpClient
类在运行时可供您的代码使用。如果您没有配置基于 Apache 的 HTTP 客户端,则无需为其指定依赖关系。
在以下 Maven pom.xml
文件的 XML 片段中,声明的依赖关系<artifactId>s3</artifactId>
会自动引入基于 Apache 的 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> <!-- The s3 dependency automatically adds a runtime dependency on the ApacheHttpClient--> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> </dependencies>
由于这些依赖关系,您无法进行任何显式的 HTTP 配置更改,因为该ApacheHttpClient
库仅位于运行时类路径上。
需要配置
要配置ApacheHttpClient
,你需要在编译时添加对apache-client
库的依赖关系。
请参阅以下 Maven pom.xml
文件示例来配置。ApacheHttpClient
<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>s3</artifactId> </dependency> <!-- By adding the apache-client dependency, ApacheHttpClient will be added to the compile classpath so you can configure it. --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </dependency> </dependencies>
配置ApacheHttpClient
您可以在构建服务客户端的ApacheHttpClient
同时配置实例,也可以将单个实例配置为在多个服务客户端之间共享。
无论使用哪种方法,您都可以使用ApacheHttpClient.Builder
来配置基于 Apache 的 HTTP 客户端的属性。
最佳实践:将ApacheHttpClient
实例专用于服务客户端
如果您需要配置的实例ApacheHttpClient
,我们建议您构建专用实ApacheHttpClient
例。你可以使用服务客户端的生成器的httpClientBuilder
方法来做到这一点。这样,HTTP 客户端的生命周期由 SDK 管理,这有助于避免在不再需要ApacheHttpClient
实例时未关闭实例时可能出现的内存泄漏。
以下示例创建了一个S3Client
并将的嵌入式实例配置ApacheHttpClient
为maxConnections
和connectionTimeout
值。HTTP 实例是使用httpClientBuilder
方法创建的S3Client.Builder
。
导入
import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.s3.S3Client; import java.time.Duration;
代码
S3Client s3Client = S3Client // Singleton: Use the s3Client for all requests. .builder() .httpClientBuilder(ApacheHttpClient.builder() .maxConnections(100) .connectionTimeout(Duration.ofSeconds(5)) ).build(); // Perform work with the s3Client. s3Client.close(); // Requests completed: Close all service clients.
替代方法:共享实ApacheHttpClient
例
为了帮助降低应用程序的资源和内存使用率,您可以配置ApacheHttpClient
并在多个服务客户端之间共享。HTTP 连接池将被共享,这会降低资源使用量。
注意
共享ApacheHttpClient
实例后,您必须在准备好处置时将其关闭。当服务客户端关闭时,SDK 不会关闭实例。
以下示例配置了一个基于 Apache 的 HTTP 客户端,该客户端由两个服务客户端使用。配置的ApacheHttpClient
实例将传递给服务客户端生成器的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;
代码
SdkHttpClient apacheHttpClient = ApacheHttpClient.create(); // Singletons: Use the s3Client and dynamoDbClient for all requests. S3Client s3Client = S3Client.builder() .httpClient(apacheHttpClient).build(); DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(apacheHttpClient).build(); // Perform work with the s3Client and dynamoDbClient. // Requests completed: Close all service clients. s3Client.close(); dynamoDbClient.close(); apacheHttpClient.close(); // Explicitly close apacheHttpClient.
代理配置示例
以下代码片段使用了 Apache HTTP 客户端的代理配置生成器
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .endpoint(URI.create("http://example.com:1234")) .username("username") .password("password") .addNonProxyHost("localhost") .addNonProxyHost("host.example.com") .build()) .build();
代理配置的等效 Java 系统属性显示在以下命令行代码段中。
$ java -Dhttp.proxyHost=example.com -Dhttp.proxyPort=1234 -Dhttp.proxyUser=username \ -Dhttp.proxyPassword=password -Dhttp.nonProxyHosts=locahost|host.example.com -cp ... App
注意
Apache HTTP 客户端目前不支持 HTTPS 代理系统属性。