基于 AWS CRT 的 HTTP 客戶端包括同步?AwsCrtHttpClient?和異步?AwsCrtAsyncHttpClient?;?AWS CRT 的 HTTP 客戶端具有以下 HTTP 客戶端優(yōu)勢(shì):
-
更快的 SDK 啟動(dòng)時(shí)間
-
更小的內(nèi)存占用空間
-
降低的延遲時(shí)間
-
連接運(yùn)行狀況管理
-
DNS 負(fù)載均衡
SDK 中基于 AWS CRT 的組件
本主題中介紹的基于 AWS CRT 的?HTTP?客戶端,與基于 AWS CRT 的?S3?客戶端是 SDK 中的不同組件。
同步和異步基于 AWS CRT 的 HTTP 客戶端是 SDK HTTP 客戶端接口的實(shí)現(xiàn),用于一般 HTTP 通信。它們是 SDK 中其他同步或異步 HTTP 客戶端的替代方案,提供額外優(yōu)點(diǎn)。
基于 AWS CRT 的 S3 客戶端是?S3AsyncClient?接口的實(shí)現(xiàn),用于與 Amazon S3 服務(wù)配合使用。它是基于 Java 的?S3AsyncClient
?接口實(shí)現(xiàn)的替代方案,具有多種優(yōu)點(diǎn)。
盡管兩個(gè)組件都使用?AWS 通用運(yùn)行時(shí)系統(tǒng)中的庫(kù),但基于 AWS CRT 的 HTTP 客戶端不使用?aws-c-s3 庫(kù),也不支持?S3 分段上傳 API?功能。相比之下,基于 AWS CRT 的 S3 客戶端是專為支持 S3 分段上傳 API 功能而構(gòu)建的。
訪問(wèn)基于 AWS CRT 的 HTTP 客戶端
在使用基于 AWS CRT 的 HTTP 客戶端之前,請(qǐng)先將版本最低為 2.22.0 的?aws-crt-client
?構(gòu)件添加到項(xiàng)目的依賴項(xiàng)中。
以下 Maven?pom.xml
?顯示了使用材料清單(BOM)機(jī)制聲明的基于 AWS CRT 的 HTTP 客戶端。
<project> <properties> <aws.sdk.version>
2.22.0
</aws.sdk.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> </dependencies> </project>
訪問(wèn) Maven Central 存儲(chǔ)庫(kù)以獲取最新版本。
使用和配置基于 AWS CRT 的 HTTP 客戶端
您可以在生成服務(wù)客戶端的同時(shí)配置一個(gè)基于 AWS CRT 的 HTTP 客戶端,也可以將單個(gè)實(shí)例配置為在多個(gè)服務(wù)客戶端之間共享。
無(wú)論哪種方法,您都可以使用生成器為基于 AWS CRT 的 HTTP 客戶端實(shí)例配置屬性。
最佳實(shí)踐:將一個(gè)實(shí)例專用于一個(gè)服務(wù)客戶端
如果您需要配置基于 AWS CRT 的 HTTP 客戶端的實(shí)例,我們建議您與服務(wù)客戶端一同構(gòu)建,從而將實(shí)例專用。您可以通過(guò)使用服務(wù)客戶端生成器的?httpClientBuilder
?方法來(lái)執(zhí)行此操作。這樣,HTTP 客戶端的生命周期就由 SDK 管理,這有助于避免在不再需要基于 AWS CRT 的 HTTP 客戶端實(shí)例卻不關(guān)閉實(shí)例時(shí)可能發(fā)生的內(nèi)存泄漏。
以下示例創(chuàng)建 S3 服務(wù)客戶端,并使用?connectionTimeout
?和?maxConcurrency
?值配置基于 AWS CRT 的 HTTP 客戶端。
- Synchronous client
- Asynchronous client
導(dǎo)入
import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.services.s3.S3Client; import java.time.Duration;
代碼
// Singleton: Use s3Client for all requests. S3Client s3Client = S3Client.builder() .httpClientBuilder(AwsCrtHttpClient .builder() .connectionTimeout(Duration.ofSeconds(3)) .maxConcurrency(100)) .build(); // Perform work with the s3Client. // Requests completed: Close the s3Client. s3Client.close();
替代方法:共享 實(shí)例
為了幫助降低應(yīng)用程序的資源和內(nèi)存使用量,您可以配置一個(gè)基于 AWS CRT 的 HTTP 客戶端,并在多個(gè)服務(wù)客戶端之間共享該客戶端。將共享 HTTP 連接池,從而降低資源使用量。
注意
共享基于 AWS CRT 的 HTTP 客戶端實(shí)例時(shí),必須在準(zhǔn)備好棄置實(shí)例時(shí)將其關(guān)閉。服務(wù)客戶端關(guān)閉后,SDK 不會(huì)關(guān)閉實(shí)例。
以下示例使用?connectionTimeout
?和?maxConcurrency
?值配置基于 AWS CRT 的 HTTP 客戶端實(shí)例。配置的實(shí)例將傳遞給每個(gè)服務(wù)客戶端的生成器的?httpClient
?方法。當(dāng)不再需要服務(wù)客戶端和 HTTP 客戶端時(shí),它們將被顯式關(guān)閉。HTTP 客戶端最后關(guān)閉。
- Synchronous client
- Asynchronous client
導(dǎo)入
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.s3.S3Client; import java.time.Duration;
代碼
// Create an AwsCrtHttpClient shared instance. SdkHttpClient crtHttpClient = AwsCrtHttpClient.builder() .connectionTimeout(Duration.ofSeconds(3)) .maxConcurrency(100) .build(); // Singletons: Use the s3Client and dynamoDbClient for all requests. S3Client s3Client = S3Client.builder() .httpClient(crtHttpClient) .credentialsProvider(EnvironmentVariableCredentialsProvider.crea .defaultsMode(DefaultsMode.IN_REGION) .region(Region.US_EAST_1) .build(); DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(crtHttpClient) .credentialsProvider(EnvironmentVariableCredentialsProvider.crea .defaultsMode(DefaultsMode.IN_REGION) .region(Region.US_EAST_1) .build(); // Requests completed: Close all service clients. s3Client.close(); dynamoDbClient.close(); crtHttpClient.close(); // Explicitly close crtHttpClient.
將基于 AWS CRT 的 HTTP 客戶端設(shè)置為默認(rèn)客戶端
您可以設(shè)置 Maven 構(gòu)建文件,讓 SDK 使用基于 AWS CRT 的 HTTP 客戶端作為服務(wù)客戶端的默認(rèn) HTTP 客戶端。
為此,您可以向每個(gè)服務(wù)客戶端構(gòu)件添加一個(gè)具有默認(rèn) HTTP 客戶端依賴項(xiàng)的?exclusions
?元素。
在以下?pom.xml
?示例中,SDK 將基于 AWS CRT 的 HTTP 客戶端用于 S3 服務(wù)。如果您的代碼中的服務(wù)客戶端是?S3AsyncClient
,則 SDK 使用?AwsCrtAsyncHttpClient
。如果服務(wù)客戶端是 S3Client,則 SDK 使用?AwsCrtHttpClient
。在此設(shè)置下,默認(rèn)的基于 Netty 的異步 HTTP 客戶端和默認(rèn)的基于 Apache 的同步 HTTP 不可用。
<project> <properties> <aws.sdk.version>
VERSION
</aws.sdk.version> </properties> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>${aws.sdk.version}</version> <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> </dependencies> </project>
請(qǐng)?jiān)L問(wèn) Maven Central 存儲(chǔ)庫(kù)以獲取最新的?VERSION?值。
注意
如果在一個(gè)?pom.xml
?文件中聲明了多個(gè)服務(wù)客戶端,則所有服務(wù)客戶端都需要?exclusions
?XML 元素。
使用 Java 系統(tǒng)屬性
要使用基于 AWS CRT 的 HTTP 客戶端作為應(yīng)用程序的默認(rèn) HTTP 客戶端,可以將 Java 系統(tǒng)屬性?software.amazon.awssdk.http.async.service.impl
?的值設(shè)置為?software.amazon.awssdk.http.crt.AwsCrtSdkHttpService
。
要在應(yīng)用程序啟動(dòng)期間設(shè)置,請(qǐng)運(yùn)行類似以下示例的命令。
java app.jar -Dsoftware.amazon.awssdk.http.async.service.impl=\ software.amazon.awssdk.http.crt.AwsCrtSdkHttpService
然后使用以下代碼段在應(yīng)用程序代碼中設(shè)置系統(tǒng)屬性。
System.setProperty("software.amazon.awssdk.http.async.service.impl", "software.amazon.awssdk.http.crt.AwsCrtSdkHttpService");
注意
當(dāng)您使用系統(tǒng)屬性配置基于 AWS CRT 的 HTTP 客戶端的使用時(shí),需要在?poml.xml
?文件中向?aws-crt-client
?構(gòu)件添加依賴項(xiàng)。
基于 AWS CRT 的 HTTP 客戶端的高級(jí)配置
您可以使用基于 AWS CRT 的 HTTP 客戶端的各種配置設(shè)置,包括連接運(yùn)行狀況配置和最大空閑時(shí)間。您可以查看適用于?AwsCrtAsyncHttpClient
?的可用配置選項(xiàng)。您可以為?AwsCrtHttpClient
?配置相同的選項(xiàng)。
連接運(yùn)行狀況配置
您可以使用 HTTP 客戶端生成器上的?connectionHealthConfiguration
?方法為基于 AWS CRT 的 HTTP 客戶端配置連接運(yùn)行狀況配置。
以下示例創(chuàng)建了一個(gè) S3 服務(wù)客戶端,該客戶端使用基于 AWS CRT 的 HTTP 客戶端實(shí)例,配置了連接運(yùn)行狀況配置和連接最大空閑時(shí)間。
- Synchronous client
- Asynchronous client
導(dǎo)入
import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.services.s3.S3Client; import java.time.Duration;
代碼
// Singleton: Use the s3Client for all requests. S3Client s3Client = S3Client.builder() .httpClientBuilder(AwsCrtHttpClient .builder() .connectionHealthConfiguration(builder -> builder .minimumThroughputInBps(32000L) .minimumThroughputTimeout(Duration.ofSeconds(3))) .connectionMaxIdleTime(Duration.ofSeconds(5))) .build(); // Perform work with s3Client. // Requests complete: Close the service client. s3Client.close();
HTTP/2 支持
基于 AWS CRT 的 HTTP 客戶端尚不支持 HTTP/2 協(xié)議,但計(jì)劃在將來(lái)的版本中推出該支持。
在現(xiàn)階段,如果您使用的是需要 HTTP/2 支持的服務(wù)客戶端,例如?KinesisAsyncClient?或?TranscribeStreamingAsyncClient,可以考慮改用?NettyNioAsyncHttpClient。
代理配置示例
以下代碼段顯示了如何使用?ProxyConfiguration.Builder?在代碼中配置代理設(shè)置。
- Synchronous client
- Asynchronous client
導(dǎo)入
import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.http.crt.ProxyConfiguration;
代碼
SdkHttpClient crtHttpClient = AwsCrtHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .scheme("https") .host("myproxy") .port(1234) .username("username") .password("password") .build()) .build();
以下命令行片段顯示了代理配置的等效 Java 系統(tǒng)屬性。
$ java -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=1234 -Dhttps.proxyUser=username \ -Dhttps.proxyPassword=password -cp ... App
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-832296.html
重要
要使用任何 HTTPS 代理系統(tǒng)屬性,必須在代碼中將?scheme
?屬性設(shè)置為?https
。如果未在代碼中設(shè)置 scheme 屬性,則架構(gòu)默認(rèn)為 HTTP,SDK 僅查找?http.*
?系統(tǒng)屬性。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-832296.html
到了這里,關(guān)于配置基于 AWS CRT 的 HTTP 客戶端的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!