自定义 HTTP 客户端 - AWS SDK for Go v2

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自定义 HTTP 客户端

AWS SDK for Go 使用具有默认配置值的默认 HTTP 客户端。尽管您可以更改其中的一些配置值,但对于在具有高吞吐量和低延迟要求的环境中使用AWS SDK for Go 的客户而言,默认的 HTTP 客户端和传输并未充分配置。有关更多信息,请参阅常见问题,因为配置建议因具体工作负载而异。本节介绍如何配置自定义 HTTP 客户端,以及如何使用该客户端创建AWS SDK for Go 调用。

为了帮助您创建自定义 HTTP 客户端,本节介绍如何使用 NewBuildableClient 配置自定义设置,以及如何将该客户端与AWS SDK for Go 服务客户端结合使用。

我们来确定要自定义的内容。

在配置加载期间覆盖

调用 LoadDefaultConfig 时,可以提供自定义 HTTP 客户端,方法是使用 WithHTTPClient 包装客户端并将结果值传递给 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 提供了一种生成器机制,用于使用修改后的传输选项来构造客户端。

配置代理

如果无法直接连接到互联网,可以使用 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) })

其他设置

以下是一些其他 Transport 设置,可以修改这些设置以调整 HTTP 客户端。此处未描述的任何其他设置均可在传输类型文档中找到。可按以下示例所示应用这些设置:

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

如果请求有“Expect: 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