HTTP 客户端 - AWS SDK for Java 2.x

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

HTTP 客户端

在使用构建的应用程序中,您可以更改 HTTP 客户端的默认配置AWS SDK for Java 2.x。本节讨论 SDK 的 HTTP 客户端和设置。

适用于 Java 的 SDK 中的可用客户端

同步客户端

同步服务客户端,例如 S3ClientDynamoDbClient,需要使用同步 HTTP 客户端。AWS SDK for Java提供了两个同步 HTTP 客户端。

ApacheHttpClient(默认)

ApacheHttpClient是同步服务客户端的默认 HTTP 客户端。有关配置的信息ApacheHttpClient,请参见配置基于 Apache 的 HTTP 客户端

UrlConnectionHttpClient

作为重量较轻的选项ApacheHttpClient,您可以使用UrlConnectionHttpClient。有关配置的信息UrlConnectionHttpClient,请参见配置基于 URL 连接的 HTTP 客户端

异步客户端

异步服务客户端(例如 S 3 AsyncClient 或)需要使用异步 HTTP 客户端。DynamoDbAsyncClientAWS SDK for Java提供了两个异步 HTTP 客户端。

NettyNioAsyncHttpClient(默认)

NettyNioAsyncHttpClient是异步客户端使用的默认 HTTP 客户端。有关配置的信息NettyNioAsyncHttpClient,请参见配置基于 Netty 的 HTTP 客户端

AwsCrtAsyncHttpClient

与之相比 AwsCrtAsyncHttpClient,新版本的加载时间也更短NettyNioAsyncHttpClient,也已上市。有关配置的信息AwsCrtAsyncHttpClient,请参见配置AWS基于 CRT 的 HTTP 客户端

HTTP 客户端建议

选择 HTTP 客户端实现时,有几个因素会起作用。使用以下信息来帮助您做出决定。

推荐流程图

以下流程图提供了一般指导,可帮助您确定要使用哪个 HTTP 客户端。


               HTTP 客户端推荐流程图。

HTTP 客户端比较

下表提供了每个 HTTP 客户端的详细信息。

HTTP 客户端 同步或异步 何时使用 局限性/缺点
基于阿帕奇的 HTTP 客户端

(默认同步 HTTP 客户端)

Sync(同步) 如果您更喜欢低延迟而不是高吞吐量,请使用它 与其他 HTTP 客户端相比,启动时间更慢
基于 URL 连接的 HTTP 客户端 Sync(同步) 如果您对限制第三方依赖有硬性要求,请使用它 不支持 HTTP 补丁方法,这是亚马逊 APIGateWay 更新操作等某些 API 所必需的
基于网络的 HTTP 客户端

(默认异步 HTTP 客户端)

异步

• 如果您的应用程序调用需要 HTTP/2 支持的 API,例如 Kinesis API,请使用它 SubscribeToShard

• 如果你更喜欢高吞吐量而不是低延迟,并且你的操作系统使用 Alpine Linux 等 m usl,请使用它

与其他 HTTP 客户端相比,启动时间更慢
AWS基于CRT的HTTP客户端 1 异步

• 如果您的应用程序正在运行,请使用它 AWS Lambda

• 如果您更喜欢高吞吐量而不是低延迟,请使用它

• 不支持需要 HTTP/2 支持的服务客户端,例如和 KinesisAsynClient TranscribeStreamingAsyncClient

•不支持基于 musl 的操作系统,例如 Alpine Linux

1 我们建议您尽可能使用AWS基于 CRT 的 HTTP 客户端,因为它还有其他好处。

智能配置默认值

AWS SDK for Java 2.x(版本 2.17.102 或更高版本)提供智能配置默认功能。此功能优化了两个 HTTP 客户端属性以及其他不影响 HTTP 客户端的属性。

智能配置默认值会根据您提供的默认模式值为connectTimeoutInMillistlsNegotiationTimeoutInMillis属性设置合理的值。您可以根据应用程序的特性选择默认模式值。

有关智能配置默认值以及如何选择最适合您的应用程序的默认模式值的更多信息,请参阅 AWSSDK 和工具参考指南

以下是为应用程序设置默认模式的四种方法。

Service client

使用服务客户端生成器直接在服务客户端上配置默认模式。以下示例将的默认模式设置autoDynamoDbClient

DynamoDbClient ddbClient = DynamoDbClient.builder() .defaultsMode(DefaultsMode.AUTO) .build();
System property

您可以使用aws.defaultsMode系统属性来指定默认模式。如果您在 Java 中设置系统属性,则需要在初始化任何服务客户端之前设置该属性。

以下示例说明如何将默认模式设置为auto使用在 Java 中设置的系统属性。

System.setProperty("aws.defaultsMode", "auto");

以下示例演示了如何将默认模式设置为auto使用java命令的-D选项。

java -Daws.defaultsMode=auto
Environment variable

为环境变量设置一个值AWS_DEFAULTS_MODE以选择应用程序的默认模式。

以下信息显示了为将默认模式的值设置为auto使用环境变量而要运行的命令。

操作系统 设置环境变量的命令

Linux、macOS 或 Unix

export AWS_DEFAULTS_MODE=auto

Windows

set AWS_DEFAULTS_MODE=auto
AWS config file

您可以向共享AWSconfig文件添加defaults_mode配置属性,如以下示例所示。

[default] defaults_mode = auto

如果您使用系统属性、环境变量或AWS配置文件全局设置默认模式,则可以在构建 HTTP 客户端时覆盖这些设置。

当您使用该httpClientBuilder()方法构建 HTTP 客户端时,设置仅适用于您正在构建的实例。此显示了一个示例。本示例中基于 Netty 的 HTTP 客户端会覆盖全局为和设置的任何默认模式值。connectTimeoutInMillis tlsNegotiationTimeoutInMillis

代理支持

您可以使用代码、设置 Java 系统属性或结合这两种方法来配置 HTTP 代理。SDK 目前不支持用于配置代理的环境变量。

构建服务客户端时,您可以使用特定于客户端的ProxyConfiguration生成器在代码中配置代理。本主题中每个 HTTP 客户端的部分显示了代理配置示例。此示例适用于 Apache HTTP 客户端

HTTP 客户端对 HTTP 代理的 Java 系统属性的支持
系统属性 描述 HTTP 客户端支持

HTTP.proxyHost

HTTP 代理服务器的主机名

全部

HTTP.proxyPort

HTTP 代理服务器的端口号

全部

http.proxUser

HTTP 代理服务器身份验证的用户名

全部

http.proxyPro

HTTP 代理服务器身份验证的密码

全部

http。 nonProxyHosts

应绕过代理直接访问的主机列表。在@@ 使用 HTTPS 时也有效

全部

https.proxyH

HTTPS 代理服务器的主机名

Netty,CRT

https.proxyP

HTTPS 代理服务器的端口号

Netty,CRT

https.proxUser

HTTPS 代理身份验证的用户名

Netty,CRT
https:/proxy HTTPS 代理服务器身份验证的密码 Netty,CRT

表中使用的术语意味着:

  • 全部:SDK 提供的所有 HTTP 客户端— UrlConnectionHttpClientApacheHttpClientNettyNioAsyncHttpClientAwsCrtAsyncHttpClient

  • Netty:基于 Netty 的 HTTP 客户端 () NettyNioAsyncHttpClient

  • CRT:AWS基于 CRT 的 HTTP 客户端,() AwsCrtAsyncHttpClient

您可以混合使用 HTTP 客户端配置和系统属性。每个 HTTP 客户端的ProxyConfiguration生成器都提供一个useSystemPropertyValues设置。默认情况下,该设置为true。当设置为时true,SDK 会自动使用ProxyConfiguration构建器未提供的选项的系统属性值。

以下示例显示了由系统属性和代码提供的配置。

// Command line with the proxy password set as a system property. $ java -Dhttp.proxyPassword=password -cp ... App // Since the 'useSystemPropertyValues' setting is 'true' (the default), the SDK will supplement // the proxy configuration in code with the 'http.proxyPassword' value from the system property. SdkHttpClient apacheHttpClient = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .endpoint(URI.create("http://localhost:1234")) .username("username") .build()) .build(); // Use the apache HTTP client with proxy configuration. DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(apacheHttpClient) .build();
注意

您可以使用以下系统endpoint属性,而不必像前面的代码片段所示那样在代码中设置属性。

-Dhttp.proxyHost=localhost -Dhttp.proxyPort=1234