

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Ganti konfigurasi klien layanan
<a name="override-client-config"></a>

Setelah [klien layanan dibuat](creating-clients.md), klien layanan menggunakan konfigurasi tetap untuk semua operasi. Namun, terkadang Anda mungkin perlu mengganti konfigurasi untuk satu atau lebih operasi spesifik.

Setiap klien layanan memiliki `withConfig` ekstensi sehingga Anda dapat memodifikasi salinan konfigurasi yang ada. `withConfig`Ekstensi mengembalikan klien layanan baru dengan konfigurasi yang dimodifikasi. Klien asli ada secara independen dan menggunakan konfigurasi aslinya.

Contoh berikut menunjukkan pembuatan `S3Client` instance yang memanggil dua operasi.

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

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

Cuplikan berikut menunjukkan cara mengganti konfigurasi untuk satu operasi. `listObjectV2`

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

Panggilan operasi pada `s3` klien menggunakan konfigurasi asli yang ditentukan saat klien dibuat. Konfigurasinya mencakup [pencatatan permintaan](logging.md#sdk-log-mode) dan `us-west-2 region` untuk Wilayah. 

`listObjectsV2`Pemanggilan pada `overriddenS3` klien menggunakan pengaturan yang sama dengan `s3` klien asli kecuali untuk Wilayah, yang sekarang. `eu-central-1`

## Siklus hidup klien yang diganti
<a name="override-client-lifecycle"></a>

Dalam contoh sebelumnya, `s3` klien dan `overriddenS3` klien independen satu sama lain. Operasi dapat dipanggil pada salah satu klien selama mereka tetap terbuka. Masing-masing menggunakan konfigurasi terpisah, tetapi mereka dapat berbagi sumber daya yang mendasarinya (seperti mesin HTTP) kecuali jika itu juga diganti. 

Anda menutup klien dengan konfigurasi yang diganti dan klien asli secara terpisah. Anda dapat menutup klien dengan konfigurasi yang diganti sebelum atau setelah Anda menutup klien aslinya. Kecuali Anda perlu menggunakan klien dengan konfigurasi yang diganti untuk waktu yang lama, kami sarankan Anda membungkus siklus hidupnya dengan metode ini. `use` `use`Metode ini memastikan bahwa klien ditutup jika pengecualian terjadi. 

## Sumber daya yang dibagikan antar klien
<a name="override-client-shared-res"></a>

Ketika Anda membuat klien layanan dengan menggunakan`withConfig`, itu mungkin berbagi sumber daya dengan klien asli. Sebaliknya, ketika Anda membuat klien dengan menggunakan [FromEnvironment](creating-clients.md#loading-from-the-environment) atau Anda [secara eksplisit mengonfigurasinya](creating-clients.md#programmatic-config), klien menggunakan sumber daya independen. Sumber daya seperti mesin HTTP dan penyedia kredensyal dibagikan kecuali jika diganti di blok. `withConfig` 

Karena siklus hidup setiap klien independen, sumber daya bersama tetap terbuka dan dapat digunakan sampai klien terakhir ditutup. Oleh karena itu, penting bagi Anda untuk menutup klien layanan yang diganti ketika Anda tidak lagi membutuhkannya. Ini mencegah sumber daya bersama tetap terbuka dan mengkonsumsi sumber daya sistem seperti memori, koneksi, dan siklus CPU.

Contoh berikut menunjukkan sumber daya bersama dan independen.

`overriddenS3`Klien `s3` dan berbagi instance penyedia kredensyal yang sama, termasuk konfigurasi caching. Panggilan yang dilakukan dengan `overriddenS3` menggunakan kembali kredensyal jika nilai cache masih terkini dari panggilan yang dilakukan oleh klien. `s3`

 Mesin HTTP tidak dibagi antara dua klien. Setiap klien memiliki mesin HTTP independen karena diganti dalam panggilan. `withConfig`

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

s3.listBuckets { ... }

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