Goproxy.cn 核心代码探究;https://github.com/goproxy/goproxy 开源模块分析;

文章背景: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

相关文章
相关标签/搜索