起因
UOS系统
上部署http服务, consul 健康检查 时不时报错
operation not permitted
其他系统没有这个问题
consul 和 服务在同一台机器
现象
- 远程访问服务,没有发现服务有不可用的情况
- 注册http://baidu.com 作为健康检查http 到consul上,没有发生报错情况
- 注册 其他系统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 是做什么用的,这个现象的原因,有没有大佬能解答下
有疑问加站长微信联系(非本文作者)
