前言

很多开发的小伙伴在工作中经常会遇到需要在内网环境下开发生产,因此就必须要解决内网环境下Go语言的包管理和包拉取问题。恰逢我现在公司就需要在内网环境下开发新项目,因此在此记录我们内网环境下Go module的包管理和包拉取解决方案,希望给予其他小伙伴有所借鉴。Go 语言在1.16 版本以后已经默认使用 Go Module 模式进行依赖包管理,而Go Module默认使用https://proxy.golang.org作为代理地址来拉取第三方包,但该地址需要能够访问互联网,另外还需要考虑到很多无法直接访问公共的包管理器,如GitHubGolang.orgGopkg.in等。

解决方案

在内网环境下,解决Go module的包管理和包拉取的常规解决方案主要有以下几种:

  1. 私有代理

在内网中,可以搭建私有的Go module代理服务来缓存、管理和拉取第三方包,以提高包的下载速度,同时解决内网环境下的拉包问题。常用的代理工具有GoproxyAthensNexus等。在搭建好私有代理后,可以设置GOPXOY环境变量来使用私有代理,例如:

$ export GOPROXY = http://172.31.33.33:8080
  1. Vender目录

可以在项目的根目录下创建vendor目录,将依赖的第三方包直接下载到该目录下。在使用go buildgo test等命令时,Go工具链会优先从vendor目录中查找所需的包。在项目根目录下执行以下命令,将当前模块的所有依赖包下载到vendor目录:

$ go mod vendor

需要注意的是,endor目录仅适用于项目内的依赖,如果依赖的包又依赖其他第三方包,则需要手动将这些包下载到vendor目录中。同时,如果vendor目录中存在多个版本的同一个包,则需要手动解决冲突。

  1. 将依赖包打包到二进制文件中

可以使用go1.16及以上版本的-embed标志,将项目依赖的第三方包打包到二进制文件中,避免在运行时需要依赖外部的包。该方式适用于将应用程序部署到多个环境中,或将应用程序分发给客户端。

$ go build -o app -tags embed -ldflag3="-w -s -extldflags=-static" -embed

以上几个就是在内网中进行Go module包管理和包拉取的解决方案,再结合我们实际开发场景,方案2会导致项目整理越来越大,不利于项目的管理、部署和维护,方案3则是只适合再部署时使用,并不能满足正常的工作开发中的需求场景,因此我们选择方案1,通过内部搭建一个私有的go module代理服务来解决内网环境下的拉包问题。

搭建私有go module代理服务

Go module proxy协议规范发布后,Go社区出现了很多成熟的Goproxy开源实现。从最初的athens,再到国内的两个优秀的开源实现:goproxygoproxy.io等。最终,在考虑到代理服务的部署及维护的方便程度上,我们选择了使用更为简单的goproxygoproxy.io来搭建私有go module代理服务。

代理服务搭建

goproxy搭建

  1. 创建goproxy文件夹,go mod初始化goproxy
$ go mod init goproxy
  1. 创建goproxy.go文件,监听本地代理端口,初始化goproxy代理:
package main

import (
"net/http" "github.com/goproxy/goproxy"
) func main() {
http.ListenAndServe("localhost:8080", &goproxy.Goproxy{})
}
  1. 修改GOPROXY环境变量,拉取goproxy服务依赖
$ go env -w GOPROXY=https://goproxy.cn,direct
  1. 拉取服务依赖,启动goproxy代理服务:
$ cd goproxy
$ go mod tidy
$ go run goproxy.go

goproxy.io搭建

  1. git clone拉取goproxy.io源码:
$ git clone git@github.com:goproxyio/goproxy.git
  1. 编译goproxy.io/goproxy下的main.go文件
$ cd goproxy.io/goproxy
$ make
  1. 命令行启动代理服务
# 直接启动
$ ./bin/goproxy -listen=0.0.0.0:8088 -cacheDir=./modCache -proxy https://goproxy.cn
# 或者已进程方式后台运行时,命令如下:
$ nohup ./bin/goproxy -listen=0.0.0.0:8088 -cacheDir=./modCache -proxy https://goproxy.cn &

代理服务使用及测试

搭建好私有代理服务后,我们就可以开始使用代理服务拉取第三方包了。使用go module代理服务很简单,通常情况下,我们都是使用对应的IDE工具来进行代码开发,直接在对应的IDE工具中为对应项目配置代理服务地址。以研发环境下GoLand为例,配置如下:

  1. 修改研发机golang环境变量GOPROXYGONOSUMDB
  • 修改GOPROXY环境变量,命令如下:
$ go env -w GOPROXY=http://172.31.31.31:2326,direct
  • 修改GONOSUMDB环境变量,命令如下:
$ go env -w GONOSUMDB=*

默认情况下,当我们执行go getgo mod tidy等命令需要下载模块时,它们会将模块版本和校验和发送到sum.golang.org进行验证,以确保安全性和数据完整性。但由于研发机环境无法连接到环境无法连接到sum.golang.org,因此应该跳过模块的校验和(checksum)验证。

而且,我们拉取的是代理服务器本地的缓存包,本来是已经在代理服务器上通过验证了,因此也可以保证其安全性和完成性。

  1. 配置GoLand中的GOPROXY环境变量;

点击Go Module,新增GOPROXY配置项,配置代理服务地址为上述GOPROXY地址。

  1. 在代理服务器上清空本地go module缓存,使用代理服务器重新拉取 GO 模块
$ go clean -modcache
$ go mod tidy
  1. 代理服务器拉包完成后,使用研发机拉取代理机上的包缓存即可
$ go mod tidy

针对同一个项目,通过分别配置goproxygoproxy.io代理服务地址进行测试,最终我们确定goproxy.io会比goproxy更加稳定一些,goproxy经常会以为网络问题出现部分丢包现象,因此我们确定使用goproxy.io来搭建go module私有代理服务。

注意:通过代理服务器拉取go mod,这种方式下,需要保证拉取的go mod依赖包与服务器缓存的依赖包版本一致,否则无法拉取依赖。

参考

私有化仓库的 GO 模块使用实践

小厂内部私有Go module拉取方案

goproxy.cn官方文档

goproxy.io官方文档

内网环境下Go module的包管理和包拉取解决方案的更多相关文章

  1. 内网环境下为Elasticsearch 5.0.2 添加head服务

    背景: 本项目的服务器是内网环境,没有网络,因此需要在离线的环境中,安装head服务. 需要用到的安装包有: node的安装包 elasticsearch的head插件源码 说明:此次只讲述为elas ...

  2. kali ms17_010 内网环境下渗透笔记

    一.先用Router Scan 扫描 看清楚了网络拓扑结构. 二.使用MS17-010批量扫描工具 下载:ms17-010Scan.exe  (也可以用kali自带的nmap和ms17-10模块扫) ...

  3. 虚拟机系统ubuntu12.04(内网环境下的虚拟主机)开启远程连接访问

    一.工具准备: 1.内网虚拟机Ubuntu12.04系统主机一台,开放端口为:29999 2.远程连接软件:mobaxterm 二.开启步骤: 1.查看端口状态信息: netstat -antl | ...

  4. 内网环境下搭建maven私服小技巧

    背景 最近接手一个其他公司的项目,因为工程中使用了maven,而且里面有很多他们自己封装很多自己的构件(就是jar.war等等),需要将他们maven私服迁移到我们的私服上去,因为网络环境不通,所以不 ...

  5. windows环境下本地项目(或gitlab上拉取项目)在Jenkins上自动打包部署 超超超详细!!!!!

    一.环境准备 1.下载jdk,官网:http://www.oracle.com/ 2.下载Jenkins,官网:https://www.jenkins.io/ 3.下载Tomcat,官网:http:/ ...

  6. Linux系统如何在离线环境或内网环境安装部署Docker服务和其他服务

    如何在离线环境或纯内网环境的Linux机器上安装部署Docker服务或其他服务.本次我们以Docker服务和Ansible服务为例. 获取指定服务的所有rpm包 保证要获取rpm包的机器能够上网. 本 ...

  7. 内网环境上部署k8s+docker集群:集群ftp的yum源配置

    接触docker已经有一年了,想把做的时候的一些知识分享给大家. 因为公司机房是内网环境无法连接外网,所以这里所有的部署都是基于内网环境进行的. 首先,需要通过ftp服务制作本地的yum源,可以从ht ...

  8. Centos7.2内网环境安装MySQL5.7.24

    1.配置本地yum源 内网环境,首先需要配置本地yum源,以解决MySQL的依赖安装,具体参考该文:点击打开 2.查看服务器环境 uname -a 3.去官网下载MySQL安装包 MySQL官网网址: ...

  9. 内网环境搭建NTP服务器

    说在前面:ntp和ntpdate区别 ①两个服务都是centos自带的(centos7中不自带ntp).ntp的安装包名是ntp:ntpdate的安装包是ntpdate.他们并非由一个安装包提供. ② ...

  10. 内网Linux下安装Nginx1.23,添加stream模块实现tcp/udp代理转发

    环境:centos7.6 ngx_stream_core_module 这个模块在1.9.0版本后将被启用.但是并不会默认安装,需要在编译时通过指定 --with-stream 参数来激活这个模块,w ...

随机推荐

  1. H5 ios端底部安全距离CSS

    html 头部添加 <meta name="viewport" content="width=device-width, initial-scale=1.0,min ...

  2. 一文详解银河麒麟配置容器运行时及gVisor(runsc)、Kata(runv)详细指南

    容器运行时介绍 容器运行时核心概念与分类 容器运行时(Container Runtime)是管理容器生命周期(创建.启动.停止.删除)和资源隔离的核心组件,通过与操作系统内核协作实现容器化环境.根据功 ...

  3. 小模型工具调用能力激活:以Qwen2.5 0.5B为例的Prompt工程实践

    在之前的分析中,我们深入探讨了cline prompt的设计理念(Cline技术分析:prompt如何驱动大模型对本地文件实现自主变更),揭示了其在激发语言模型能力方面的潜力.现在,我们将这些理论付诸 ...

  4. 腾讯出品!这款Markdown神器让你码字效率翻倍,双模式编辑太香了!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 由腾讯开源的CherryMarkdown编辑器,集思维导图式大纲写作与专业分屏模式于一身,支 ...

  5. net core mvc6使用jwt实现简单的登录

    创建一个新的.NET Core Web应用程序项目.在创建项目时,选择MVC模板. 在项目中添加Microsoft.AspNetCore.Authentication.JwtBearer包: 在Vis ...

  6. Pandas中两个DataFrame的差集

    在pandas中,两个DataFrame的差集并没有直接的库内置方法,现在我们希望有一种方法,就像python中set内置的求差集一样,来找到两个DataFrame的差集. >>> ...

  7. 为什么使用MQ

    在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 开发中消息队列通常有如下应用场景: 1.任务异步处理 ...

  8. Spring注解之@Async:Spring Boot实现异步调用

    前言 在日常开发过程中,会遇到一些需求是和主业务逻辑低耦合的,不要求和主业务逻辑同步进行,比如记录日志信息.发送消息通知电子邮件.生成PDF合同和导出报表等需求,而且,这些需求往往处理起来比较耗时.这 ...

  9. java客户端发送socket消息到指定服务并接收响应

    做个笔记 /** * 发送socket到指定服务 * 接收有6位报文头长度的响应,支持读取分包 * * @param host IP * @param port 端口 * @param msg 消息内 ...

  10. ElasticSearch高可用部署

    简单说明 我们在部署ElasticSearch高可用集群时,要规划好集群的规模,每个节点的职责,规划好后续的水平扩展方案,再进行部署. 核心概念 Cluster:集群,由一个或多个 Elasticse ...