原文地址: Go 1.13 私有代理服務的構建.
在 Go 1.13 版本的發佈前,設置 GOPROXY
只能指定一個代理服務地址。進入 Go 1.13 版本後,GOPROXY
支持多代理設置,經過,
隔開便可。以下:git
export GOPROXY=https://proxy.golang.org,direct
按官方文檔的說明,當第一個proxy
在處理ge get
所發出的HTTP請求時,返回HTTP狀態碼爲404
或410
時,就會查找下一個proxy
。github
這個提高確確實實是從Go Module
功能開放以來我的最想要的補充。有了這個多代理proxy
的設置, 就能夠在平常構建企業級項目中,將私有包代理與共有包代理分開,這樣就再也不須要維護一個巨型的Go Module
倉庫,只須要要維護一個有限大小的私有包倉庫便可。私有包倉庫主要存放企業內部包,同時可加上牆外的共用包。golang
下面簡單說明一下如何構建企業級私有代理服務。apache
首先在企業GitLab
上建立代碼倉庫項目:private-modules
.緩存
在開啓Go Module
功能以後,每次構建程序的過程當中,Go 都會在$GOPATH/pkg/mod/cache/download/
緩存全部下載到本地的Go Module
包。安全
將企業私有包以及牆外的共用包,對應的目錄提交到代碼倉庫項目:private-modules
中便可。bash
$: tree -L 1 $GOPATH/pkg/mod/cache/download/ $GOPATH/pkg/mod/cache/download/ ├── **cloud.google.com** //牆外包 ├── **your.company.com** //私有包 ├── git.apache.org ├── github.com ├── go.etcd.io ├── go.opencensus.io ├── go.uber.org ├── golang.org ├── gonum.org ├── google.golang.org ├── gopkg.in ├── gotest.tools ├── honnef.co ├── k8s.io ├── layeh.com └── rsc.io
如圖示中,就能夠將牆外的包與企業內部包對應目錄添加到private-modules
項目中進行管理。服務器
編寫私有代理服務程序。私有代理服務程序很是簡單,就是一個簡單的基於文件系統的HTTP服務便可,同時添加User/Password
進行安全認證。更加安全的控制能夠經過對非內網的IP進行限制訪問。app
代理服務器的實現很是簡單,以下:工具
func ProxyHandler(wr http.ResponseWriter, req *http.Request) { //認證 user, password, ok := req.BasicAuth() if !ok { http.Error(wr, "basic auth required", http.StatusForbidden) return } if user != "[YOUR-USER]" || password != "[YOUR-PASSWORD]" { http.Error(wr, "basic auth failed", http.StatusForbidden) return } //牆外包 if strings.HasPrefix(req.URL.RequestURI(), "cloud.google.com") { http.FileServer("[PrivateModulePath]").ServeHTTP(wr, req) return } //私有包 if strings.HasPrefix(req.URL.RequestURI(), "your.company.com") { http.FileServer("[PrivateModulePath]").ServeHTTP(wr, req) return } //404 http.NotFound(wr, req) }
私有代理程序結合企業CI
工具,保證[PrivateModulePath]
目錄下的包實時更新便可。
構建好以上的企業私有代理服務以後,就能夠在CI
階段進行多階段構建 Go 程序了。簡單展現一下樣例Dockerfile
,方便讀者自行測試。
FROM golang:1.13-alpine3.10 AS builder RUN apk --update --no-cache add git mercurial subversion bzr ca-certificates ENV GOPROXY=https://[YOUR-USER]:[YOUR-PASSWORD]@proxy.yourcompany.com,direct WORKDIR /app COPY . . RUN go build -o main FROM alpine:3.10 WORKDIR /app COPY --from=builder /app/main /usr/local/bin ENTRYPOINT [ "main" ]
企業私有代理服務主要的使用場景是在企業內網中使用,對於須要在家辦公的員工能夠經過文件代理的方式進行構建。