Go初始化Http Client

姊妹篇:

Http Requests Header

Go初始化Http Client

Go使用自定义Http Client


MaxIdleConnsPerHost

1
2
3
// DefaultMaxIdleConnsPerHost is the default value of Transport's
// MaxIdleConnsPerHost.
const DefaultMaxIdleConnsPerHost = 2

如果有设置keep-alive,即长连接。当请求结束后,会保留这么多个以备后用

transport实现了RoundTripper接口,该接口只有一个方法RoundTrip(),故transport的入口函数就是RoundTrip()。transport的主要功能其实就是缓存了长连接,用于大量http请求场景下的连接复用,减少发送请求时TCP(TLS)连接建立的时间损耗,同时transport还能对连接做一些限制,如连接超时时间,每个host的最大连接数等。transport对长连接的缓存和控制仅限于TCP+(TLS)+HTTP1,不对HTTP2做缓存和限制。

https://www.cnblogs.com/charlieroro/p/11409153.html

https://blog.csdn.net/asd1126163471/article/details/112914501

https://blog.csdn.net/kdpujie/article/details/73177179

https://yexingzhe54.github.io/passages/golang-http-client-time-wait/

https://studygolang.com/articles/28263

https://javamana.com/2021/05/20210507204225735M.html

https://duyanghao.github.io/http-transport/

golang http1 http2

https://www.google.com.hk/search?q=golang+http1+http2&newwindow=1&sxsrf=ALiCzsZhwStxLC3PcpsFXJFwQsfGwSH5zg%3A1652186494841&ei=fl16Yo-BM-rX2roPwtqFyAQ&ved=0ahUKEwiPuIKp-tT3AhXqq1YBHUJtAUkQ4dUDCA4&uact=5&oq=golang+http1+http2&gs_lcp=Cgdnd3Mtd2l6EAMyBQghEKABOgcIABBHELADOgcIIxDqAhAnOgQIIxAnOgQIABBDOgoILhDHARDRAxBDOgUIABCABDoLCC4QgAQQxwEQ0QM6BggAEAgQHjoHCCEQChCgAUoECEEYAEoECEYYAFDQA1j0TGCWTmgHcAF4AIABugGIAfYWkgEEMy4yMJgBAKABAbABCsgBCsABAQ&sclient=gws-wiz

https://www.jianshu.com/p/23e68a9c4602

https://segmentfault.com/a/1190000037438011

https://www.infoq.cn/article/vibfhhmpf7hmnnw4fhrx

https://juejin.cn/post/6844903626280812551

https://tomjamescn.github.io/post/2020-05-22-golang-http-transport-disable-http2/


Go如何初始化Http Client?MaxIdleConnsPerHost参数有何作用?keep-alive如何设置?有何作用

在Go中初始化HTTP客户端主要是通过http.Client结构体来完成的。http.Client具有多个字段,允许你定制客户端的行为,比如设置超时时间、代理、头信息等。其中,MaxIdleConnsPerHosthttp.Transport结构体中的一个字段,用于控制每个主机保持空闲状态的最大连接数。keep-alive是一种HTTP连接重用的机制,用于减少建立和关闭连接的开销。

初始化HTTP客户端

以下是一个初始化自定义HTTP客户端的基本示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

import (
"net/http"
"time"
)

func main() {
// 创建一个http.Client实例
client := &http.Client{
// 自定义Transport
Transport: &http.Transport{
// 每个主机的最大空闲连接数
MaxIdleConnsPerHost: 10,
},
// 设置超时时间
Timeout: 30 * time.Second,
}

// 使用自定义客户端发起请求
resp, err := client.Get("http://example.com")
if err != nil {
// 处理错误
}
defer resp.Body.Close()

// 处理响应
}

MaxIdleConnsPerHost

MaxIdleConnsPerHost设置每个主机的最大空闲连接数。这对于控制与给定主机的并发连接数非常有用。较高的值可以提高性能,尤其是在高负载时,因为它减少了建立新连接的需要。但是,它也会占用更多资源,因为空闲连接保持打开状态。

Keep-Alive设置

keep-alive功能通常是通过http.Transport中的字段来控制的。默认情况下,Go的HTTP客户端已启用keep-alive。要调整keep-alive行为,可以设置http.Transport中的IdleConnTimeout字段,它定义了空闲连接在被关闭之前保持空闲状态的最长时间。

1
2
3
4
5
client := &http.Client{
Transport: &http.Transport{
IdleConnTimeout: 90 * time.Second,
},
}

在上述代码中,IdleConnTimeout设置为90秒,这意味着在空闲90秒后,即使连接处于keep-alive状态,也会被关闭。

作用

  • MaxIdleConnsPerHost:通过复用空闲连接,可以减少TCP握手的时间和开销,提高HTTP请求的性能。
  • Keep-Alive:使得多个HTTP请求可以复用同一个TCP连接,减少了因为频繁建立和关闭连接而带来的延迟和资源消耗,对于提升Web应用或API客户端的性能特别有帮助。