#### 起因
`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 是做什么用的,这个现象的原因,有没有大佬能解答下
有疑问加站长微信联系(非本文作者)