Configurar clientes AWS HTTP basados en CRT - 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 clientes AWS HTTP basados en CRT

Los clientes HTTP AWS basados en CRT incluyen los clientes síncronos y asíncronos. AwsCrtHttpClientAwsCrtAsyncHttpClient Los clientes HTTP AWS basados en CRT ofrecen las siguientes ventajas para los clientes HTTP:

  • Tiempo de inicio del SDK más rápido

  • Ocupación de menos espacio de memoria

  • Tiempo de latencia reducido

  • Administración del estado de conexión

  • equilibrio de carga de DNS

AWS Componentes basados en CRT en el SDK

Los clientes HTTP AWS basados en CRT, que se describen en este tema, y el cliente S3 AWS basado en CRT son componentes diferentes del SDK.

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

El cliente S3 AWS basado en CRT 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 clientes HTTP AWS basados en CRT no utilizan la biblioteca aws-c-s 3 y no admiten las funciones de la API de carga multiparte de S3. El cliente S3 AWS basado en CRT, por el contrario, se creó específicamente para admitir las funciones de la API de carga multiparte de S3.

Acceda a los clientes HTTP basados en CRT AWS

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

Utilice una de las siguientes opciones para configurar el archivo pom.xml de Maven.

nota

Puedes optar por utilizar la opción jar específica de la plataforma si necesitas reducir el tamaño de las dependencias del tiempo de ejecución, por ejemplo, si tu aplicación se ejecuta en una función. AWS Lambda

Uber-jar option

De forma predeterminada, aws-crt-client utiliza un supercontenedor de artefactos AWS CRT que contiene archivos binarios para varias plataformas, incluidas Linux, Windows y macOS.

<project> <properties> <aws.sdk.java.version>2.29.10*</aws.sdk.java.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>

*Reemplace la versión que se muestra en rojo por la versión del SDK de Java que desee utilizar. Busque las últimas novedades sobre Maven Central.

Platform-specific jar option

Para restringir el tiempo de ejecución de Java a la versión de la biblioteca AWS CRT específica para cada plataforma, realice los siguientes cambios en la opción Uber-JAR.

  • Añada un elemento de exclusions al artefacto aws-crt-client del SDK. Esta exclusión impide que el SDK utilice transitoriamente el uber-jar CRT. AWS

  • Agrega un elemento de dependencia para la versión específica de la plataforma AWS CRT que necesites. Consulte los pasos para determinar la versión del artefacto AWS CRT que aparecen a continuación para saber cómo determinar la versión correcta.

<project> <properties> <aws.sdk.java.version>2.29.101</aws.sdk.java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.sdk.java.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> <exclusions> <exclusion> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> <version>0.31.32</version> <classifier>linux-x86_643</classifier> </dependency> </dependencies>

1Reemplace la versión que se muestra en rojo por la versión del SDK de Java que desee utilizar. Busque las últimas novedades sobre Maven Central.

2Reemplace la versión de software.amazon.awssdk.crt:aws-crt que proporcionaría la Opción Uber-jar. Consulta los siguientes pasos para determinar la versión del artefacto AWS CRT.

3Reemplace el valor de classifier por uno para su plataforma. Consulte la GitHub página AWS CRT para Java para obtener una lista de los valores disponibles.

Pasos para determinar la versión del AWS artefacto CRT

Siga los pasos siguientes para determinar la versión del artefacto AWS CRT que es compatible con la versión del SDK para Java que está utilizando.

  1. Configure el archivo pom.xml como se muestra en la Opción Uber-jar. Esta configuración permite ver qué versión de software.amazon.awssdk.crt:aws-crt del SDK está incluida de forma predeterminada.

  2. En la raíz del proyecto (en el mismo directorio que el archivo pom.xml), ejecute el siguiente comando de Maven:

    mvn dependency:tree -Dincludes=software.amazon.awssdk.crt:aws-crt

    Maven puede realizar otras acciones, pero al final debería ver la salida de la consola de la dependencia de software.amazon.awssdk.crt:aws-crt que utiliza el SDK de forma transitiva. En el siguiente fragmento de código se muestra una salida de ejemplo basada en una versión del SDK de 2.29.10:

    [INFO] org.example:yourProject:jar:1.0-SNAPSHOT [INFO] \- software.amazon.awssdk:aws-crt-client:jar:2.29.10:compile [INFO] \- software.amazon.awssdk.crt:aws-crt:jar:0.31.3:compile
  3. Utilice la versión que muestra la consola para el artefacto de software.amazon.awssdk.crt:aws-crt. En este caso, añada 0.31.3 al archivo pom.xml.

Utilice y configure un cliente HTTP basado en AWS CRT

Puede configurar un cliente HTTP AWS basado en CRT 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 cliente HTTP AWS basada en CRT.

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

Si necesitas configurar una instancia de un cliente HTTP AWS basado en CRT, te recomendamos que dediques la instancia y la compiles junto con el cliente de servicio. Puede hacerlo con el método httpClientBuilder del generador del cliente del servicio. De esta forma, el SDK administra el ciclo de vida del cliente HTTP, lo que ayuda a evitar posibles pérdidas de memoria si la instancia del cliente HTTP AWS basada en CRT no se cierra cuando ya no es necesaria.

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

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 cliente HTTP AWS basado en CRT y compartirlo entre varios clientes de servicio. El grupo de conexiones HTTP se compartirá, lo que reduce el uso de recursos.

nota

Cuando se comparte una instancia de cliente HTTP AWS basada en CRT, debe cerrarla cuando esté lista para su eliminación. El SDK no cerrará la instancia cuando el cliente del servicio esté cerrado.

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

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 cliente HTTP AWS basado en CRT como predeterminado

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

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

En el siguiente pom.xml ejemplo, el SDK usa un cliente HTTP AWS basado en CRT para los servicios de S3. Si el cliente de servicio de su código es un S3AsyncClient, el SDK utiliza AwsCrtAsyncHttpClient. Si el cliente de servicio es un S3Client, el SDK utiliza AwsCrtHttpClient. Con esta configuración, el cliente HTTP asíncrono predeterminado basado en Netty y el HTTP síncrono predeterminado basado en Apache no están 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>

Visite el repositorio central de Maven para obtener el valor más reciente. VERSION

nota

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

Utilizar una propiedad del sistema Java

Para usar los clientes HTTP AWS basados en CRT como HTTP predeterminado para su aplicación, puede establecer la propiedad del sistema Java en un valor software.amazon.awssdk.http.async.service.impl de. software.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 clientes HTTP basados en AWS CRT.

Configuración avanzada de clientes HTTP basados en AWS CRT

Puede utilizar varios ajustes de configuración de los clientes HTTP AWS basados en CRT, 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 clientes HTTP AWS basados en CRT mediante el connectionHealthConfiguration método del generador de clientes HTTP.

En el siguiente ejemplo, se crea un cliente de servicio S3 que utiliza una instancia de cliente HTTP AWS basada en CRT configurada con 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();

Compatibilidad con HTTP/2

El protocolo HTTP/2 aún no es compatible con los clientes HTTP AWS basados en CRT, 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 en su lugar. NettyNioAsyncHttpClient

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 proxy HTTPS, la propiedad scheme debe estar configurada en código para https. Si la propiedad del esquema no está configurada en el código, el esquema predeterminado es HTTP y el SDK solo busca las propiedades del sistema http.*.

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