

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

# 在中配置 HTTP 客户端 AWS SDK for Java 2.x
<a name="http-configuration"></a>

您可以使用 AWS SDK for Java 2.x更改用于服务客户端的 HTTP 客户端，也可以更改 HTTP 客户端的默认配置。本部分讨论 SDK 的 HTTP 客户端和设置。

## SDK for Java 中可用的 HTTP 客户端
<a name="http-clients-available"></a>

### 同步客户端
<a name="http-config-sync"></a>

适用于 Java 的 SDK 中的同步 HTTP 客户端实现了该[SdkHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/SdkHttpClient.html)接口。同步服务客户端（例如 `S3Client` 或 `DynamoDbClient`）需要使用同步 HTTP 客户端。 适用于 Java 的 AWS SDK 提供了三个同步 HTTP 客户端。

**ApacheHttpClient （默认）**  
[ApacheHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html)是同步服务客户端的默认 HTTP 客户端。有关配置 `ApacheHttpClient` 的信息，请参阅[配置基于 Apache 的 HTTP 客户端](http-configuration-apache.md)。

**AwsCrtHttpClient**  
[AwsCrtHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtHttpClient.html)提供高吞吐量和无阻塞 IO。它建立在 AWS 通用运行时 (CRT) Http 客户端之上。有关配置 `AwsCrtHttpClient` 并将其用于服务客户端的信息，请参阅[配置 AWS 基于 CRT 的 HTTP 客户](http-configuration-crt.md)。

**UrlConnectionHttpClient**  
要最大限度地减少应用程序使用的 jar 和第三方库的数量，可以使用。[UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html)有关配置 `UrlConnectionHttpClient` 的信息，请参阅[配置 URLConnection基于的 HTTP 客户端](http-configuration-url.md)。

**Apache5 HttpClient**  
[Apache5 HttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache5/Apache5HttpClient.html) *是在 Apache 5.x 上构建`ApacheHttpClient`的更新版本。 HttpClient版本 5.x* 是 Apache 积极维护的版本，`ApacheHttpClient`通过引入现代 Java 生态系统兼容性（包括对 Java 21 的虚拟线程支持）以及通过 SLF4 J 增强的日志灵活性，对之前的版本进行了改进，`Apache5HttpClient`将在未来版本的 Java AWS SDK 2.x 中取代`ApacheHttpClient`默认同步客户端。它具有相同的 API 和功能，非常适合作为即用型替代品。有关配置 `Apache5HttpClient` 的信息，请参阅[配置基于 Apache 5.x 的 HTTP 客户端](http-configuration-apache5.md)。

### 异步客户端
<a name="http-config-async"></a>

适用于 Java 的 SDK 中的异步 HTTP 客户端实现了该[SdkAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/async/SdkAsyncHttpClient.html)接口。异步服务客户端（例如 `S3AsyncClient` 或 `DynamoDbAsyncClient`）需要使用异步 HTTP 客户端。 适用于 Java 的 AWS SDK 提供了两个异步 HTTP 客户端。

**NettyNioAsyncHttpClient （默认）**  
[NettyNioAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html)是异步客户端使用的默认 HTTP 客户端。有关配置 `NettyNioAsyncHttpClient` 的信息，请参阅[配置基于 Netty 的 HTTP 客户端](http-configuration-netty.md)。

**AwsCrtAsyncHttpClient**  
基于 AWS 通用运行时 (CRT) HTTP 客户端。[AwsCrtAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.html)有关配置 `AwsCrtAsyncHttpClient` 的信息，请参阅[配置 AWS 基于 CRT 的 HTTP 客户](http-configuration-crt.md)。

## HTTP 客户端建议
<a name="http-clients-recommend"></a>

选择 HTTP 客户端实现时，应考虑几个因素。以下信息可帮助您做出决定。

### HTTP 客户端比较
<a name="http-clients-recommend-compare"></a>

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


| HTTP 客户端 | 同步还是异步 | 何时使用 | 限制/缺点 | 
| --- | --- | --- | --- | 
|  基于 Apache 的 HTTP 客户端 *（默认同步 HTTP 客户端）* | 同步 | 如果您更需要低延迟而不是高吞吐量，请使用它  | 与其他 HTTP 客户端相比，启动较慢 | 
| 基于 URLConnection 的 HTTP 客户端 | 同步 | 如果您对限制第三方依赖项有硬性要求，请使用它 | • 不支持 HTTP PATCH 方法，这是亚马逊 APIGateway 更新 APIs等操作所必需的<br />• 不支持可配置的空闲连接超时。有关详细信息[，请参阅配置 URLConnection基于的 HTTP 客户端](http-configuration-url.md)。 | 
| AWS 基于 CRT 同步的 HTTP 客户端 1  | 同步 | • 如果您的应用程序正在中运行，请使用它 AWS Lambda<br />• 如果您更需要高吞吐量而不是低延迟，请使用它<br />• 如果您更喜欢同步 SDK 客户端，请使用它 | 不支持以下 Java 系统属性：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/sdk-for-java/latest/developer-guide/http-configuration.html) | 
|  基于 Netty 的 HTTP 客户端 *（默认异步 HTTP 客户端）* | 异步 | • 如果您的应用程序依赖于 Java 系统属性进行 TLS 配置（例如`javax.net.ssl.keyStore`），请使用它 | 与其他 HTTP 客户端相比，启动较慢 | 
|  AWS 基于 CRT 的异步 HTTP 客户端 1  | 异步 | • 如果您的应用程序在 AWS Lambda中运行，请使用它<br />• 如果您更需要高吞吐量而不是低延迟，请使用它• 如果您更喜欢异步 SDK 客户端，请使用它 | 不支持以下 Java 系统属性：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/sdk-for-java/latest/developer-guide/http-configuration.html) | 

1 由于基于 CRT 的 HTTP 客户端，我们建议您尽可能使用 AWS 基于 CRT 的 HTTP 客户端。

## 智能配置默认值
<a name="http-config-smart-defaults"></a>

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

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

有关智能配置默认值以及如何选择最适合您的应用程序的默认模式值的更多信息，请参阅[AWS SDKs 和工具参考指南](https://docs.aws.amazon.com/sdkref/latest/guide/feature-smart-config-defaults.html)。

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

------
#### [ Service client ]

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

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

------
#### [ System property ]

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

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

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

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

```
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 ]

您可以向共享 AWS `config`文件添加`defaults_mode`配置属性，如下例所示。

```
[default]
defaults_mode = auto
```

------

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

使用 `httpClientBuilder()` 方法生成 HTTP 客户端时，设置仅适用于您正在生成的实例。[此处](http-configuration-netty.md#http-config-netty-one-client)显示了此方法一个示例。本示例中基于 Netty 的 HTTP 客户端会覆盖在全局范围内为 `connectTimeoutInMillis` 和 `tlsNegotiationTimeoutInMillis` 设置的任何默认模式值。