Configurar el cliente basado en Netty HTTP - 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 el cliente basado en Netty HTTP

El HTTP cliente predeterminado para las operaciones asíncronas en el es el basado en Netty. AWS SDK for Java 2.x NettyNioAsyncHttpClient El cliente basado en Netty se basa en el marco de red asíncrono dirigido por eventos del proyecto Netty.

Como HTTP cliente alternativo, puede utilizar el nuevo cliente basado en datos.AWS CRT HTTP En este tema se muestra cómo configurar el NettyNioAsyncHttpClient.

Acceso al NettyNioAsyncHttpClient

En la mayoría de las situaciones, se utiliza NettyNioAsyncHttpClient sin ninguna configuración explícita en los programas asíncronos. Usted declara sus clientes de servicio asíncronos y ellos los SDK configurarán NettyNioAsyncHttpClient con valores estándar por usted.

Si quiere configurar de forma explícita el NettyNioAsyncHttpClient o usarlo con varios clientes de servicio, tiene que hacerlo disponible para su configuración.

No se necesita configuración

Cuando declaras una dependencia de un cliente de servicio en Maven, se SDK añade una dependencia del artefacto en tiempo de ejecución. netty-nio-client Esto hace que la clase NettyNioAsyncHttpClient esté disponible para su código en el tiempo de ejecución, pero no en el de compilación. Si no está configurando el HTTP cliente basado en Netty, no necesita especificar una dependencia para él.

En el siguiente XML fragmento de un pom.xml archivo Maven, la dependencia declarada con trae de forma <artifactId>dynamodb-enhanced</artifactId> transitiva al cliente basado en Netty. HTTP No necesita declarar una dependencia específicamente para ella.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.27.21</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb-enhanced</artifactId> </dependency> </dependencies>

Con estas dependencias, no puede realizar ningún cambio de HTTP configuración, ya que la biblioteca solo se encuentra en la ruta de clases en tiempo de ejecuciónNettyNioAsyncHttpClient.

Se necesita configuración

Para configurar el NettyNioAsyncHttpClient, es necesario añadir una dependencia al artefacto netty-nio-client en tiempo de compilación.

Consulte el siguiente ejemplo de un archivo pom.xml Maven para configurar el NettyNioAsyncHttpClient.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.27.21</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb-enhanced</artifactId> </dependency> <!-- By adding the netty-nio-client dependency, NettyNioAsyncHttpClient will be added to the compile classpath so you can configure it. --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </dependency> </dependencies>

Utilizar y configurar el NettyNioAsyncHttpClient

Puede configurar una instancia del NettyNioAsyncHttpClient junto con la creación de un cliente de servicio, o configurar una sola instancia para compartirla entre varios clientes de servicio.

Con cualquiera de los dos enfoques, se utiliza el NettyNioAsyncHttpClient.Builder para configurar las propiedades de la instancia de cliente basada en Netty. HTTP

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

Si necesita configurar una instancia del NettyNioAsyncHttpClient, le recomendamos que cree una instancia de NettyNioAsyncHttpClient dedicada. 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 NettyNioAsyncHttpClient instancia no se cierra cuando ya no es necesaria.

En el siguiente ejemplo, se crea una instancia DynamoDbAsyncClient, que también es utilizada por una instancia DynamoDbEnhancedAsyncClient. La instancia DynamoDbAsyncClient contiene la instancia NettyNioAsyncHttpClient con los valores connectionTimeout y maxConcurrency. La HTTP instancia se crea mediante el httpClientBuilder método deDynamoDbAsyncClient.Builder.

Importaciones

import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient; import software.amazon.awssdk.enhanced.dynamodb.extensions.AutoGeneratedTimestampRecordExtension; import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; import java.time.Duration;

Código

// DynamoDbAsyncClient is the lower-level client used by the enhanced client. DynamoDbAsyncClient dynamoDbAsyncClient = DynamoDbAsyncClient .builder() .httpClientBuilder(NettyNioAsyncHttpClient.builder() .connectionTimeout(Duration.ofMillis(5_000)) .maxConcurrency(100) .tlsNegotiationTimeout(Duration.ofMillis(3_500))) .defaultsMode(DefaultsMode.IN_REGION) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build(); // Singleton: Use dynamoDbAsyncClient and enhancedClient for all requests. DynamoDbEnhancedAsyncClient enhancedClient = DynamoDbEnhancedAsyncClient .builder() .dynamoDbClient(dynamoDbAsyncClient) .extensions(AutoGeneratedTimestampRecordExtension.create()) .build(); // Perform work with the dynamoDbAsyncClient and enhancedClient. // Requests completed: Close dynamoDbAsyncClient. dynamoDbAsyncClient.close();

Enfoque alternativo: compartir una instancia NettyNioAsyncHttpClient

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

nota

Al compartir una instancia de NettyNioAsyncHttpClient, es preciso cerrarla cuando esté lista para ser eliminada. No SDK cerrará la instancia cuando el cliente del servicio esté cerrado.

El siguiente ejemplo configura un HTTP cliente basado en Netty que utilizan dos clientes de servicio. La instancia de NettyNioAsyncHttpClient configurada se pasa al método httpClient de cada creador. Cuando los clientes de servicio y el HTTP cliente ya no son necesarios, el código los cierra de forma explícita. El código cierra al HTTP cliente en último lugar.

Importaciones

import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.s3.S3Client;

Código

// Create a NettyNioAsyncHttpClient shared instance. SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.builder().maxConcurrency(100).build(); // Singletons: Use the s3AsyncClient, dbAsyncClient, and enhancedAsyncClient for all requests. S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .httpClient(nettyHttpClient) .build(); DynamoDbAsyncClient dbAsyncClient = DynamoDbAsyncClient.builder() .httpClient(nettyHttpClient) .defaultsMode(DefaultsMode.IN_REGION) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build(); DynamoDbEnhancedAsyncClient enhancedAsyncClient = DynamoDbEnhancedAsyncClient.builder() .dynamoDbClient(dbAsyncClient) .extensions(AutoGeneratedTimestampRecordExtension.create()) .build(); // Perform work with s3AsyncClient, dbAsyncClient, and enhancedAsyncClient. // Requests completed: Close all service clients. s3AsyncClient.close(); dbAsyncClient.close() nettyHttpClient.close(); // Explicitly close nettyHttpClient.

Ejemplo de configuración proxy

El siguiente fragmento de código utiliza el generador de configuración de proxy para el cliente HTTP Netty.

SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.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 para. https 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 nettyHttpClient = NettyNioAsyncHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .useSystemPropertyValues(Boolean.FALSE) .build()) .build(); // Run the application. // $ java -cp ... App