設定 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 中的服務用戶端具有相依性時, SDK會新增對netty-nio-client成品的執行期相依性。這可讓 NettyNioAsyncHttpClient類別在執行階段可供您的程式碼使用,但無法在編譯時間使用。如果您未設定 Netty 型HTTP用戶端,則不需要為其指定相依性。

在 Maven pom.xml 檔案的下列XML程式碼片段中,宣告為 的相依性<artifactId>dynamodb-enhanced</artifactId>會暫時帶入 Netty 型HTTP用戶端。您不需要特別為其宣告相依性。

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

透過這些相依性,您無法進行任何HTTP組態變更,因為NettyNioAsyncHttpClient程式庫僅位於執行期類別路徑上。

需要的配置

若要設定 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執行個體時,如果執行個體沒有關閉,造成潛在的記憶體洩漏。

下列範例會建立DynamoDbAsyncClient執行個體所使用的DynamoDbEnhancedAsyncClient執行個體。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;

Code

// 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不會關閉執行個體。

下列範例會設定兩個服務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;

Code

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

Proxy 組態範例

下列程式碼片段使用 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,且 只會SDK尋找http.*系統屬性。

使用環境變數的等效設定為:

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