自訂 HTTP 用戶端 - 適用於 Go 的 AWS SDK v2

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

自訂 HTTP 用戶端

適用於 Go 的 AWS SDK 使用具有預設組態值的預設 HTTP 用戶端。雖然您可以變更其中一些組態值,但在具有高輸送量和低延遲需求的環境中,使用 適用於 Go 的 AWS SDK 的客戶預設 HTTP 用戶端和傳輸並未充分設定。如需詳細資訊,請參閱,常見問答集因為組態建議會因特定工作負載而有所不同。本節說明如何設定自訂 HTTP 用戶端,並使用該用戶端來建立 適用於 Go 的 AWS SDK 呼叫。

為了協助您建立自訂 HTTP 用戶端,本節說明如何使用 NewBuildableClient 來設定自訂設定,並搭配 適用於 Go 的 AWS SDK 服務用戶端使用該用戶端。

讓我們定義要自訂的內容。

在組態載入期間覆寫

呼叫 LoadDefaultConfig 時,可以使用 WithHTTPClient 包裝用戶端並將產生的值傳遞給 ,以提供自訂 HTTP 用戶端LoadDefaultConfig。例如,若要以用戶端customClient身分傳遞:

cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithHTTPClient(customClient))

逾時

BuildableHTTPClient 可以設定請求逾時限制。此逾時包含連線、處理任何重新導向以及讀取完整回應內文的時間。例如,若要修改用戶端逾時:

import "github.com/aws/aws-sdk-go-v2/aws/transport/http" // ... httpClient := http.NewBuildableClient().WithTimeout(time.Second*5)

撥號程式

BuildableHTTPClient 提供建置器機制,用於建構具有修改撥號器選項的用戶端。下列範例示範如何設定用戶端Dialer設定。

import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" import "net" // ... httpClient := awshttp.NewBuildableClient().WithDialerOptions(func(d *net.Dialer) { d.KeepAlive = -1 d.Timeout = time.Millisecond*500 })

設定

Dialer.KeepAlive

此設定代表作用中網路連線的持續作用期間。

設定為負值以停用保持連線。

如果通訊協定和作業系統支援,請將 設為 0 以啟用保持連線。

不支援保持連線的網路通訊協定或作業系統會忽略此欄位。根據預設,TCP 會啟用保持運作。

請參閱 https://golang.org/pkg/net/#Dialer.KeepAlive

KeepAlive 設定為 time.Duration

Dialer.Timeout

此設定代表撥號等待建立連線的時間上限。

預設為 30 秒。

請參閱 https://golang.org/pkg/net/#Dialer.Timeout

Timeout 設定為 time.Duration

傳輸

BuildableHTTPClient 提供建置器機制,以建構具有修改傳輸選項的用戶端。

設定 Proxy

如果您無法直接連線至網際網路,您可以使用 Go 支援的環境變數 (HTTP_PROXY/HTTPS_PROXY) 或建立自訂 HTTP 用戶端來設定代理。下列範例會將用戶端設定為使用 PROXY_URL做為代理端點:

import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" import "net/http" // ... httpClient := awshttp.NewBuildableClient().WithTransportOptions(func(tr *http.Transport) { proxyURL, err := url.Parse("PROXY_URL") if err != nil { log.Fatal(err) } tr.Proxy = http.ProxyURL(proxyURL) })

其他設定

以下是可以修改以調整 HTTP 用戶端的幾個其他Transport設定。您可以在傳輸類型文件中找到此處未描述的任何其他設定。這些設定可以套用,如下列範例所示:

import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" import "net/http" // ... httpClient := awshttp.NewBuildableClient().WithTransportOptions(func(tr *http.Transport) { tr.ExpectContinueTimeout = 0 tr.MaxIdleConns = 10 })

Transport.ExpectContinueTimeout

如果請求具有「預期:100-continue」標頭,則此設定代表完整寫入請求標頭後等待伺服器第一個回應標頭的時間上限,此時間不包含傳送請求標頭的時間。HTTP 用戶端會在此逾時結束後傳送其承載。

預設 1 秒。

設為 0 表示沒有逾時,並在不等待的情況下傳送請求承載。其中一個使用案例是,當您遇到代理或第三方服務的問題時,該問題會採用類似稍後在 函數中使用 Amazon S3 的工作階段。

請參閱 https://golang.org/pkg/net/http/#Transport.ExpectContinueTimeout

ExpectContinue 設定為 time.Duration

Transport.IdleConnTimeout

此設定代表 HTTP 請求之間保持閒置網路連線存活的時間上限。

設為 0 表示沒有限制。

請參閱 https://golang.org/pkg/net/http/#Transport.IdleConnTimeout

IdleConnTimeout 設定為 time.Duration

Transport.MaxIdleConns

此設定代表所有主機的閒置 (保持連線) 連線數目上限。提高此值的一個使用案例是當您在短時間內從相同用戶端看到許多連線時

0 表示沒有限制。

請參閱 https://golang.org/pkg/net/http/#Transport.MaxIdleConns

設定為MaxIdleConns int

Transport.MaxIdleConnsPerHost

此設定代表保持每個主機的閒置 (保持連線) 連線數目上限。提高此值的一個使用案例是當您在短時間內從相同用戶端看到許多連線時

預設為每個主機兩個閒置連線。

設為 0 以使用 DefaultMaxIdleConnsPerHost (2)。

請參閱 https://golang.org/pkg/net/http/#Transport.MaxIdleConnsPerHost

MaxIdleConnsPerHost 設定為 int

Transport.ResponseHeaderTimeout

此設定代表等待用戶端讀取回應標頭的時間上限。

如果用戶端無法在此持續時間內讀取回應的標頭,請求會失敗並出現逾時錯誤。

使用長時間執行的 Lambda 函數時,請小心設定此值,因為在 Lambda 函數完成或逾時之前,操作不會傳回任何回應標頭。不過,您仍可使用此選項搭配 ** InvokeAsync** API 操作。

預設為不逾時;請等待一段時間。

請參閱 https://golang.org/pkg/net/http/#Transport.ResponseHeaderTimeout

ResponseHeaderTimeout 設定為 time.Duration

Transport.TLSHandshakeTimeout

此設定代表等待 TLS 交握完成的時間上限。

預設為 10 秒。

零表示沒有逾時。

請參閱 https://golang.org/pkg/net/http/#Transport.TLSHandshakeTimeout

TLSHandshakeTimeout 設定為 time.Duration