기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS CRT 기반 HTTP 클라이언트 구성
AWS CRT 기반 HTTP 클라이언트에는 동기 AwsCrtHttpClient
-
더 빠른 SDK 시작 시간
-
더 작은 메모리 공간
-
대기 시간 단축
-
연결 상태 관리
-
DNS 로드 밸런싱
AWS SDK의 CRT 기반 구성 요소
이 주제에 설명된 AWS CRT 기반 HTTP 클라이언트와 AWS CRT 기반 S3 클라이언트는 SDK의 서로 다른 구성 요소입니다.
동기식 및 비동기식 AWS CRT 기반 HTTP 클라이언트는 SDK HTTP 클라이언트 인터페이스를 구현한 것으로, 일반적인 HTTP 통신에 사용됩니다. SDK의 다른 동기 또는 비동기 HTTP 클라이언트에 대한 대안으로 추가적인 이점이 있습니다.
AWS CRT 기반 S3 클라이언트는 S3AsyncClientS3AsyncClient
인터페이스의 Java 기반 구현의 대안이며 여러 가지 이점을 제공합니다.
두 구성 요소 모두 AWS Common Runtime의 라이브러리를 사용하지만 AWS CRT 기반 HTTP 클라이언트는 aws-c-s3 라이브러리
AWS CRT 기반 HTTP 클라이언트 액세스
AWS CRT 기반 HTTP 클라이언트를 사용하려면 먼저 최소 버전이 2.22.0인 aws-crt-client
아티팩트를 프로젝트의 종속성에 추가합니다.
다음 옵션 중 하나를 사용하여 Maven pom.xml
파일을 설정합니다.
참고
애플리케이션이 AWS Lambda 함수에서 실행되는 경우와 같이 런타임 종속성의 크기를 더 작게 유지해야 하는 경우 플랫폼별 jar 옵션을 사용하도록 선택할 수 있습니다.
기본적으로는 Linux, Windows 및 macOS를 비롯한 여러 플랫폼의 바이너리가 포함된 AWS CRT 아티팩트의 uber-jar를 aws-crt-client
사용합니다.
<project>
<properties>
<aws.sdk.java.version>2.29.10*
</aws.sdk.java.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>
*빨간색으로 표시된 버전을 사용하려는 Java SDK 버전으로 바꿉니다. Maven Central
AWS CRT 기반 HTTP 클라이언트 사용 및 구성
서비스 클라이언트 빌드와 함께 AWS CRT 기반 HTTP 클라이언트를 구성하거나 여러 서비스 클라이언트 간에 공유하도록 단일 인스턴스를 구성할 수 있습니다.
어느 접근 방식이든 빌더를 사용하여 AWS CRT 기반 HTTP 클라이언트 인스턴스의 속성을 구성합니다
모범 사례: 서비스 클라이언트 전용 인스턴스 지정
AWS CRT 기반 HTTP 클라이언트의 인스턴스를 구성해야 하는 경우 서비스 클라이언트와 함께 빌드하여 인스턴스를 전용으로 사용하는 것이 좋습니다. 서비스 클라이언트 빌더의 httpClientBuilder
메서드를 사용하면 됩니다. 이렇게 하면 HTTP 클라이언트의 수명 주기가 SDK에 의해 관리되므로 AWS CRT 기반 HTTP 클라이언트 인스턴스가 더 이상 필요하지 않을 때 닫히지 않을 경우 메모리 누수를 방지할 수 있습니다.
다음 예제에서는 S3 서비스 클라이언트를 생성하고 connectionTimeout
및 maxConcurrency
값으로 AWS CRT 기반 HTTP 클라이언트를 구성합니다.
가져오기
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();
대안 접근 방식: 인스턴스 공유
애플리케이션의 리소스 및 메모리 사용량을 낮게 유지하기 위해 AWS CRT 기반 HTTP 클라이언트를 구성하고 여러 서비스 클라이언트에서 공유할 수 있습니다. HTTP 연결 풀이 공유되므로 리소스 사용량이 줄어듭니다.
참고
AWS CRT 기반 HTTP 클라이언트 인스턴스가 공유되면 폐기할 준비가 되면 인스턴스를 닫아야 합니다. SDK는 서비스 클라이언트가 닫힐 때 인스턴스를 닫지 않습니다.
다음 예제에서는 connectionTimeout
및 maxConcurrency
값을 사용하여 AWS CRT 기반 HTTP 클라이언트 인스턴스를 구성합니다. 구성된 인스턴스는 각 서비스 클라이언트 빌더의 httpClient
메서드로 전달됩니다. 서비스 클라이언트와 HTTP 클라이언트가 더 이상 필요하지 않으면 명시적으로 닫힙니다. HTTP 클라이언트가 마지막으로 닫힙니다.
가져오기
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 클라이언트를 기본값으로 설정
SDK가 AWS CRT 기반 HTTP 클라이언트를 서비스 클라이언트의 기본 HTTP 클라이언트로 사용하도록 Maven 빌드 파일을 설정할 수 있습니다.
이렇게 하려면 각 서비스 클라이언트 아티팩트에 기본 HTTP 클라이언트 종속성이 있는 exclusions
요소를 추가하면 됩니다.
다음 pom.xml
예제에서 SDK는 S3 서비스에 AWS CRT 기반 HTTP 클라이언트를 사용합니다. 코드의 서비스 클라이언트가 S3AsyncClient
인 경우, SDK는 AwsCrtAsyncHttpClient
를 사용합니다. 서비스 클라이언트가 S3Client인 경우 SDK는 AwsCrtHttpClient
를 사용합니다. 이 설정에서는 기본 Netty 기반 비동기 HTTP 클라이언트와 기본 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>
최신 VERSION
참고
여러 서비스 클라이언트가 pom.xml
파일에 선언되어 있는 경우 모두 exclusions
XML 요소가 필요합니다.
Java 시스템 속성 사용
AWS CRT 기반 HTTP 클라이언트를 애플리케이션의 기본 HTTP로 사용하려면 Java 시스템 속성을 software.amazon.awssdk.http.async.service.impl
값으로 설정할 수 있습니다software.amazon.awssdk.http.crt.AwsCrtSdkHttpService
.
애플리케이션 시작 중에 설정하려면 다음과 유사한 명령을 실행하세요.
java app.jar -Dsoftware.amazon.awssdk.http.async.service.impl=\ software.amazon.awssdk.http.crt.AwsCrtSdkHttpService
다음 코드 조각을 사용하여 애플리케이션 코드에서 시스템 속성을 설정합니다.
System.setProperty("software.amazon.awssdk.http.async.service.impl",
"software.amazon.awssdk.http.crt.AwsCrtSdkHttpService");
참고
시스템 속성을 사용하여 AWS CRT 기반 HTTP 클라이언트 사용을 구성할 때는 poml.xml
파일의 aws-crt-client
아티팩트에 대한 종속성을 추가해야 합니다.
AWS CRT 기반 HTTP 클라이언트의 고급 구성
연결 상태 구성 및 최대 유휴 시간을 포함하여 AWS CRT 기반 HTTP 클라이언트의 다양한 구성 설정을 사용할 수 있습니다. AwsCrtAsyncHttpClient
에서 사용할 수 있는 구성 옵션AwsCrtHttpClient
에 사용할 수 있는 구성 옵션을 검토할 수 있습니다.
연결 상태 구성
HTTP 클라이언트 빌더의 connectionHealthConfiguration
메서드를 사용하여 AWS CRT 기반 HTTP 클라이언트에 대한 연결 상태 구성을 구성할 수 있습니다.
다음 예제에서는 연결 상태 구성으로 구성된 AWS CRT 기반 HTTP 클라이언트 인스턴스와 연결의 최대 유휴 시간을 사용하는 S3 서비스 클라이언트를 생성합니다.
가져오기
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 지원
HTTP/2 프로토콜은 아직 AWS CRT 기반 HTTP 클라이언트에서 지원되지 않지만 향후 릴리스에 계획되어 있습니다.
그동안 KinesisAsyncClient
프록시 구성 예제
다음 코드 조각은 코드에서 프록시 설정을 구성하는 데 사용하는 ProxyConfiguration.Builder
가져오기
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")
.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 crtAsyncHttpClient = AwsCrtAsyncHttpClient.builder()
.proxyConfiguration(ProxyConfiguration.builder()
.scheme("https")
.useSystemPropertyValues(Boolean.FALSE)
.build())
.build();
// Run the application.
// $ java -cp ... App