Configurar HTTP clientes AWS CRT basados - AWS SDK for Java 2.x

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Configurar HTTP clientes AWS CRT basados

Los HTTP clientes AWS CRT basados incluyen los clientes síncronos AwsCrtHttpClienty AwsCrtAsyncHttpClientasíncronos. Los HTTP clientes AWS CRT basados ofrecen las siguientes ventajas para el cliente: HTTP

  • Tiempo de SDK inicio más rápido

  • Ocupación de menos espacio de memoria

  • Tiempo de latencia reducido

  • Administración del estado de conexión

  • DNSequilibrio de carga

AWS CRTcomponentes basados en el SDK

Los HTTPclientes AWS CRT basados, que se describen en este tema, y el cliente S3 AWS CRT basado son componentes diferentes delSDK.

Los HTTPclientes síncronos y asíncronos son interfaces AWS CRT de SDK HTTP cliente de implementaciones y se utilizan para la comunicación general. HTTP Son alternativas a los otros clientes síncronos o HTTP asíncronos con beneficios adicionales. SDK

El cliente S3 AWS CRT basado es una implementación de la AsyncClient interfaz S3 y se utiliza para trabajar con el servicio Amazon S3. Es una alternativa a la implementación de la interfaz S3AsyncClient basada en Java y ofrece varias ventajas.

Si bien ambos componentes utilizan bibliotecas del AWS Common Runtime, los HTTP clientes AWS CRT basados no utilizan la biblioteca aws-c-s 3 y no admiten las API funciones de carga multiparte de S3. El cliente AWS CRT basado en S3, por el contrario, se creó específicamente para admitir las funciones de carga multiparte de S3. API

Acceda a los clientes basados AWS CRT HTTP

Antes de poder usar los HTTP clientes AWS CRT basados, agrega el aws-crt-client artefacto con una versión mínima de 2.22.0 a las dependencias de tu proyecto.

La siguiente tabla Maven pom.xml muestra los HTTP clientes AWS CRT basados declarados mediante el mecanismo de lista de materiales (). BOM

<project> <properties> <aws.sdk.version>2.27.21</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>

Visite el repositorio central de Maven para ver la versión más reciente.

Utilice y configure un cliente AWS CRT basado HTTP

Puede configurar un HTTP cliente AWS CRT basado junto con la creación de un cliente de servicio, o puede configurar una sola instancia para compartirla entre varios clientes de servicio.

Con cualquiera de estos enfoques, se utiliza un generador para configurar las propiedades de la instancia de HTTP cliente AWS CRT basada.

Práctica recomendada: dedicar una instancia de a un cliente de servicio

Si necesita configurar una instancia de un HTTP cliente AWS CRT basado, le recomendamos que dedique la instancia y la cree junto con el cliente de servicio. Puede hacerlo con el método httpClientBuilder del generador del cliente del servicio. De esta forma, el ciclo de vida del HTTP cliente lo gestiona el clienteSDK, lo que ayuda a evitar posibles pérdidas de memoria si la instancia de HTTP cliente AWS CRT basada no se cierra cuando ya no es necesaria.

En el siguiente ejemplo, se crea un cliente de servicio S3 y se configura un HTTP cliente AWS CRT basado con maxConcurrency valores connectionTimeout y.

Synchronous client

Importaciones

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

Código

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

Importaciones

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

Código

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

Enfoque alternativo: compartir una instancia

Para reducir el uso de recursos y memoria para su aplicación, puede configurar un HTTP cliente AWS CRT basado y compartirlo entre varios clientes de servicio. El grupo de HTTP conexiones se compartirá, lo que reduce el uso de recursos.

nota

Cuando se comparte una instancia de HTTP cliente AWS CRT basada, debe cerrarla cuando esté lista para ser eliminada. No SDK cerrará la instancia cuando el cliente del servicio esté cerrado.

En el siguiente ejemplo, se configura una instancia de HTTP cliente AWS CRT basada con maxConcurrency valores connectionTimeout y. La instancia configurada se pasa al método httpClient del creador de cada cliente de servicio. Cuando los clientes del servicio y el HTTP cliente ya no son necesarios, se cierran de forma explícita. El HTTP cliente es el último en cerrar.

Synchronous client

Importaciones

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;

Código

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

Importaciones

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;

Código

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

Establezca un HTTP cliente AWS CRT basado como predeterminado

Puede configurar su archivo de compilación de Maven para que SDK utilice un HTTP cliente AWS CRT basado como HTTP cliente predeterminado para los clientes de servicio.

Para ello, añada un exclusions elemento con las dependencias de HTTP cliente predeterminadas a cada artefacto del cliente de servicio.

En el siguiente pom.xml ejemplo, SDK utiliza un HTTP cliente AWS CRT basado para los servicios de S3. Si el cliente de servicio de su código es unS3AsyncClient, SDK utilizaAwsCrtAsyncHttpClient. Si el cliente de servicio es un S3Client, utiliza. SDK AwsCrtHttpClient Con esta configuración, el cliente asíncrono predeterminado basado en Netty y el HTTP cliente síncrono predeterminado basado en Apache no están disponibles. HTTP

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

Visite el repositorio central de Maven para obtener las últimas VERSIONValor .

nota

Si se declaran varios clientes de servicio en un pom.xml archivo, todos requieren el exclusions XML elemento.

Utilizar una propiedad del sistema Java

Para usar los HTTP clientes AWS CRT basados como predeterminados HTTP para su aplicación, puede establecer la propiedad software.amazon.awssdk.http.async.service.impl del sistema Java en un valor desoftware.amazon.awssdk.http.crt.AwsCrtSdkHttpService.

Para configurarlo durante el inicio de la aplicación, ejecute un comando similar al siguiente.

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

Use el siguiente fragmento de código para establecer la propiedad del sistema en el código de la aplicación.

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

Debe añadir una dependencia al aws-crt-client artefacto del poml.xml archivo cuando utilice una propiedad del sistema para configurar el uso de los HTTP clientes AWS CRT basados.

Configuración avanzada de clientes AWS CRT basados HTTP

Puede utilizar varios ajustes de configuración de los HTTP clientes AWS CRT basados, incluida la configuración del estado de la conexión y el tiempo máximo de inactividad. Puede revisar las opciones de configuración disponibles para el AwsCrtAsyncHttpClient. Puede configurar las mismas opciones para AwsCrtHttpClient.

Configuración del estado de conexión

Puede configurar el estado de la conexión para los HTTP clientes AWS CRT basados mediante el connectionHealthConfiguration método del generador de HTTP clientes.

En el siguiente ejemplo, se crea un cliente de servicio S3 que utiliza una instancia de HTTP cliente AWS CRT basada en una configuración de mantenimiento de la conexión y un tiempo máximo de inactividad para las conexiones.

Synchronous client

Importaciones

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

Código

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

Importaciones

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

Código

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

HTTPCompatibilidad con /2

El protocolo HTTP /2 aún no es compatible con los HTTP clientes AWS CRT basados, pero está previsto que se publique en un futuro.

Mientras tanto, si utiliza clientes de servicio que requieren compatibilidad con HTTP /2, como el KinesisAsyncCliento el TranscribeStreamingAsyncClient, considere la posibilidad de utilizar el NettyNioAsyncHttpClienten su lugar.

Ejemplo de configuración proxy

El siguiente fragmento de código muestra el uso de ProxyConfiguration.Builder que se utiliza para configurar el proxy en el código.

Synchronous client

Importaciones

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

Código

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

Importaciones

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

Código

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

Las propiedades del sistema Java equivalentes para la configuración del proxy se muestran en el siguiente fragmento de línea de comandos.

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

Para utilizar cualquiera de las propiedades del sistema HTTPS proxy, la scheme propiedad debe estar configurada en código parahttps. Si la propiedad del esquema no está configurada en el código, el esquema se establece de forma predeterminada HTTP y solo SDK busca las propiedades http.* del sistema.

La configuración equivalente que usa variables de entorno es:

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