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