Netty ベースのHTTPクライアントを設定する - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Netty ベースのHTTPクライアントを設定する

の非同期オペレーションのデフォルトHTTPクライアント AWS SDK for Java 2.x は、Netty ベースの ですNettyNioAsyncHttpClient。Netty ベースのクライアントは、Netty プロジェクトの非同期イベント駆動型ネットワークフレームワークに基づいています。

代替HTTPクライアントとして、新しい AWS CRTベースのHTTPクライアント を使用できます。このトピックでは、NettyNioAsyncHttpClient を設定する方法を示します。

NettyNioAsyncHttpClient へのアクセス

ほとんどの場合、非同期プログラムでは明示的な設定を行わずに NettyNioAsyncHttpClient を使用します。非同期サービスクライアントを宣言すると、 SDKは を標準値NettyNioAsyncHttpClientで設定します。

NettyNioAsyncHttpClient を明示的に設定したり、複数のサービスクライアントで使用したりする場合は、設定できるようにする必要があります。

設定が不要です

Maven のサービスクライアントへの依存を宣言すると、 はnetty-nio-clientアーティファクトへのランタイム依存SDKを追加します。これにより、コンパイル時ではなく、ランタイム時にその NettyNioAsyncHttpClient クラスをコードで使用できるようになります。Netty ベースのHTTPクライアントを設定していない場合は、依存関係を指定する必要はありません。

Maven pom.xmlファイルの次のXMLスニペットでは、 で宣言された依存関係は、Netty ベースのHTTPクライアントを<artifactId>dynamodb-enhanced</artifactId>一時的に取り込みます。そのために依存関係を特別に宣言する必要はありません。

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

これらの依存関係では、NettyNioAsyncHttpClientライブラリはランタイムクラスパスにのみ存在するため、HTTP設定の変更を行うことはできません。

設定が必要です

NettyNioAsyncHttpClient を設定するには、コンパイル時に netty-nio-client アーティファクトへの依存関係を追加する必要があります。

次の Maven pom.xml ファイルの例を参照して、「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>

NettyNioAsyncHttpClient を使用および設定する

サービスクライアントを構築すると同時に NettyNioAsyncHttpClient のインスタンスを設定することも、単一インスタンスを複数のサービスクライアント間で共有するように設定することもできます。

どちらの方法でも、NettyNioAsyncHttpClient.Builder を使用して Netty ベースのHTTPクライアントインスタンスのプロパティを設定します。

ベストプラクティス: NettyNioAsyncHttpClient インスタンスをサービスクライアント専用にする

NettyNioAsyncHttpClient のインスタンスを設定する必要がある場合は、専有 NettyNioAsyncHttpClient インスタンスを構築することをお勧めします。これを行うには、サービスクライアントのビルダーの httpClientBuilder メソッドを使用します。これにより、HTTPクライアントのライフサイクルは によって管理されます。これによりSDK、不要になったNettyNioAsyncHttpClientインスタンスが閉じられない場合にメモリリークが発生する可能性を回避できます。

次の例では、DynamoDbEnhancedAsyncClient インスタンスが使用する DynamoDbAsyncClient インスタンスを作成します。DynamoDbAsyncClient インスタンスには、connectionTimeoutmaxConcurrency 値を持つ NettyNioAsyncHttpClient インスタンスが含まれています。HTTP インスタンスは、 の httpClientBuilderメソッドを使用して作成されますDynamoDbAsyncClient.Builder

インポート

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;

コード

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

代替アプローチ: NettyNioAsyncHttpClient インスタンスを共有する

アプリケーションのリソースとメモリの使用量を低く抑えるため、NettyNioAsyncHttpClient を構成して複数のサービスクライアント間で共有できます。HTTP 接続プールが共有され、リソースの使用量が減少します。

注記

NettyNioAsyncHttpClient インスタンスを共有する場合、それを破棄する準備が整った時点でインスタンスを閉じる必要があります。SDK は、サービスクライアントが閉じられたときにインスタンスを閉じません。

次の例では、2 つのサービスHTTPクライアントで使用される Netty ベースのクライアントを設定します。設定された NettyNioAsyncHttpClient インスタンスは、各ビルダーの httpClient メソッドに渡されます。サービスクライアントとHTTPクライアントが不要になった場合、コードは明示的に閉じます。コードは最後にHTTPクライアントを閉じます。

インポート

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;

コード

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

プロキシの設定例

次のコードスニペットは、Netty HTTPクライアント のプロキシ設定ビルダーを使用します。

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

プロキシ設定に対応する Java システムプロパティは、以下のコマンドラインスニペットに示されています。

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

HTTPS プロキシシステムプロパティを使用するには、schemeプロパティを コードで に設定する必要がありますhttps。スキームプロパティがコードに設定されていない場合、スキームはデフォルトで HTTPに設定されます。 はhttp.*システムプロパティのみSDKを検索します。

環境変数を使用する同等のセットアップは次のとおりです。

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