Netty 기반 HTTP 클라이언트를 구성 - AWS SDK for Java 2.x

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Netty 기반 HTTP 클라이언트를 구성

에서 비동기 작업을 위한 기본 HTTP 클라이언트는 Netty AWS SDK for Java 2.x 기반입니다. 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.17.290</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 아티팩트에 대한 종속성을 추가해야 합니다.

NettyNioAsyncHttpClient를 구성하려면 다음 Maven pom.xml 파일 예제를 참조하세요.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.17.290</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 메서드를 사용하면 됩니다. 이렇게 하면 SDK에서 HTTP 클라이언트의 수명 주기를 관리하므로 더 이상 필요하지 않을 때 NettyNioAsyncHttpClient 인스턴스를 종료하지 않을 경우 잠재적인 메모리 누수를 방지할 수 있습니다.

다음 예시에서는 DynamoDbEnhancedAsyncClient 인스턴스에서 사용되는 DynamoDbAsyncClient 인스턴스를 만듭니다. DynamoDbAsyncClient 인스턴스에는 connectionTimeoutmaxConcurrency 값이 있는 NettyNioAsyncHttpClient 인스턴스가 포함됩니다. HTTP 인스턴스는 DynamoDbAsyncClient.BuilderhttpClientBuilder 메서드를 사용하여 생성됩니다.

가져오기

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는 서비스 클라이언트가 닫힐 때 인스턴스를 닫지 않습니다.

다음 예제는 두 서비스 클라이언트가 사용하는 Netty 기반 HTTP 클라이언트를 구성합니다. 구성된 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로 기본 설정되며 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