Golang中go get遇到连接被重置的问题如何解决

Golang中go get遇到连接被重置的问题如何解决 你好,我在两个节点上遇到了问题。它们唯一的共同点是都是 ThunderX2 架构。这个命令在其他地方对其他人似乎是有效的,我在其他地方使用也正常。所以,对于任何“go get”命令,我都会遇到类似下面的错误。

$ go get -u golang.org/x/net/http2
go get: module golang.org/x/net/http2: Get "https://proxy.golang.org/golang.org/x/net/http2/@v/list": read tcp 130.245.191.178:52532->172.217.15.81:443: read: connection reset by peer

有人知道如何调试这个问题,或者问题出在哪里吗?先谢谢了。


更多关于Golang中go get遇到连接被重置的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

这个问题从 1.16 版本开始出现。

更多关于Golang中go get遇到连接被重置的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个问题通常是由于网络连接问题导致的,特别是当你的网络环境对某些IP地址或端口有特殊限制时。以下是几种可能的解决方案:

1. 设置GOPROXY环境变量

使用国内的代理镜像可以解决连接问题:

# 设置GOPROXY使用国内镜像
export GOPROXY=https://goproxy.cn,direct
# 或者使用官方代理
export GOPROXY=https://proxy.golang.org,direct

# 然后重试go get命令
go get -u golang.org/x/net/http2

2. 使用GOPRIVATE绕过代理

如果模块是私有仓库,可以设置GOPRIVATE:

export GOPRIVATE=golang.org/x/net
export GOPROXY=https://goproxy.cn,direct
go get -u golang.org/x/net/http2

3. 检查网络连接和防火墙

验证网络连接是否正常:

// 可以创建一个简单的测试程序来检查连接
package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := &http.Client{
        Timeout: 10 * time.Second,
    }
    
    resp, err := client.Get("https://proxy.golang.org")
    if err != nil {
        fmt.Printf("连接错误: %v\n", err)
        return
    }
    defer resp.Body.Close()
    
    fmt.Printf("连接成功: %s\n", resp.Status)
}

4. 使用go mod vendor离线模式

如果网络问题持续存在,可以考虑使用vendor模式:

# 初始化mod
go mod init your-module-name

# 创建vendor目录
go mod vendor

# 设置使用vendor
go mod tidy

5. 检查系统DNS配置

DNS解析问题也可能导致连接重置:

# 检查DNS解析
nslookup proxy.golang.org
nslookup golang.org

# 尝试使用其他DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

6. 使用go get的-insecure标志(不推荐用于生产)

仅用于测试目的:

export GOINSECURE=golang.org/x/net
go get -u golang.org/x/net/http2

7. 完整的解决方案示例

创建一个脚本文件解决此问题:

#!/bin/bash
# fix_go_get.sh

# 设置代理
export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=sum.golang.google.cn

# 设置超时
export GO111MODULE=on

# 执行go get
go get -v -u golang.org/x/net/http2

对于ThunderX2架构,还需要确保系统时间同步,因为TLS证书验证对时间敏感:

# 同步时间
sudo ntpdate pool.ntp.org

运行脚本:

chmod +x fix_go_get.sh
./fix_go_get.sh

如果问题仍然存在,可能是ThunderX2架构特定的网络驱动或内核问题,需要检查系统日志:

dmesg | grep -i tcp
sudo journalctl -f
回到顶部