文章背景:html
以前曾写过《GO语言环境探究与配置;1.14.5》一文;在文中,我提到了环境变量的GOPROXY的配置。国内,由于存在着防火墙的缘由,不少国外的网站都须要特殊渠道访问。git
然而,咱们在go开发的时候,须要依赖国外不少服务来进行辅助开发,如各类开源的go模块。从GO1.11开始,其支持模块;而且推出代理的方式,使得咱们能够经过代理的形式,来进行获取咱们所须要的服务。github
一些经常使用的go代理见连接:Are there "always on" module repositories and enterprise proxies? golang
我在上述教程中,使用的是 goproxy.cn,固然也能够选择使用其余服务,只要可用便可。goproxy.cn 在七牛云环境上进行部署,并经过其CDN服务进行加速,总体使用感觉上仍是比较快速的。缓存
最近,刚刚经过了硕士论文答辩,等待毕业,暂时没有忙别的事情,就抽出了一些时间,初步看了一下goproxy.cn的代码。下面对阅读后的想法进行简要记录:并发
主要参考连接:app
goproxy代码仓库:https://github.com/goproxy/goproxyide
goproxy模块文档:https://pkg.go.dev/github.com/goproxy/goproxy函数
goproxy服务主页:https://goproxy.cn/高并发
模块分析:
goproxy 模块总体思路仍是比较简单的。经过阅读其源码能够发现:其主体由goproxy.Goproxy构成;并经过Cacher和Cache两个接口,对接多种底层存储,如磁盘,对象存储等。其经过实现mod.go、sumdb_client_ops.go实现回源和代理请求。而且实现一些相关工具函数,辅助http处理。为实现与go命令对接,其实现了官方的 Go's module proxy protocol,而且经过实现 http.Handler 接口来支持http服务,支持get等方法;
由于GO模块是基于版本设计,因此能够认为时一旦生成即不可变更的数据形式,即数据流只存在带向数据流动;因此goproxy.cn服务不存在缓存一致性问题,所以总体实现上难度简单;只要实现高并发和整套缓存逻辑,以及实现go module proxy协议,便可重构服务。
做者总体代码较为整洁,能够做为项目借鉴,是一个很好的开源项目。其获得qiniu的支持,也是一个很好的服务;赞赏做者的贡献,期待继续完善。后续能够建议实现缓存淘汰和替换等功能,由于在底层存储有限时,仍是须要进行重用。
补充说明:
经过阅读代码文档发现,其还能够做为第三方服务实现链式代理;咱们能够简单引入goproxy模块,便可以实现本身的服务,而且经过代码便可实现配置,无需配置文档;这也是一种很好的实现方式。样例代码以下,具体能够参考项目简介:
package main import ( "fmt" "net/http" "os" "strconv" "github.com/goproxy/goproxy") func main() { g := goproxy.New() port := 8080 g.GoBinEnv = append( os.Environ(), "GOPROXY=https://goproxy.cn,direct", // Use goproxy.cn as the upstream proxy "GOPRIVATE=git.example.com", // Solve the problem of pulling private modules ) g.ProxiedSUMDBs = []string{"sum.golang.org https://goproxy.cn/sumdb/sum.golang.org"} // Proxy the default checksum database fmt.Print("running on port ", port) http.ListenAndServe("127.0.0.1:"+strconv.Itoa(port), g) }
最后,感谢你们的阅读;上述只是个人简要感悟,只表明我我的的想法,欢迎你们批评指正!
2020-12-20 补充:
关于goproxy还有一个视频,感兴趣的同窗能够参考:第 61 期 2019-09-26 Go Modules、Go Module Proxy 和 goproxy.cn
一篇关于goproxy测试的文章,能够做为测试借鉴:Go 模块代理超大型库初始化速度实测:goproxy.cn vs goproxy.io