一、背景

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。

六、参考文献

Golanghttps://golang.org

Go Modules: https://github.com/golang/go/...

GoCenterhttps://gocenter.io/


**欢送观看JFrog杰蛙每周二在线课堂,点击报名:

https://www.bagevent.com/even...**