当前位置: 首页 > 后端技术 > PHP

goproxy.cn——为中国Go语言开发者量身打造的模块代理

时间:2023-03-29 18:23:00 PHP

Go1.13于昨日终于发布。虽然比预计晚了半个月,但迟到总比不到好。Go1.13的发布给Go带来了很多变化(详见:https://golang.org/doc/go1.13),有些变化开发者可能无法直接感受到,但有些是与开发者相关的与日常发展息息相关。其中,Gomodules的修正是本次Go1.13版本中开发者能够直接感受到的最大变化。Gomodules在Go1.11中首次发布,经过两个版本的更新,现在作为依赖管理解决方案大放异彩。除了Gomodules,还有一个叫做Moduleproxyprotocol的协议,通过它我们可以构建一个Gomoduleproxy,最后传递给GOPROXY环境变量来指导go命令在抓取modules时的后续路径。对于我们中国开发者来说,一个优秀的Gomoduleagent可以帮助我们解决很多问题。比如最知名的Go语言的golang.org/x/...模块,在中国大陆是无法访问的。过去我们使用很多其他的方法来捕获它们,但是如果我们依靠一个可以访问它们的模块代理,那么就会事半功倍。而且,由于Go1.13默认GOPROXY为https://proxy.golang.org,在中国大陆是无法访问的,所以我们中国开发者以后必须修改GOPROXY才能正常使用go开发应用。为此,我们与中国值得信赖的云服务提供商七牛云合作,为我们的中国开发者创建了一个Go模块代理:goproxy.cn。goproxy.cn是什么?goproxy.cn是目前国内最靠谱的Go模块代理。如果有人对此有疑问,可以测试对比列表中所有可以在国内访问的代理。对于类似goproxy.cn域名的goproxy.io,我之前也发过一篇测试文章(参见:https://studygolang.com/topic...)。goproxy.cn仍然是一个非盈利项目,目标是为中国和世界其他地区的Gophers提供一个免费、可靠、永远在线和CDN加速的模块代理。正因为goproxy.cn由国内第一家吃Go语言的大公司七牛云运营,稳定性和速度是毋庸置疑的。如果你的网络环境本身还不错,它可以快到你不敢相信,而且比goget这种传统的爬取方式快了好几倍还不止。可能有人会问,阿里云也很快,阿里云也是大公司,为什么不用阿里云的模块代理(mirrors.aliyun.com/goproxy)。只能说我在用阿里云的proxy做初始化github.com/kubernetes/kubernetes的测试时,404错误太多导致初始化操作无法完成...而且不支持默认值代理的GOSUMDB也就是sum.golang.org,所以需要手动修改GOSUMDB才能正常使用go。在速度相当的情况下,为什么不考虑直接使用更稳定、高可用的呢?而且毕竟goproxy.cn这个域名好记不是吗~只需要记住goproxy和.cn,就没了。问答:Go1.13中如何使用goproxy.cn?答:一次去env-wGOPROXY=https://goproxy.cn,direct就可以了。之所以在最后拼接一个,direct是因为这样做可以一定程度上解决私有库的问题(当然goproxy.cn是访问不到你的私有库的)。这个GOPROXY设置的工作原理是:当go在抓取目标模块时遇到404错误,会回退到direct,即直接到目标模块的源头(比如GitHub)去抓取。而恰好GitHub等类似代码托管网站的原则基本上是“你用不上,它对你来说不存在”,所以我说这个设置可以解决私有库的问题不能在一定程度上被模块代理。访问问题。Q:Go1.13之前如何使用goproxy.cn?答:也可以设置环境变量,但是必须手动配置,不能使用上面提到的,direct后缀,因为那是Go1.13刚加入的特性。详细配置方法请参考goproxy.cn的README文件。Q:Go1.13的私有库问题是如何解决的?答:在上面的回答中,我提到可以通过Go1.13中GOPROXY新增的“代理列表”功能为goproxy.cn做fallback选项,即direct(直接从目标模块源中抓取),这是解决私有库的一种方法,但不是完美的解决方案。为此,Go1.13还引入了一个GONOPROXY环境变量(详见:https://golang.org/cmd/go/#hdr-Environment_variables),通过设置它我们可以控制哪些模块路径忽略GOPROXY,无脑回到源头。例如GONOPROXY=*.corp.example.com,表示go在爬取corp.example.com三级子域下的所有模块时,会忽略GOPROXY的设置,直接返回目标模块的原地址。问:在Go1.13中如何保护从公共模块代理获取的模块不被篡改?答:Go1.13新推出了一个GOSUMDB(默认值为sum.golang.org,国内无法访问),就是为了达到这个目的。它的值是一个可信模块校验和数据库地址。通过指定,在抓取模块时(无论是否被模块代理抓取到),都会对所有模块进行goHash校验,只有与数据库中已有的校验和一致,才算抓取成功。和GONOPROXY一样,Go1.13也发布了一个GONOSUMDB用于GOSUMDB配对,使用方法相同,其作用是控制模块路径下的哪些模块应该被go忽略。Q:分别设置GONOPROXY和GONOSUMDB很麻烦。有没有更好的办法?答:是的,Go1.13还引入了一个GOPRIVATE,方便管理私有库规则,可以简单理解为同时设置GONOPROXY和GONOSUMDB。原文作者:@士阿飞,授权。