

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

# 覆盖服务客户端配置
<a name="override-client-config"></a>

[创建服务客户端](creating-clients.md)后，服务客户端将对所有操作使用固定配置。但是，有时您可能需要覆盖一个或多个特定操作的配置。

每个服务客户端都有一个`withConfig`扩展，因此您可以修改现有配置的副本。该`withConfig`扩展程序返回一个配置经过修改的新服务客户端。原始客户机独立存在，并使用其原始配置。

以下示例显示如何创建调用两个操作的`S3Client`实例。

```
val s3 = S3Client.fromEnvironment {
    logMode = LogMode.LogRequest
    region = "us-west-2"
    // ...other configuration settings...
}

s3.listBuckets { ... }
s3.listObjectsV2 { ... }
```

以下代码段显示了如何覆盖单个`listObjectV2`操作的配置。

```
s3.withConfig {
    region = "eu-central-1"
}.use { overriddenS3 ->
    overriddenS3.listObjectsV2 { ... }
}
```

`s3`客户端上的操作调用使用创建客户端时指定的原始配置。其配置包括[请求日志](logging.md#sdk-log-mode)`us-west-2 region`和区域配置。

`overriddenS3`客户端上的`listObjectsV2`调用使用与原始`s3`客户端相同的设置，但区域除外，现在`eu-central-1`是。

## 被覆盖的客户端的生命周期
<a name="override-client-lifecycle"></a>

在前面的示例中，`s3`客户端和`overriddenS3`客户端彼此独立。只要操作保持打开状态，就可以在任一客户端上调用。每个都使用单独的配置，但它们可以共享底层资源（例如 HTTP 引擎），除非这些资源也被覆盖。

您可以分别关闭配置被覆盖的客户端和原始客户端。在关闭原始客户端之前或之后，您可以关闭配置被覆盖的客户端。除非您需要长时间使用配置被覆盖的客户端，否则我们建议您使用该方法来封装其生命周期。`use`该`use`方法可确保在发生异常时关闭客户端。

## 客户之间共享的资源
<a name="override-client-shared-res"></a>

使用创建服务客户端时`withConfig`，它可能会与原始客户机共享资源。相比之下，当您使用 [FromEnvironMen](creating-clients.md#loading-from-the-environment) t 创建客户机或[对其进行明确配置](creating-clients.md#programmatic-config)时，该客户端将使用独立的资源。诸如 HTTP 引擎和凭证提供程序之类的资源是共享的，除非它们在区块中被覆盖。`withConfig`

由于每个客户机的生命周期是独立的，因此共享资源将保持开放和可用状态，直到最后一个客户机关闭。因此，当您不再需要被覆盖的服务客户端时，务必将其关闭。这样可以防止共享资源保持打开状态并消耗系统资源，例如内存、连接和 CPU 周期。

以下示例显示了共享资源和独立资源。

`s3`和`overriddenS3`客户端共享相同的凭证提供程序实例，包括其缓存配置。如果`s3`客户端调用的缓存值仍然是最新的，则通过`overriddenS3`重用凭证发出的调用。

 两个客户端之间不共享 HTTP 引擎。每个客户端都有一个独立的 HTTP 引擎，因为它在调用中被覆盖。`withConfig`

```
val s3 = S3Client.fromEnvironment {
    region = "us-west-2"
    credentialsProvider = CachedCredentialsProvider(CredentialsProviderChain(...))
    httpClientEngine = OkHttpEngine { ... }
}

s3.listBuckets { ... }

s3.withConfig {
    httpClientEngine = CrtHttpEngine { ... }
}.use { overriddenS3 ->
    overriddenS3.listObjectsV2 { ... }
}
```