

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

# 为 AWS SDK for Java 2.x 外部配置服务客户端
<a name="configuring-service-clients-ext"></a>

许多配置设置可以通过代码以外的方式来处理。当您通过外部方式处理配置时，配置可以在同一个 Java 进程中应用于所有应用程序。大多数配置设置既可以设置为环境变量、JVM 系统属性，也可以设置为单独的共享 AWS `config`文件。共享 `config` 文件可以维护多组独立的设置（称为配置文件），以便为不同的环境或测试提供不同的配置。

大多数环境变量和共享`config`文件设置都是标准化的，并且是跨 AWS SDKs 工具共享的，以支持不同编程语言和应用程序之间的一致功能。在大多数情况下，适用于 Java 的 SDK 可以使用的 JVM 系统属性与环境变量一一对应。

请参阅*[AWS SDKs 和工具参考指南](https://docs.aws.amazon.com/sdkref/latest/guide/overview.html)*，了解如何通过这些方法配置应用程序，以及有关每个 cross-sdk 设置的详细信息。要查看 SDK 可以从环境变量、JVM 系统属性或配置文件中解析的所有[设置，请参阅AWS SDKs 和工具参考](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html)*指南中的设置参考*。

## 用于客户端配置的配置提供程序链
<a name="configuration-provider-chain"></a>

SDK 会检查几个位置（或来源）以查找配置值。

1. 在代码中或服务客户端本身设置的任何显式设置均优先于其他任何设置。

1. JVM 系统属性
   + 有关设置 JVM 系统属性的详细信息，请参阅《工具参考指南》*AWS SDKs 和《工具参考*指南》中的 “[如何设置 JVM 系统属性](https://docs.aws.amazon.com/sdkref/latest/guide/jvm-system-properties.html#jvm-sys-props-set)”。

1. 环境变量
   + 有关设置环境变量的详细信息，请参阅《工具参考指南》*AWS SDKs 和《工具参考指南》*中的[环境变量](https://docs.aws.amazon.com/sdkref/latest/guide/environment-variables.html)。
   + 请注意，您可以在不同作用域层级为 shell 配置环境变量：系统级、用户级，以及特定终端会话级。

1. 共享 `config` 文件和 `credentials` 文件
   + 有关设置这些文件的详细信息，请参阅《工具参考指南》[`config`和《*工具参考指南》中的 “共享AWS SDKs 和`credentials`*文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)”。

1. 最后使用 SDK 源代码本身提供的任何默认值。
   + 某些属性（例如“Region”）没有默认值。您必须在代码、环境设置或共享 `config` 文件中明确指定这些属性。如果 SDK 无法解析所需的配置，API 请求在运行时会失败。

除了这个通用配置链之外，适用于 Java 的 SDK 2.x 还使用专门的提供程序链，包括[凭证提供程序链](credentials-chain.md)和 [AWS 区域 提供程序链](region-selection.md#default-region-provider-chain)。这些专门的链会添加其他提供程序，这些提供程序会考虑 SDK 的运行环境。例如，在容器或 EC2 实例中。

## 创建使用外部设置配置的服务客户端
<a name="create-client-ext-conf"></a>

您需要在应用程序中创建一个服务客户端才能与 AWS 服务通信。服务客户是您与之建立联系的重要 AWS 服务纽带，可以处理所有复杂的沟通细节，因此您不必担心。它们会自动处理安全性、错误处理和重试等重要任务，让您可以专注于构建应用程序，而不是处理复杂的技术问题。

### 使用 `create()` 方法
<a name="create-client-ext-builder"></a>

如果您需要的所有配置设置都来自外部来源，则可以使用简单方法创建服务客户端：

```
S3Client s3Client = S3Client.create();
```

前面的代码段创建了一个 `S3Client` 实例。在创建过程中，SDK 会按照配置提供程序链依次查找所需的设置。SDK 找到某个设置值后，便会立即采用，即使链中的后续位置还存在该配置，也会忽略后续配置。

例如，假设用户 AWS 区域 通过设置系统属性`-Daws.region=us-west-2`来设置的 JVM 设置。如果还设置了 `AWS_REGION` 环境变量，则其值将被忽略。

创建过程中还将使用默认区域提供程序链和默认凭证提供程序链。在链的某个地方，SDK 必须解析要使用的 AWS 区域 ，并找到使其能够为签名请求检索凭证的设置。如果要找到这些值的 SDKs 文件，则客户端创建失败。

尽管您可以使用这个空的生成器模式来创建客户端，但当您想[在代码中添加配置](configuring-service-clients-code.md#conf-service-client-code-basic)时，通常会使用这种模式。

## 适用于 Java 的 SDK 2.x 环境变量和 JVM 系统属性
<a name="java-ext-config"></a>

除了大多数人支持的[跨软件开发工具包设置](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html#settingsPages)外 AWS SDKs，适用于 Java 的 SDK 2.x 还提供了以下设置。

**注意**  
这些环境变量和 JVM 系统属性主要用于高级使用案例、测试或特定部署场景。在大多数应用程序代码中，最好使用 SDK 的客户端生成器提供的编程配置选项，以便获得更好的类型安全性和 IDE 支持。

### 容器凭证提供程序环境变量
<a name="java-cred-profvider-envars"></a>

除了参考指南中记录的标准容器凭证环境变量外，SDK 还支持：

`AWS_CONTAINER_SERVICE_ENDPOINT` – 使用容器凭证提供程序时，此环境变量指定容器元数据服务的端点。

Java 系统属性：`aws.containerServiceEndpoint`

默认值：`http://169.254.170.2`

### HTTP 客户端实现环境变量
<a name="java-http-cli-impl-envars"></a>

`SYNC_HTTP_SERVICE_IMPL` – 明确标识 SDK 将使用的默认[同步 HTTP 实现](http-configuration.md#http-config-sync)。当类路径上有多个实现，这种做法非常有用；因为实现发现需要对类路径进行扫描，这也是一种性能优化手段。

Java 系统属性：`software.amazon.awssdk.http.service.impl`

`ASYNC_HTTP_SERVICE_IMPL` – 明确标识 SDK 将使用的默认[异步 HTTP 实现](http-configuration.md#http-config-async)。当类路径上有多个实现，这种做法非常有用；因为实现发现需要对类路径进行扫描，这也是一种性能优化手段。

Java 系统属性：`software.amazon.awssdk.http.async.service.impl`