请教一下,关于net.Dialer 参数DualStack

colin321 · 2021-12-09 09:45:01 · 2305 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-12-09 09:45:01 的主题,其中的信息可能已经有所发展或是发生改变。

起因

UOS系统 上部署http服务, consul 健康检查 时不时报错 operation not permitted 其他系统没有这个问题

consul 和 服务在同一台机器

现象

  1. 远程访问服务,没有发现服务有不可用的情况
  2. 注册http://baidu.com 作为健康检查http 到consul上,没有发生报错情况
  3. 注册 其他系统windows,center os的服务,以ip:port方式访问,也会时不时报错

问题解决

通过查看consul源码,发现它使用了github.com/hashicorp/go-cleanhttp, transport是这样设置的

func DefaultPooledTransport() *http.Transport {
    transport := &http.Transport{
        Proxy: http.ProxyFromEnvironment,
        DialContext: (&net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
            DualStack: true,
        }).DialContext,
        MaxIdleConns:          100,
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
        ForceAttemptHTTP2:     true,
        MaxIdleConnsPerHost:   runtime.GOMAXPROCS(0) + 1,
    }
    return transport
}

golang 1.17版本的默认 transport是这样的

var DefaultTransport RoundTripper = &Transport{
    Proxy: ProxyFromEnvironment,
    DialContext: (&net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
    }).DialContext,
    ForceAttemptHTTP2:     true,
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    TLSHandshakeTimeout:   10 * time.Second,
    ExpectContinueTimeout: 1 * time.Second,
}

然后,我加上了这个参数DualStack: true 本地请求服务器, 没有什么问题, 当把这个客户端放在服务器上跑时,跟consul同样的情况就发生了。

最后注释这行代码,重新编译,问题没有再次出现

我的问题

net.Dialer 参数DualStack 是做什么用的,这个现象的原因,有没有大佬能解答下


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2305 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传