Configurazione AWS dei client HTTP basati su CRT - AWS SDK for Java 2.x

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurazione AWS dei client HTTP basati su CRT

I client HTTP AWS basati su CRT includono quelli sincroni e asincroni. AwsCrtHttpClientAwsCrtAsyncHttpClient I client HTTP AWS basati su CRT offrono i seguenti vantaggi del client HTTP:

  • Tempo di avvio SDK più rapido

  • Ingombro di memoria ridotto

  • Tempo di latenza ridotto

  • Gestione dello stato della connessione

  • Bilanciamento del carico DNS

AWS Componenti basati su CRT nell'SDK

I client HTTP AWS basati su CRT, descritti in questo argomento, e il client S3 AWS basato su CRT sono componenti diversi dell'SDK.

I client HTTP sincroni e asincroni AWS basati su CRT sono interfacce client HTTP SDK di implementazione e vengono utilizzati per comunicazioni HTTP generali. Sono alternative agli altri client HTTP sincroni o asincroni dell'SDK con vantaggi aggiuntivi.

Il client S3 AWS basato su CRT è un'implementazione dell'AsyncClientinterfaccia S3 e viene utilizzato per lavorare con il servizio Amazon S3. È un'alternativa all'implementazione dell'interfaccia basata su Java e offre diversi vantaggi. S3AsyncClient

Sebbene entrambi i componenti utilizzino librerie del AWS Common Runtime, i client HTTP AWS basati su CRT non utilizzano la libreria aws-c-s 3 e non supportano le funzionalità dell'API di caricamento multipart di S3. Il client S3 AWS basato su CRT, invece, è stato creato appositamente per supportare le funzionalità dell'API di caricamento multiparte di S3.

Accedi AWS ai client HTTP basati su CRT

Prima di poter utilizzare i client HTTP AWS basati su CRT, aggiungete l'aws-crt-clientartefatto con una versione minima di 2.22.0 alle dipendenze del progetto.

Il seguente Maven pom.xml mostra i client HTTP AWS basati su CRT dichiarati utilizzando il meccanismo della distinta base (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>

Visita il repository centrale di Maven per la versione più recente.

Usa e configura un AWS client HTTP basato su CRT

È possibile configurare un client HTTP AWS basato su CRT insieme alla creazione di un client di servizio oppure è possibile configurare una singola istanza da condividere tra più client di servizio.

Con entrambi gli approcci, si utilizza un builder per configurare le proprietà per l'istanza del client HTTP basato su AWS CRT.

Procedura consigliata: dedicare un'istanza a un client di servizio

Se devi configurare un'istanza di un client HTTP AWS basato su CRT, ti consigliamo di dedicare l'istanza costruendola insieme al client di servizio. Puoi farlo utilizzando il httpClientBuilder metodo del builder del client del servizio. In questo modo, il ciclo di vita del client HTTP viene gestito dall'SDK, che aiuta a evitare potenziali perdite di memoria se l'istanza del client HTTP AWS basato su CRT non viene chiusa quando non è più necessaria.

L'esempio seguente crea un client di servizio S3 e configura un client HTTP basato su CRT con valori e. AWS connectionTimeout maxConcurrency

Synchronous client

Importazioni

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

Codice

// 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

Importazioni

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

Codice

// 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();

Approccio alternativo: condividi un'istanza

Per ridurre l'utilizzo di risorse e memoria per l'applicazione, è possibile configurare un client HTTP AWS basato su CRT e condividerlo tra più client di servizio. Il pool di connessioni HTTP verrà condiviso, il che riduce l'utilizzo delle risorse.

Nota

Quando un'istanza client HTTP AWS basata su CRT viene condivisa, è necessario chiuderla quando è pronta per essere eliminata. L'SDK non chiuderà l'istanza quando il client del servizio viene chiuso.

L'esempio seguente configura un'istanza client HTTP AWS basata su CRT con valori e. connectionTimeout maxConcurrency L'istanza configurata viene passata al httpClient metodo del builder di ogni client di servizio. Quando i client di servizio e il client HTTP non sono più necessari, vengono chiusi in modo esplicito. Il client HTTP viene chiuso per ultimo.

Synchronous client

Importazioni

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;

Codice

// 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

Importazioni

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;

Codice

// 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.

Imposta un client HTTP AWS basato su CRT come predefinito

Puoi configurare il tuo file di build Maven in modo che l'SDK utilizzi un client HTTP AWS basato su CRT come client HTTP predefinito per i client di servizio.

A tale scopo, è possibile aggiungere un exclusions elemento con le dipendenze del client HTTP predefinite a ciascun elemento del client di servizio.

Nell'pom.xmlesempio seguente, l'SDK utilizza un client HTTP AWS basato su CRT per i servizi S3. Se il client di servizio nel codice è unS3AsyncClient, l'SDK lo utilizza. AwsCrtAsyncHttpClient Se il client di servizio è un S3Client, l'SDK utilizza. AwsCrtHttpClient Con questa configurazione il client HTTP asincrono predefinito basato su Netty e l'HTTP sincrono predefinito basato su Apache non sono disponibili.

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

Visita l'archivio centrale di Maven per il valore VERSION più recente.

Nota

Se in un pom.xml file vengono dichiarati più client di servizio, tutti richiedono l'exclusionselemento XML.

Utilizzate una proprietà di sistema Java

Per utilizzare i client HTTP AWS basati su CRT come HTTP predefinito per l'applicazione, è possibile impostare la proprietà del sistema Java su un valore software.amazon.awssdk.http.async.service.impl di. software.amazon.awssdk.http.crt.AwsCrtSdkHttpService

Per impostarlo durante l'avvio dell'applicazione, eseguite un comando simile al seguente.

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

Utilizzate il seguente frammento di codice per impostare la proprietà di sistema nel codice dell'applicazione.

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

È necessario aggiungere una dipendenza dall'elemento nel poml.xml file quando si utilizza una proprietà di sistema per configurare l'uso dei client HTTP basati su aws-crt-client CRT. AWS

Configurazione avanzata dei client HTTP basati su CRT AWS

È possibile utilizzare varie impostazioni di configurazione dei client HTTP AWS basati su CRT, tra cui la configurazione dello stato della connessione e il tempo massimo di inattività. È possibile esaminare le opzioni di configurazione disponibili per. AwsCrtAsyncHttpClient È possibile configurare le stesse opzioni perAwsCrtHttpClient.

Configurazione dello stato della connessione

È possibile configurare la configurazione dello stato della connessione per i client HTTP AWS basati su CRT utilizzando il connectionHealthConfiguration metodo del generatore di client HTTP.

L'esempio seguente crea un client di servizio S3 che utilizza un'istanza del client HTTP AWS basata su CRT configurata con la configurazione dello stato della connessione e un tempo di inattività massimo per le connessioni.

Synchronous client

Importazioni

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

Codice

// 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

Importazioni

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

Codice

// 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();

Supporto HTTP/2

Il protocollo HTTP/2 non è ancora supportato nei client HTTP AWS basati su CRT, ma è previsto per una versione futura.

Nel frattempo, se utilizzi client di servizio che richiedono il supporto HTTP/2 come the o the, considera di utilizzare invece il KinesisAsyncClient. TranscribeStreamingAsyncClientNettyNioAsyncHttpClient

Esempio di configurazione del proxy

Il seguente frammento di codice mostra l'uso di ProxyConfiguration.Builderciò che si utilizza per configurare l'impostazione del proxy nel codice.

Synchronous client

Importazioni

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

Codice

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

Importazioni

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

Codice

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();

Le proprietà di sistema Java equivalenti per la configurazione del proxy sono mostrate nel seguente frammento di riga di comando.

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

Per utilizzare una qualsiasi delle proprietà del sistema proxy HTTPS, la scheme proprietà deve essere impostata nel codice su. https Se la proprietà scheme non è impostata nel codice, per impostazione predefinita lo schema è HTTP e l'SDK cerca http.* solo le proprietà di sistema.

La configurazione equivalente che utilizza le variabili di ambiente è:

// 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