文章背景:
之前曾寫過《GO語言環境探究與配置;1.14.5》一文;在文中,我提到了環境變數的GOPROXY的配置,國內,因為存在著防火墻的原因,很多國外的網站都需要特殊渠道訪問,
然而,我們在go開發的時候,需要依賴國外很多服務來進行輔助開發,如各種開源的go模塊,從GO1.11開始,其支持模塊;并且推出代理的方式,使得我們可以通過代理的形式,來進行獲取我們所需要的服務,
一些常用的go代理見鏈接:Are there "always on" module repositories and enterprise proxies?
我在上述教程中,使用的是 goproxy.cn,當然也可以選擇使用其他服務,只要可用即可,goproxy.cn 在七牛云環境上進行部署,并通過其CDN服務進行加速,整體使用感受上還是比較快速的,
最近,剛剛通過了碩士論文答辯,等待畢業,暫時沒有忙別的事情,就抽出了一些時間,初步看了一下goproxy.cn的代碼,下面對閱讀后的想法進行簡要記錄:
主要參考鏈接:
goproxy代碼倉庫:https://github.com/goproxy/goproxy
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) }
最后,感謝大家的閱讀;上述只是我的簡要感悟,只代表我個人的想法,歡迎大家批評指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236892.html
標籤:Go
下一篇:Java基礎之:例外及例外處理
