Go HTTP客户端MaxConnsPerHost等参数中Host指代域名还是IP?
Go net/http连接池参数中「Host」的准确指代
核心结论
net/http标准库中MaxConnsPerHost、MaxIdleConnsPerHost两个参数里提到的Host,既不是单纯指代域名,也不是指代DNS解析后的实际IP,而是以你发起请求时URL中携带的host字段+对应端口作为唯一判定维度。
具体判定规则
- 若请求URL里的host是域名,会自动补全对应协议的默认端口(HTTPS补443、HTTP补80)作为统计key,不管这个域名最终解析到多少个后端IP,所有发往这些IP的连接都共用这个host维度的连接配额。比如请求
https://yahoo.com下的所有资源,不管后端实际连到雅虎哪台CDN节点IP,连接数都受yahoo.com:443对应的配额限制。 - 若请求URL里直接写IP地址,就以「IP+端口」作为统计key,单独计算配额。比如请求
http://127.0.0.1:9090/metrics,配额只对应该IP+端口的连接。 - 如果你自定义了
Transport的DialContext方法,手动修改了实际连接的目标地址、做了特殊转发或者自定义域名解析,配额统计不会跟着实际连接的IP变化,依然以原始请求URL里的host+端口为准。比如你请求https://service-a.com,在拨号逻辑里把流量转到了内网IP10.0.0.12,这条连接还是会被算在service-a.com:443的配额下,不会占用10.0.0.12:443的配额。
常见踩坑提示:同一个域名如果对应不同端口,会被识别为两个独立的Host统计维度,连接配额互不共享。比如
http://demo.com:8080和http://demo.com:8081的连接数限制是分开计算的。
内容的提问来源于stack exchange,提问作者PerfectCompanion Me
相关产品推荐
相关产品推荐

