一、背景
Go 语言是 Google 开发的一种动态强类型、编译型、并发型,并具备垃圾回收性能的编程语言。为了不便搜寻和辨认,有时会将其称为 Golang。自 2009 年 11 月 Google 正式发表推出,成为凋谢源代码我的项目以来,Go 语言已成为当今开发人员和 DevOps 畛域最风行的语言之一, 它被用于设计和编写 Kubernetes 和 Helm。
然而,相比语言自身曾经失去了宽泛的遍及和应用,Go 语言的包治理计划却大大滞后了。2018 年 Google 终于在 Go1.11 官网推出了 Go modules,为 Go 语言提供了反对版本化的依赖治理计划。
Go modules 当初已成为 Go 语言规范的依赖管理工具和包仓库标准。而 GoCenter 为 Go modules 的实现和推广提供了依赖包的公共仓库,使得 Go 语言的开发人员可能更为稳固和不便地开发可反复构建的 Go 应用程序。
除了提供 Go 仓库外,在获取和下载 Go module 包方面,GoCenter 提供了比传统的如 GitHub 等版本管理系统更为疾速的反对。
二、验证 GoCenter 速度的测试
为了验证 GoCenter 提供了更快获取 Go modules 的形式,咱们设计了如下测试计划:
1、咱们选取了两个 Go 我的项目,用以比拟不同我的项目规模下速度的不同。一个是公有我的项目,webhook-bridge(https://github.com/retgits/webhook-bridge);一个是公共我的项目,动态站点生成器 Hugo(https://github.com/gohugoio/hugo)。
2、咱们在两个网络环境下别离执行测试,用以比拟不同网络条件下速度的不同。一个是 JFrog 的公司网络,一个是家庭网络。
3、构建 Go 我的项目通常蕴含两步,第一是下载依赖,第二是编译可执行程序。本次测试集中在第一局部,Go 依赖包的下载速度。为了使测试尽可能偏心和不间断, 咱们编写了一个脚本, 在运行“go get”之前删除了所有模块,而后对于同一个我的项目别离应用 GitHub 和 GoCenter 来获取依赖。这些命令将运行 10 次, 后果记录在文件中。测试应用的脚本参见 https://github.com/xingao0803/GoCenter-Performance/blob/master/testscript.sh。
同时,为了保障测试的公正性,咱们测试的时候并没有告诉 GoCenter 团队。他们既不能对测试所用的我的项目或模块产生影响,也无奈篡改咱们的测试数据。
三、测试后果
测试后果的具体列表参见 https://github.com/xingao0803/GoCenter-Performance/blob/master/GoCenter-performance.xlsx。在这里,咱们统计一下,列出每个我的项目的最快和最慢运行之间的差别。
1、公有我的项目的测试后果
在 JFrog 公司网络测试公有我的项目:
越小越好
GoCenter/GitHub
用户模式下 CPU 秒数
内核模式下
CPU 秒数
CPU 占比
总运行秒数
比拟最慢运行
0.18
0.29
0.83
0.30
比拟最快运行
0.18
0.29
0.69
0.26
在家庭网络测试公有我的项目:
越小越好
GoCenter/GitHub
用户模式下 CPU 秒数
内核模式下
CPU 秒数
CPU 占比
总运行秒数
比拟最慢运行
0.16
0.30
0.83
0.42
比拟最快运行
0.17
0.29
0.53
0.23
最初一列“总运行工夫”,是测试下载 Go 我的项目依赖包并放入正确地位的工夫。从上述统计能够看出,通过 GoCenter 获取 Go modules 依赖比从 GitHub 获取速度更快,耗费资源更少。
这个公有我的项目只有 6 个间接依赖和 12 个间接依赖的 Go module。如果应用更大规模的我的项目,如 Hugo,包含 43 个间接依赖和 11 个间接依赖,成果又会如何呢?
2、Hugo 我的项目的测试后果
在 JFrog 公司网络测试公有我的项目:
越小越好
GoCenter/GitHub
用户模式下 CPU 秒数
内核模式下
CPU 秒数
CPU 占比
总运行秒数
比拟最慢运行
0.13
0.19
1.50
0.12
比拟最快运行
0.13
0.20
1.26
0.10
在家庭网络测试公有我的项目:
越小越好
GoCenter/GitHub
用户模式下 CPU 秒数
内核模式下
CPU 秒数
CPU 占比
总运行秒数
比拟最慢运行
0.14
0.20
1.48
0.12
比拟最快运行
0.14
0.19
1.32
0.11
从上述统计能够看出,对于大型 Go 我的项目,尽管 CPU 占比绝对较高,然而从 GoCenter 获取依赖的速度绝对更快了。
3、测试总结
通过上述针对测试后果的剖析和统计,不难看出,应用 GoCenter 获取 Go modules 依赖,比间接从 GitHub 等版本控制系统获取这些依赖速度更快,而且还节俭了 CPU 周期。而且,随着我的项目复杂性的增长(更大的依赖树),性能的晋升更为显著。
四、剖析 GoCenter 疾速的起因
要理解 GoCenter 速度更快的起因,咱们须要深入分析 go 客户端是如何获取 Go modules 依赖包的。咱们来比拟一下,在是否设置 GOPROXY 变量的状况下,执行 go get 获取 modules 有什么不同?
1、获取 module 信息
第一个区别从“import”库开始。应用 Go 编写的每一个利用都会应用库。这些库可能是规范库,如“fmt”或“io”,也可能是由别处分享的。
如果没有设置 GOPROXY 变量,且我的项目包位于任意预约义好的版本控制系统(如 GitHub),Go 客户端会晓得如何解析 URL 以获取相干模块。如果我的项目包不在这些零碎中,Go 客户端将会执行动静 HTML 查看,来查找表明如何、以及在何处获取相干模块的元数据标记。这个过程须要 HTTP 重定向和 HTML 解析。
如果设置 GOPORXY 变量指向 GoCenter,Go 客户端就会向 GoCenter 发送一个申请来获取 module 信息。GoCenter 更疾速的第一个起因就在于不须要简单的 HTML 和 HTTP 解决,而是间接应用一个简略的 HTTP 申请。这个劣势在大量依赖存活在预约义的版本控制系统之外的 Go 我的项目上会显得更为突出。
2、下载 module
下一步是要把相干 module 下载到本地。Go module 已被打包成 zip 文件,以及多数附加的元数据文件(咱们稍后探讨)。
如果不设置 GOPROXY 变量,Go 客户端将执行“git clone”,并在 $GOPATH/pkg/mod/cache/vcs 目录创立一个“bare”仓库。
如果将 GOPROXY 变量设置为 GoCenter,Go 客户端将会发送 HTTP GET 申请并下载 zip 文件。GoCenter 博得速度的第二点就在于,下载文件通常比执行“git clone”快得多。在这种状况下,因为 Go module 是压缩好的文本文件,下载会节俭更多的工夫和带宽。
3、构建 module
接下来要构建 module,以便在 Go 利用中应用。如前所述,Go module 是带从属文件的 zip 压缩包,这些从属文件包含.info(蕴含版本号和提交工夫)和.mod(下载的 module 文件)等。Go 客户端须要这些文件及其理论起源。
如果没有设置 GOPROXY 变量,Go 客户端须要计算并生成这些文件,再把他们和 module 文件一起放到 $GOPATH/pkg/mod/cache/download 文件夹。稍后还须要把他们挪动到 $GOPATH/mod/<vcs>/<module> 文件夹。
如果 GOPROXY 已设置为 GoCenter,这些文件曾经随之前的下载并放到 $GOPATH/pkg/mod/cache/download 里。Go 客户端只需简略地解压 zip 文件,而后把源文件(不带元数据文件)放到 $GOPATH/mod/<vcs>/<module>。解压文件可比计算校验和、生成文件,并获取“bare”仓库的正本要快得多了,这正是 GoCenter 的第三个速度劣势。
4、总结
咱们总结一下。当不设置 GOPROXY 时,Go 客户端采取的步骤是:
· 寻找 module 的地位以及拜访协定,这可能须要额定的 HTTP 和 HTML 解决;
· 执行“git clone”,并在 $GOPATH/pkg/mod/cache/vcs 创立“bare”仓库;
· 生成 zip 文件,计算校验和,生成元数据文件,并把它们放到 $GOPATH/pkg/mod/cache/download;
· 把不带元数据文件的源文件放到 $GOPATH/mod/<vcs>/<module>。
而设置 GOPROXY 为 GoCenter 后,Go 客户端的工作就简化了很多:
· 下载 module 的.mod、.info 和.zip 文件,并放到 $GOPATH/pkg/mode/cache/download(只有 3 个 HTTP GET 操作);
· 把源文件解压到 $GOPATH/mod/<vcs>/<module>。
通过应用 GoCenter,去掉了查找 module 的 HTTP 和 HTML 解决,“低廉”的源码 clone 操作,以及元数据文件的生成操作。
五、总结
Go 语言是目前最为风行的编程语言之一,而 Go modules 的推出为 Go 语言减少了欠缺的依赖治理计划。
JFrog 推出的 GoCenter,做为 Go modules 的地方仓库,为宽广的 Go 开发者提供了丰盛的、版本化治理的公共 Go modules 包。
除此之外,因为在下载文件是采纳正确的协定、节俭 HTTP 调用次数,以及无需在客户端从新创立模块等个性,GoCenter 还为 Go modules 的利用提供了更疾速的反对。
咱们针对 GoCenter 的反对速度进行了测试,后果验证了咱们的预期。这一测试后果在 Go 社区也失去了泛滥侧面回应。咱们测试所用的我的项目、脚本,以及测试后果都在前文中列出,欢送大家本人实际操作、验证一下。
想要理解无关 GoCenter 更多深刻的技术信息?请查看 GoCenter 的 Github 我的项目,https://github.com/jfrog/gocenter。
六、参考文献
Golang:https://golang.org
Go Modules: https://github.com/golang/go/…
GoCenter:https://gocenter.io/
** 欢送观看 JFrog 杰蛙每周二在线课堂,点击报名:
https://www.bagevent.com/even…**