Configurar o cliente HTTP baseado em Netty - AWS SDK for Java 2.x

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Configurar o cliente HTTP baseado em Netty

O cliente HTTP padrão para operações assíncronas no AWS SDK for Java 2.x é o baseado em Netty. NettyNioAsyncHttpClient O cliente baseado em Netty é baseado na estrutura de rede assíncrona orientada por eventos do projeto Netty.

Como cliente HTTP alternativo, é possível usar o novo cliente HTTP baseado em AWS CRT. Este tópico mostra como configurar o NettyNioAsyncHttpClient.

Acesse o NettyNioAsyncHttpClient

Na maioria das situações, você usa o NettyNioAsyncHttpClient sem nenhuma configuração explícita em programas assíncronos. Você declara seus clientes de serviço assíncronos e o SDK configurará o NettyNioAsyncHttpClient com valores padrão para você.

Se você quiser configurar o NettyNioAsyncHttpClient explicitamente ou usá-lo com vários clientes de serviço, precisará disponibilizá-lo para configuração.

Nenhuma configuração necessária

Quando você declara uma dependência de um cliente de serviço no Maven, o SDK adiciona uma dependência de tempo de execução ao artefato netty-nio-client. Isso torna a classe NettyNioAsyncHttpClient disponível para o código em runtime, mas não no momento da compilação. Se você não estiver configurando o cliente HTTP baseado em Netty, não precisará especificar uma dependência para ele.

No seguinte trecho XML de um arquivo pom.xml do Maven, a dependência declarada com <artifactId>dynamodb-enhanced</artifactId> traz transitivamente o cliente HTTP baseado em Netty. Você não precisa declarar uma dependência especificamente para isso.

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

Com essas dependências, você não pode fazer nenhuma alteração na configuração HTTP, pois a biblioteca NettyNioAsyncHttpClient está apenas no caminho de classe em runtime.

Configuração necessária

Para configurar o NettyNioAsyncHttpClient, você precisa adicionar uma dependência no artefato netty-nio-client em tempo de compilação.

Consulte o exemplo a seguir de um arquivo pom.xml do Maven para configurar o NettyNioAsyncHttpClient.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.17.290</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>

Usar e configurar o NettyNioAsyncHttpClient

Você pode configurar uma instância do NettyNioAsyncHttpClient junto com a criação de um cliente de serviço ou pode configurar uma única instância para compartilhar entre vários clientes de serviço.

Com qualquer abordagem, você usa o NettyNioAsyncHttpClient.Builder para configurar as propriedades da instância do cliente HTTP baseada em Netty.

Prática recomendada: dedicar uma instância NettyNioAsyncHttpClient a um cliente de serviço

Se você precisar configurar uma instância do NettyNioAsyncHttpClient, recomendamos criar uma instância NettyNioAsyncHttpClient dedicada. Faça isso usando o método httpClientBuilder do builder do cliente do serviço. Dessa forma, o ciclo de vida do cliente HTTP é gerenciado pelo SDK, o que ajuda a evitar possíveis vazamentos de memória se a instância do NettyNioAsyncHttpClient não for fechada quando não for mais necessária.

O exemplo a seguir cria uma instância DynamoDbAsyncClient, que também é usada por uma instância DynamoDbEnhancedAsyncClient. A instância DynamoDbAsyncClient contém a instância NettyNioAsyncHttpClient com valores connectionTimeout e maxConcurrency. A instância HTTP é criada usando o método httpClientBuilder do DynamoDbAsyncClient.Builder.

Importações

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

Abordagem alternativa: compartilhar uma instância NettyNioAsyncHttpClient

Para ajudar a reduzir o uso de recursos e memória do seu aplicativo, você pode configurar um NettyNioAsyncHttpClient e compartilhá-lo entre vários clientes de serviço. O pool de conexões HTTP será compartilhado, o que reduz o uso de recursos.

nota

Quando uma instância NettyNioAsyncHttpClient é compartilhada, você deve fechá-la quando ela estiver pronta para ser descartada. O SDK não fechará a instância quando o cliente de serviço for fechado.

O exemplo a seguir configura um cliente HTTP baseado em Netty, que é usado por dois clientes de serviço. A instância NettyNioAsyncHttpClient configurada é transmitida ao método httpClient de cada criador. Quando os clientes do serviço e o cliente HTTP não são mais necessários, o código os fecha explicitamente. O código fecha o cliente HTTP por último.

Importações

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.

Exemplo de configuração do proxy

O trecho de código a seguir usa o builder de configuração de proxy para o 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();

As propriedades equivalentes do sistema Java para a configuração do proxy são mostradas no trecho da linha de comando a seguir.

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

Para usar qualquer uma das propriedades do sistema proxy HTTPS, a propriedade scheme deve ser definida no código como https. Se a propriedade scheme não estiver definida no código, o esquema usará HTTP como padrão, e o SDK procurará somente as propriedades do sistema http.*.

A configuração equivalente que usa variáveis de 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 nettyHttpClient = NettyNioAsyncHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .useSystemPropertyValues(Boolean.FALSE) .build()) .build(); // Run the application. // $ java -cp ... App