V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
aofei
V2EX  ›  Go 编程语言

首发特性: goproxy.cn 现已推出首个 Go 模块代理统计数据 API

  •  4
     
  •   aofei ·
    aofei · 2020-03-27 13:40:48 +08:00 · 5259 次点击
    这是一个创建于 1734 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    这周很值得纪念,首先是 goproxy.cn 已缓存的模块版本总数突破了一百万,这甚至比起 Go 官方的 proxy.golang.org 已缓存的还要多出不少。其次是 goproxy.cn 的日访问量已稳定在千万级,正在朝着亿级进发,目前这在国内我了解到的别的几个同类服务中是最多的了。另外尤为重要的一点是,经过我们的不懈努力,甚至付出了两次事故的代价(详见:status.goproxy.cn),我们终于使得 goproxy.cn 达到了零错误率!现在的 goproxy.cn 可以说是很稳的了,大家可以放心使用。当然,我也知道最近一个月可能有些朋友对 goproxy.cn 产生了些许的不信任感,这个责任在我个人。我为了实现零错误率尝试过了太多不寻常的操作,很多人都告诉我不可能、别想了,但我自己爱折腾的毛病致使我无法不去研究。我坚信哪怕只有两三天的零错误率也能为服务的可靠性大大地加上一分,所以我不停地尝试不同的方法,导致了这个月间断性地出过几次问题。我在 www.v2ex.com/t/651330 这片帖子中也有解释过,我曾在潜意识里认为 goproxy.cn 还是那个我自己搭建自己跑的鲜有人用的小服务,所以做事欠考虑,甚至还跟别人说出过“我不介意用事故来换取低错误率的优化方式”这种不负责任的话……在这里我再次为自己的鲁莽行为向大家郑重地道个歉,以后我会铭记“基础服务以稳定为本”这句话,克制住自己爱折腾的毛病……恐怕在所有同类服务的维护者中只有我是最喜欢瞎搞的了……

    好了,开头稍微为这一个月发生的事情做了个小总结。接下来说一下本次的重点,也就是 goproxy.cn 推出了 Go 模块代理世界中的首个统计数据 API (文档详见:goproxy.cn/stats),这是个原本计划在二月底就发布的特性。统计数据 API 其实很早就开发完了(几个月前就基本完工了),但却迟迟未发布,主要原因是跟我们前一阵子在探索零错误率相关,我们想在一个完美的时间点把它介绍给大家。这一阵子有很多大佬催过我,比如光无闻大哥一人就已经催过我很多次了……在这里统一道个歉……当然,迟到总比不到好,让大家久等了!

    目前先推出了 4 种呼声较高的 API,后续可能还会有其他 API 被添加进来。

    *注意:由于数据不慎丢失,目前 goproxy.cn 的数据统计 API 所展示的只是最近三个月的数据,而不是自 goproxy.cn 上线起的所有历史数据。

    API:获取服务摘要

    首先是一个用于获取服务摘要信息的 API,通过调用这个 API 你可以获取到 goproxy.cn 中诸如所有模块版本的总尺寸和总数等信息。

    获取服务摘要 API 的 URL 是固定的,没有路径参数:goproxy.cn/stats/summary

    {
    	"cacher_size": 2663405247231,
    	"module_version_count": 1035421,
    	"module_host_count": 1120,
    	"top_10_module_hosts": [
    		{"module_host": "github.com", "module_version_count": 921606},
    		{"module_host": "k8s.io", "module_version_count": 24982},
    		{"module_host": "gitlab.com", "module_version_count": 13172},
    		{"module_host": "gopkg.in", "module_version_count": 10479},
    		{"module_host": "golang.org", "module_version_count": 8000},
    		{"module_host": "gitee.com", "module_version_count": 4650},
    		{"module_host": "bitbucket.org", "module_version_count": 4177},
    		{"module_host": "sigs.k8s.io", "module_version_count": 3280},
    		{"module_host": "google.golang.org", "module_version_count": 2703},
    		{"module_host": "istio.io", "module_version_count": 2487}
    	]
    }
    

    上面的示例响应中各字段的含义如下:

    • cacher_size:所有模块版本的总尺寸,单位是“字节”
    • module_version_count:所有模块版本的总数
    • module_host_count:模块主机地址的总数
    • top_10_module_hosts:所拥有的模块版本数排名前十的模块主机地址
    • top_10_module_hosts.module_host:模块主机地址
    • top_10_module_hosts.module_version_count:模块主机地址所拥有的模块版本总数

    API:获取模块趋势

    然后呼声蛮高的一个 API 就是获取服务中的模块趋势,有很多人好奇自己的模块在 goproxy.cn 中的活跃度排名究竟是怎样的。

    目前我们提供了三类趋势,它们均只返回一段时间内的最活跃的最多前 1000 个模块:

    [
    	{"module_path": "golang.org/x/sys", "download_count": 1822180},
    	{"module_path": "golang.org/x/net", "download_count": 1713080},
    	{"module_path": "golang.org/x/tools", "download_count": 1503522},
    	{"module_path": "golang.org/x/crypto", "download_count": 1032270},
    	{"module_path": "gopkg.in/yaml.v2", "download_count": 578120}
    ]
    

    上面的示例响应中各字段的含义如下:

    • module_path:模块路径
    • download_count:模块路径对应的所有模块版本的总下载次数

    API:获取模块(版本)统计

    当然,我们支持获取服务中指定模块(版本)的统计,这也算是统计数据 API 的刚需了。

    获取模块(版本)统计的 API 的 URL 格式为 goproxy.cn/stats/<module-path>[@<module-version>]。如 goproxy.cn/stats/golang.org/x/text 表示获取模块路径为 golang.org/x/text 的模块的所有模块版本的总统计,而 goproxy.cn/stats/golang.org/x/[email protected] 表示获取该模块的 v0.3.2 版本的统计。

    {
    	"download_count": 476705,
    	"last_30_days": [
    		{"date": "2020-03-25T00:00:00Z", "download_count": 8778},
    		{"date": "2020-03-24T00:00:00Z", "download_count": 16884},
    		{"date": "2020-03-23T00:00:00Z", "download_count": 15842},
    		{"date": "2020-03-22T00:00:00Z", "download_count": 11232},
    		{"date": "2020-03-21T00:00:00Z", "download_count": 11894},
    		{"date": "2020-03-20T00:00:00Z", "download_count": 14968},
    		{"date": "2020-03-19T00:00:00Z", "download_count": 11017},
    		{"date": "2020-03-18T00:00:00Z", "download_count": 5209},
    		{"date": "2020-03-17T00:00:00Z", "download_count": 5759},
    		{"date": "2020-03-16T00:00:00Z", "download_count": 4166},
    		{"date": "2020-03-15T00:00:00Z", "download_count": 2145},
    		{"date": "2020-03-14T00:00:00Z", "download_count": 2218},
    		{"date": "2020-03-13T00:00:00Z", "download_count": 4609},
    		{"date": "2020-03-12T00:00:00Z", "download_count": 5503},
    		{"date": "2020-03-11T00:00:00Z", "download_count": 5412},
    		{"date": "2020-03-10T00:00:00Z", "download_count": 6453},
    		{"date": "2020-03-09T00:00:00Z", "download_count": 4798},
    		{"date": "2020-03-08T00:00:00Z", "download_count": 2323},
    		{"date": "2020-03-07T00:00:00Z", "download_count": 2332},
    		{"date": "2020-03-06T00:00:00Z", "download_count": 4806},
    		{"date": "2020-03-05T00:00:00Z", "download_count": 6339},
    		{"date": "2020-03-04T00:00:00Z", "download_count": 5858},
    		{"date": "2020-03-03T00:00:00Z", "download_count": 5579},
    		{"date": "2020-03-02T00:00:00Z", "download_count": 8862},
    		{"date": "2020-03-01T00:00:00Z", "download_count": 2119},
    		{"date": "2020-02-29T00:00:00Z", "download_count": 2053},
    		{"date": "2020-02-28T00:00:00Z", "download_count": 4735},
    		{"date": "2020-02-27T00:00:00Z", "download_count": 6578},
    		{"date": "2020-02-26T00:00:00Z", "download_count": 4954}
    	],
    	"top_10_module_versions": [
    		{"module_version": "v0.3.2", "download_count": 232795},
    		{"module_version": "v0.3.0", "download_count": 146009},
    		{"module_version": "v0.3.1-0.20180807135948-17ff2d5776d2", "download_count": 67096},
    		{"module_version": "v0.3.1-0.20181227161524-e6919f6577db", "download_count": 11494},
    		{"module_version": "v0.0.0-20160726164857-2910a502d2bf", "download_count": 11223},
    		{"module_version": "v0.0.0-20170915032832-14c0d48ead0c", "download_count": 3991},
    		{"module_version": "v0.3.1-0.20171227012246-e19ae1496984", "download_count": 1128},
    		{"module_version": "v0.0.0-20170915090833-1cbadb444a80", "download_count": 937},
    		{"module_version": "v0.3.1-0.20181030141323-6f44c5a2ea40", "download_count": 480},
    		{"module_version": "v0.3.1", "download_count": 353}
    	]
    }
    

    上面的示例响应中各字段的含义如下:

    • download_count:模块(版本)的总下载次数
    • last_30_days:模块(版本)最近 30 天的统计
    • last_30_days.date:模块(版本)统计的日期
    • last_30_days.downlaod_count:模块(版本)单日的下载次数
    • top_10_module_versions:该字段仅在根据模块路径获取其对应的所有模块版本的总统计时才会返回,表示其下载次数排行前十的模块版本
    • top_10_module_versions.module_version:模块版本
    • top_10_module_versions.download_count:模块版本的下载次数

    API:获取模块总下载次数徽章

    为了使模块作者们能更好地展示自己的模块在 goproxy.cn 的总下载次数,我们支持了 SVG 徽章。

    获取模块总下载次数徽章的 API 的 URL 格式为 goproxy.cn/stats/<module-path>/badges/download-count.svg

    你可以通过下述 Markdown 语法轻松地将指定模块的总下载次数徽章放入项目 README.md 中:

    [![goproxy.cn]( https://goproxy.cn/stats/<module-path>/badges/download-count.svg)]( https://goproxy.cn)
    

    比如 goproxy.cn/stats/golang.org/x/text/badges/download-count.svg

    goproxy.cn

    结语

    由于我们是首家支持统计数据 API 的 Go 模块代理,所以我们预留了一段时间的功能探索期,在此期间内我们欢迎大家随时通过 goproxy.cn/stats 页面中提到的联系方式来分享你们的意见建议,一起为咱们中国 Go 语言社区的这个 Go 模块代理打造出一个功能性良好的统计数据 API 。

    最后再强调一点,goproxy.cn 由七牛运营,服务于 Go 语言社区,它永久免费,也一如既往地不加以任何形式的带宽限制、速率限制,大家可以敞开了用、放心地用。有问题?问;有建议?提。我们一直那里,欢迎随时来访。

    第 1 条附言  ·  2020-03-27 15:07:47 +08:00
    手残党刊误:

    获取模块趋势的三个 API 的 URL 有误,应该是“stats”而不是“status”。

    goproxy.cn/stats/trends/latest :获取最新趋势
    goproxy.cn/stats/trends/last-7-days :获取最近 7 天的趋势
    goproxy.cn/stats/trends/last-30-days :获取最近 30 天的趋势
    49 条回复    2020-07-02 15:16:36 +08:00
    godall
        1
    godall  
       2020-03-27 14:43:17 +08:00
    这是什么东东?科学上网?
    aofei
        2
    aofei  
    OP
       2020-03-27 14:53:43 +08:00
    @godall 这是一个类似于 Docker Reistry 、NPM 、RubyGems 的用来加速项目构建的东东,但是是给 Go 语言用的。并且,也的确是可以在一定程度上避免在使用 go get 等命令抓包时可能出现的 DNS 污染、电信运营商拦截等现象。
    dbskcnc
        3
    dbskcnc  
       2020-03-27 15:15:21 +08:00   ❤️ 1
    严重支持,有了 go mod 和 goproxy.cn ,编译起程序来真是太方便了
    JB18CM
        4
    JB18CM  
       2020-03-27 15:16:27 +08:00
    支持一下
    excxapp
        5
    excxapp  
       2020-03-27 15:19:15 +08:00
    之前一直用 cn 这个,但是有时候同步包出现错误,换 io 那个正常,不确定是什么问题,
    wsseo
        6
    wsseo  
       2020-03-27 15:20:12 +08:00
    不是太懂原理 。代理有延迟吗,比如 github 上刚刚更新了 latest 版本,我获取到的是最新的版本吗?
    o562dsRcFqYl375i
        7
    o562dsRcFqYl375i  
       2020-03-27 15:20:34 +08:00
    👍
    piglovesx
        8
    piglovesx  
       2020-03-27 15:21:02 +08:00
    支持
    mengzhuo
        9
    mengzhuo  
       2020-03-27 15:23:07 +08:00 via iPhone
    666
    一直用 goproxy.cn
    skymei
        10
    skymei  
       2020-03-27 15:23:21 +08:00
    感谢奉献,是用国内存储缓存的包数据么,挺好奇是咋实现的。
    aofei
        11
    aofei  
    OP
       2020-03-27 15:23:51 +08:00
    @excxapp 抱歉,这个应该跟我自己的操作有关了,我们前一阵子在探索零错误率,所以导致了一些问题的产生。不过现在已经搞定了,错误应该也基本都消失了,老哥你愿意的话可以再尝试一下。再遇到问题欢迎随时去提 issue,我们会尽快回应的。
    blless
        12
    blless  
       2020-03-27 15:25:19 +08:00
    可以顺手写个趋势页面啊
    aofei
        13
    aofei  
    OP
       2020-03-27 15:26:57 +08:00
    @wsseo 这个跟传统的比如 APT 镜像源之类的倒不完全一样,Go 模块代理可以做到零延迟,至少 goproxy.cn 是这么实现的。比如你在 GitHub 上刚提交了一个代码修改,那么你是可以通过 go get github.com/foo/bar@master 立刻拿到那个修改的,此时就是零延迟。同理,如果打了个新的 Tag,比如 v1.2.3,那么也是可以通过 go get github.com/foo/[email protected] 立刻拿到的,同样也是零延迟。
    cholerae
        14
    cholerae  
       2020-03-27 15:27:19 +08:00
    chenyi
        15
    chenyi  
       2020-03-27 15:29:24 +08:00
    go get 怎么用这个代理啊
    wujunze
        16
    wujunze  
       2020-03-27 15:33:03 +08:00
    支持 👍
    whoami9894
        17
    whoami9894  
       2020-03-27 15:33:13 +08:00
    👍👍👍
    aofei
        18
    aofei  
    OP
       2020-03-27 15:34:02 +08:00
    @chenyi 首页有“用法”说明的,其实很简单,就是修改 GOPROXY 环境变量:

    export GOPROXY=https://goproxy.cn,direct

    需要注意的就是另外也建议把 GO111MODULE 环境变量设置为 on,发现很多朋友在遇到问题时都是不明白默认值 auto 的含义,所以建议设置为 on 一劳永逸。
    aofei
        19
    aofei  
    OP
       2020-03-27 15:35:11 +08:00
    @blless WIP……先把 API 放出来了让大家用着,集思广益。
    keepeye
        20
    keepeye  
       2020-03-27 15:40:31 +08:00
    谢谢,给我们这些 goer 提供了很大的方便,赞!
    ronman
        21
    ronman  
       2020-03-27 15:41:10 +08:00 via Android
    好奇你们如果盈利呢?
    很感谢你们的代理服务,有在用。
    aofei
        22
    aofei  
    OP
       2020-03-27 15:45:56 +08:00
    @ronman 不盈利,是七牛无偿提供的服务基础设施支持,毕竟七牛和 Go 的关系很深,他们对此是很慷慨的。而且七牛之前也支持过类似的其他服务,staticfile.org 相信也有不少人用过。
    ronman
        23
    ronman  
       2020-03-27 15:48:21 +08:00 via Android
    @aofei 太慷慨了,感谢感谢
    kuro1
        24
    kuro1  
       2020-03-27 16:07:45 +08:00
    @keepeye Gopher
    mauve
        25
    mauve  
       2020-03-27 16:21:41 +08:00
    七牛真是国内少数几家具有极客精神的公司,从创始人到产品都是,期待有一天能到七牛工作
    Ansen
        26
    Ansen  
       2020-03-27 16:38:48 +08:00
    一直在用 goproxy.io ,没想到还有个 cn
    kidtest
        27
    kidtest  
       2020-03-27 20:19:18 +08:00
    赞!我用的就是这个
    kaifang
        28
    kaifang  
       2020-03-27 20:24:06 +08:00 via iPhone
    支持支持,一直在用这个,也推荐给实验室同学使用了。经常在 go tg 群里见到你发言~
    lcj2class
        29
    lcj2class  
       2020-03-27 20:33:11 +08:00
    @aofei 大赞,一直在用,稳如磐石!
    useben
        30
    useben  
       2020-03-27 21:50:41 +08:00
    严重支持,有了 go mod 和 goproxy.cn ,稳如老狗
    justin2018
        31
    justin2018  
       2020-03-27 23:55:31 +08:00   ❤️ 1
    大赞 我总是开飞机去拖货~ 这个太棒了~
    xiaomimei
        32
    xiaomimei  
       2020-03-28 00:05:45 +08:00 via Android
    之前学 go 的时候被 go get 折腾的死去活来,用了 goproxy.cn 之后爽到飞起,感谢作者和七牛🙏
    xiaomimei
        33
    xiaomimei  
       2020-03-28 00:09:03 +08:00 via Android
    @kaifang 群 id 是啥呀,求告知
    Wa1k3r
        34
    Wa1k3r  
       2020-03-28 00:17:41 +08:00
    @kaifang 同求 go tg 的车
    123444a
        35
    123444a  
       2020-03-28 01:11:40 +08:00 via Android
    反对代理,我们需要中南 hai 专线
    yech1990
        36
    yech1990  
       2020-03-28 04:28:56 +08:00 via Android
    请问这个项目和七牛是什么关系呢? 一下子是自己搭建,一下子是七牛运营,有点懵
    。。。
    kaifang
        37
    kaifang  
       2020-03-28 08:25:40 +08:00 via iPhone
    kaifang
        38
    kaifang  
       2020-03-28 08:26:11 +08:00 via iPhone
    @Wa1k3r 同上
    xiaomimei
        39
    xiaomimei  
       2020-03-28 08:51:29 +08:00 via Android
    @kaifang 验证码填错了,直接给我拉黑了😭
    scnace
        40
    scnace  
       2020-03-28 09:41:00 +08:00 via Android
    cool ~
    scnace
        41
    scnace  
       2020-03-28 09:43:37 +08:00 via Android   ❤️ 1
    @yech1990 七牛提供的「基础设施」,具体可以去 https://github.com/goproxy/goproxy.cn 看看
    aofei
        42
    aofei  
    OP
       2020-03-28 11:39:55 +08:00   ❤️ 2
    @yech1990 抱歉,可能是我叙述的不是很清楚所以让大家产生了误解。这个项目大概是去年二月底三月初我还在学校的时候开发的,我自己的确也跑了一段时间(大概几个月),随后我跟七牛的 CEO 许叔提议了一下要把这个项目交给七牛来运营,他一口就答应了。现在这个项目跟七牛的关系是它完全属于七牛,包括它的域名也是备案在七牛名下的(沪 ICP 备 11037377 号-56 ),我跟这个项目的关系是我目前还是它的维护者。所以大家可以放心使用,因为它不是一个个人项目。❤️
    szzhiyang
        43
    szzhiyang  
       2020-03-28 12:18:21 +08:00
    @aofei 感恩大神对国内 Go 开发体验的巨大促进!大神目前在哪高就啊?
    excxapp
        44
    excxapp  
       2020-03-28 13:56:07 +08:00
    @aofei 好的,测试确实正常了,还会正常使用的,辛苦大佬了
    aofei
        45
    aofei  
    OP
       2020-03-28 19:24:26 +08:00
    @szzhiyang 小弟我目前还在家里等待着疫情结束……😩
    monkeyWie
        46
    monkeyWie  
       2020-04-01 09:55:50 +08:00
    支持支持,goproxy.cn 出来之后,就从 goproxy.io 转移过来了
    iamdqncoder
        47
    iamdqncoder  
       2020-04-10 12:04:48 +08:00
    好用!
    cloverzrg2
        48
    cloverzrg2  
       2020-04-21 16:35:01 +08:00
    一直用这个
    ruzztok
        49
    ruzztok  
       2020-07-02 15:16:36 +08:00
    这个不好吗? goproxy.io ,新手
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2473 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 16:01 · PVG 00:01 · LAX 08:01 · JFK 11:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.