本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定 Netty 型HTTP用戶端
中非同步操作的預設HTTP用戶端 AWS SDK for Java 2.x 是 Netty 型 NettyNioAsyncHttpClient
作為替代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
最佳實務:將NettyNioAsyncHttpClient
執行個體專用於服務用戶端
如果您需要設定 的執行個體NettyNioAsyncHttpClient
,建議您建置專用NettyNioAsyncHttpClient
執行個體。您可以使用服務用戶端建置器httpClientBuilder
的方法來執行此操作。如此一來,HTTP用戶端的生命週期由 管理SDK,這有助於避免在不再需要NettyNioAsyncHttpClient
執行個體時,如果執行個體沒有關閉,造成潛在的記憶體洩漏。
下列範例會建立DynamoDbAsyncClient
執行個體所使用的DynamoDbEnhancedAsyncClient
執行個體。DynamoDbAsyncClient
執行個體包含具有 connectionTimeout
和 maxConcurrency
值的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