Configuration de clients AWS HTTP basés sur CRT - AWS SDK for Java 2.x

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Configuration de clients AWS HTTP basés sur CRT

Les clients HTTP AWS basés sur le CRT incluent les clients synchrones et asynchrones. AwsCrtHttpClientAwsCrtAsyncHttpClient Les clients HTTP AWS basés sur CRT offrent les avantages suivants :

  • Temps de démarrage du SDK plus rapide

  • Empreinte mémoire réduite

  • Temps de latence réduit

  • Gestion de l'état de la connexion

  • Équilibrage de charge DNS

AWS Composants du SDK basés sur le CRT

Les clients HTTP AWS CRT, décrits dans cette rubrique, et le client S3 AWS basé sur CRT sont des composants différents du SDK.

Les clients HTTP synchrones et asynchrones AWS basés sur le CRT sont des interfaces client HTTP du SDK d'implémentation et sont utilisés pour les communications HTTP générales. Ils constituent des alternatives aux autres clients HTTP synchrones ou asynchrones du SDK avec des avantages supplémentaires.

Le client S3 AWS basé sur CRT est une implémentation de l'AsyncClientinterface S3 et est utilisé pour travailler avec le service Amazon S3. Il s'agit d'une alternative à l'implémentation Java de l'S3AsyncClientinterface et offre plusieurs avantages.

Bien que les deux composants utilisent des bibliothèques issues du AWS Common Runtime, les clients HTTP AWS basés sur CRT n'utilisent pas la bibliothèque aws-c-s 3 et ne prennent pas en charge les fonctionnalités de l'API de téléchargement partitionné S3. Le client S3 AWS basé sur CRT, en revanche, a été spécialement conçu pour prendre en charge les fonctionnalités de l'API de téléchargement partitionné S3.

Accédez aux clients HTTP AWS basés sur CRT

Avant de pouvoir utiliser les clients HTTP AWS CRT, ajoutez l'aws-crt-clientartefact avec une version minimale de 2.22.0 aux dépendances de votre projet.

Le Maven suivant pom.xml montre les clients HTTP AWS basés sur le CRT déclarés à l'aide du mécanisme de nomenclature (BOM).

<project> <properties> <aws.sdk.version>2.22.0</aws.sdk.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> </dependencies> </project>

Visitez le dépôt central de Maven pour obtenir la dernière version.

Utiliser et configurer un client AWS HTTP CRT

Vous pouvez configurer un client HTTP AWS CRT tout en créant un client de service, ou vous pouvez configurer une instance unique à partager entre plusieurs clients de service.

Quelle que soit l'approche, vous utilisez un générateur pour configurer les propriétés de l'instance client HTTP AWS basée sur CRT.

Meilleure pratique : dédier une instance à un client de service

Si vous devez configurer une instance d'un client HTTP AWS CRT, nous vous recommandons de la dédier en la créant avec le client de service. Vous pouvez le faire en utilisant la httpClientBuilder méthode du générateur du client de service. Ainsi, le cycle de vie du client HTTP est géré par le SDK, ce qui permet d'éviter d'éventuelles fuites de mémoire si l'instance du client HTTP AWS basée sur CRT n'est pas fermée alors qu'elle n'est plus nécessaire.

L'exemple suivant crée un client de service S3 et configure un client HTTP AWS CRT avec connectionTimeout des valeurs et. maxConcurrency

Synchronous client

Importations

import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.services.s3.S3Client; import java.time.Duration;

Code

// Singleton: Use s3Client for all requests. S3Client s3Client = S3Client.builder() .httpClientBuilder(AwsCrtHttpClient .builder() .connectionTimeout(Duration.ofSeconds(3)) .maxConcurrency(100)) .build(); // Perform work with the s3Client. // Requests completed: Close the s3Client. s3Client.close();
Asynchronous client

Importations

import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.services.s3.S3AsyncClient; import java.time.Duration;

Code

// Singleton: Use s3AsyncClient for all requests. S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .httpClientBuilder(AwsCrtAsyncHttpClient .builder() .connectionTimeout(Duration.ofSeconds(3)) .maxConcurrency(100)) .build(); // Perform work with the s3AsyncClient. // Requests completed: Close the s3AsyncClient. s3AsyncClient.close();

Approche alternative : partager une instance

Pour réduire l'utilisation des ressources et de la mémoire de votre application, vous pouvez configurer un client HTTP AWS CRT et le partager entre plusieurs clients de service. Le pool de connexions HTTP sera partagé, ce qui réduit l'utilisation des ressources.

Note

Lorsqu'une instance client AWS HTTP CRT est partagée, vous devez la fermer lorsqu'elle est prête à être supprimée. Le SDK ne ferme pas l'instance lorsque le client de service est fermé.

L'exemple suivant configure une instance de client HTTP AWS CRT avec connectionTimeout des valeurs et. maxConcurrency L'instance configurée est transmise à la httpClient méthode du générateur de chaque client de service. Lorsque les clients du service et le client HTTP ne sont plus nécessaires, ils sont explicitement fermés. Le client HTTP est fermé en dernier.

Synchronous client

Importations

import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.s3.S3Client; import java.time.Duration;

Code

// Create an AwsCrtHttpClient shared instance. SdkHttpClient crtHttpClient = AwsCrtHttpClient.builder() .connectionTimeout(Duration.ofSeconds(3)) .maxConcurrency(100) .build(); // Singletons: Use the s3Client and dynamoDbClient for all requests. S3Client s3Client = S3Client.builder() .httpClient(crtHttpClient) .credentialsProvider(EnvironmentVariableCredentialsProvider.crea .defaultsMode(DefaultsMode.IN_REGION) .region(Region.US_EAST_1) .build(); DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(crtHttpClient) .credentialsProvider(EnvironmentVariableCredentialsProvider.crea .defaultsMode(DefaultsMode.IN_REGION) .region(Region.US_EAST_1) .build(); // Requests completed: Close all service clients. s3Client.close(); dynamoDbClient.close(); crtHttpClient.close(); // Explicitly close crtHttpClient.
Asynchronous client

Importations

import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; import software.amazon.awssdk.http.async.SdkAsyncHttpClient; import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; import software.amazon.awssdk.services.s3.S3AsyncClient; import java.time.Duration;

Code

// Create an AwsCrtAsyncHttpClient shared instance. SdkAsyncHttpClient crtAsyncHttpClient = AwsCrtAsyncHttpClient.builder() .connectionTimeout(Duration.ofSeconds(3)) .maxConcurrency(100) .build(); // Singletons: Use the s3AsyncClient and dynamoDbAsyncClient for all requests. S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .httpClient(crtAsyncHttpClient) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .defaultsMode(DefaultsMode.IN_REGION) .region(Region.US_EAST_1) .build(); DynamoDbAsyncClient dynamoDbAsyncClient = DynamoDbAsyncClient.builder() .httpClient(crtAsyncHttpClient) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .defaultsMode(DefaultsMode.IN_REGION) .region(Region.US_EAST_1) .build(); // Requests completed: Close all service clients. s3AsyncClient.close(); dynamoDbAsyncClient.close(); crtAsyncHttpClient.close(); // Explicitly close crtAsyncHttpClient.

Définir un client HTTP AWS CRT comme client par défaut

Vous pouvez configurer votre fichier de compilation Maven pour que le SDK utilise un client HTTP AWS CRT comme client HTTP par défaut pour les clients de service.

Pour ce faire, ajoutez un exclusions élément avec les dépendances du client HTTP par défaut à chaque artefact du client de service.

Dans l'pom.xmlexemple suivant, le SDK utilise un client HTTP AWS CRT pour les services S3. Si le client de service de votre code est unS3AsyncClient, le SDK utiliseAwsCrtAsyncHttpClient. Si le client de service est un client S3, le SDK utilise. AwsCrtHttpClient Avec cette configuration, le client HTTP asynchrone par défaut basé sur Netty et le HTTP synchrone basé sur Apache par défaut ne sont pas disponibles.

<project> <properties> <aws.sdk.version>VERSION</aws.sdk.version> </properties> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>${aws.sdk.version}</version> <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> </dependencies> </project>

Visitez le dépôt central de Maven pour obtenir la dernière valeur de VERSION.

Note

Si plusieurs clients de service sont déclarés dans un pom.xml fichier, ils ont tous besoin de l'élément exclusions XML.

Utiliser une propriété système Java

Pour utiliser les clients HTTP AWS CRT comme protocole HTTP par défaut pour votre application, vous pouvez définir la propriété système Java sur une valeur software.amazon.awssdk.http.async.service.impl de. software.amazon.awssdk.http.crt.AwsCrtSdkHttpService

Pour définir lors du démarrage de l'application, exécutez une commande similaire à la suivante.

java app.jar -Dsoftware.amazon.awssdk.http.async.service.impl=\ software.amazon.awssdk.http.crt.AwsCrtSdkHttpService

Utilisez l'extrait de code suivant pour définir la propriété système dans le code de votre application.

System.setProperty("software.amazon.awssdk.http.async.service.impl", "software.amazon.awssdk.http.crt.AwsCrtSdkHttpService");
Note

Vous devez ajouter une dépendance à l'aws-crt-clientartefact de votre poml.xml fichier lorsque vous utilisez une propriété système pour configurer l'utilisation des clients HTTP AWS CRT.

Configuration avancée des clients HTTP AWS basés sur CRT

Vous pouvez utiliser différents paramètres de configuration des clients HTTP AWS basés sur CRT, notamment la configuration de l'état de la connexion et le temps d'inactivité maximal. Vous pouvez consulter les options de configuration disponibles pourAwsCrtAsyncHttpClient. Vous pouvez configurer les mêmes options pourAwsCrtHttpClient.

Configuration de l'état de la connexion

Vous pouvez configurer la configuration de l'état de la connexion pour les clients HTTP AWS basés sur CRT en utilisant la connectionHealthConfiguration méthode du générateur de clients HTTP.

L'exemple suivant crée un client de service S3 qui utilise une instance de client HTTP AWS CRT configurée avec une configuration d'état de connexion et une durée d'inactivité maximale pour les connexions.

Synchronous client

Importations

import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.services.s3.S3Client; import java.time.Duration;

Code

// Singleton: Use the s3Client for all requests. S3Client s3Client = S3Client.builder() .httpClientBuilder(AwsCrtHttpClient .builder() .connectionHealthConfiguration(builder -> builder .minimumThroughputInBps(32000L) .minimumThroughputTimeout(Duration.ofSeconds(3))) .connectionMaxIdleTime(Duration.ofSeconds(5))) .build(); // Perform work with s3Client. // Requests complete: Close the service client. s3Client.close();
Asynchronous client

Importations

import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.services.s3.S3AsyncClient; import java.time.Duration;

Code

// Singleton: Use the s3AsyncClient for all requests. S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .httpClientBuilder(AwsCrtAsyncHttpClient .builder() .connectionHealthConfiguration(builder -> builder .minimumThroughputInBps(32000L) .minimumThroughputTimeout(Duration.ofSeconds(3))) .connectionMaxIdleTime(Duration.ofSeconds(5))) .build(); // Perform work with s3AsyncClient. // Requests complete: Close the service client. s3AsyncClient.close();

Support HTTP/2

Le protocole HTTP/2 n'est pas encore pris en charge dans les clients HTTP AWS basés sur CRT, mais il est prévu pour une future version.

En attendant, si vous utilisez des clients de service qui nécessitent un support HTTP/2 tel que le KinesisAsyncClientou le TranscribeStreamingAsyncClient, pensez à utiliser le à la NettyNioAsyncHttpClientplace.

Exemple de configuration de proxy

L'extrait de code suivant montre l'utilisation de ProxyConfiguration.Buildercelui que vous utilisez pour configurer les paramètres du proxy dans le code.

Synchronous client

Importations

import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.http.crt.ProxyConfiguration;

Code

SdkHttpClient crtHttpClient = AwsCrtHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .scheme("https") .host("myproxy") .port(1234) .username("username") .password("password") .nonProxyHosts(Set.of("localhost", "host.example.com")) .build()) .build();
Asynchronous client

Importations

import software.amazon.awssdk.http.async.SdkAsyncHttpClient; import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.http.crt.ProxyConfiguration;

Code

SdkAsyncHttpClient crtAsyncHttpClient = AwsCrtAsyncHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .scheme("https") .host("myproxy") .port(1234) .username("username") .password("password") .nonProxyHosts(Set.of("localhost", "host.example.com")) .build()) .build();

Les propriétés système Java équivalentes pour la configuration du proxy sont indiquées dans l'extrait de ligne de commande suivant.

$ java -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=1234 -Dhttps.proxyUser=username \ -Dhttps.proxyPassword=password -Dhttp.nonProxyHosts=localhost|host.example.com -cp ... App
Important

Pour utiliser l'une des propriétés du système proxy HTTPS, la scheme propriété doit être définie dans le code surhttps. Si la propriété du schéma n'est pas définie dans le code, le schéma est défini par défaut sur HTTP et le SDK recherche uniquement les propriétés http.* du système.

La configuration équivalente qui utilise des variables d'environnement est la suivante :

// Set the following environment variables. // $ export HTTPS_PROXY="https://username:password@myproxy:1234" // $ export NO_PROXY="localhost|host.example.com" // Set the 'useSystemPropertyValues' to false on the proxy configuration. SdkAsyncHttpClient crtAsyncHttpClient = AwsCrtAsyncHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .scheme("https") .useSystemPropertyValues(Boolean.FALSE) .build()) .build(); // Run the application. // $ java -cp ... App