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

相關文章
相關標籤/搜索