

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 Netty 型 HTTP 用戶端
<a name="http-configuration-netty"></a>

中非同步操作的預設 HTTP 用戶端 AWS SDK for Java 2.x 是 Netty 型 [NettyNioAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html)。Netty 型用戶端是以 [Netty 專案](https://netty.io/)的非同步事件驅動型網路架構為基礎。

做為替代 HTTP 用戶端，您可以使用新的 [AWS CRT 型 HTTP 用戶端](http-configuration-crt.md)。本主題說明如何設定 `NettyNioAsyncHttpClient`。

## 存取 `NettyNioAsyncHttpClient`
<a name="http-config-netty-access"></a>

在大多數情況下，您會在非同步程式中使用 ，`NettyNioAsyncHttpClient`而不需要任何明確的組態。您宣告非同步服務用戶端，開發套件會為您設定`NettyNioAsyncHttpClient`標準值的 。

如果您想要明確設定 `NettyNioAsyncHttpClient` 或將其與多個服務用戶端搭配使用，則需要將其用於組態。

### 不需要組態
<a name="http-config-netty-no-config"></a>

當您在 Maven 中宣告對服務用戶端的相依性時，軟體開發套件會新增對`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`庫僅位於執行時間 classpath 上。

### 需要的配置
<a name="http-config-netty-yes-config"></a>

若要設定 `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`
<a name="http-netty-config"></a>

您可以設定 執行個體`NettyNioAsyncHttpClient`以及建置服務用戶端，也可以設定單一執行個體以在多個服務用戶端之間共用。

透過任一方法，您可以使用 [NettyNioAsyncHttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.Builder.html) 來設定 Netty 型 HTTP 用戶端執行個體的屬性。

### 最佳實務：將`NettyNioAsyncHttpClient`執行個體專用於服務用戶端
<a name="http-config-netty-one-client"></a>

如果您需要設定 的執行個體`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`執行個體
<a name="http-config-netty-multi-clients"></a>

為了協助降低應用程式的資源和記憶體用量，您可以設定 ，`NettyNioAsyncHttpClient`並在多個服務用戶端之間共用。HTTP 連線集區將共用，這會降低資源用量。

**注意**  
共用`NettyNioAsyncHttpClient`執行個體時，您必須在準備好進行處置時將其關閉。當服務用戶端關閉時，軟體開發套件不會關閉執行個體。

下列範例會設定兩個服務用戶端所使用的 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;
```

 **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.
```

## 設定 ALPN 通訊協定交涉
<a name="http-netty-config-alpn"></a>

ALPN (Application-Layer Protocol Negotiation) 是一種 TLS 延伸模組，可讓應用程式層交涉應透過安全連線執行的通訊協定，以避免額外的往返並提供更好的效能。

若要讓 Netty 型 HTTP 用戶端使用 ALPN，請呼叫建置器方法，如下列程式碼片段所示：

```
import software.amazon.awssdk.http.Protocol;
import software.amazon.awssdk.http.ProtocolNegotiation;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
import software.amazon.awssdk.services.transcribestreaming.TranscribeStreamingAsyncClient;


// Configure the Netty-based HTTP client to use the ALPN protocol.
SdkAsyncHttpClient nettyClient = NettyNioAsyncHttpClient.builder()
                                                        .protocol(Protocol.HTTP2)
                                                        .protocolNegotiation(ProtocolNegotiation.ALPN)
                                                        .build();
// Use the Netty-based HTTP client with a service client.
TranscribeStreamingAsyncClient transcribeClient = TranscribeStreamingAsyncClient.builder()
                                                                                .httpClient(nettyClient)
                                                                                .build();
```

ALPN 通訊協定交涉目前僅適用於 HTTP/2 通訊協定，如上一個程式碼片段所示。

## Proxy 組態範例
<a name="http-config-netty-proxy-ex"></a>

下列程式碼片段使用 [Netty HTTP 用戶端的代理組態建置器](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/ProxyConfiguration.Builder.html)。

```
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，開發套件只會尋找`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
```