本文目錄一覽:
golang開啟http2
1 .在1.6以上的版本,如果使用https模式啟動伺服器,那麼伺服器默認將使用HTTP2.0
如何使用Docker部署一個Go Web應用程序
步驟一 - 創建Dockerfile
如下的Dockerfile可以滿足以上的要求:
**FROM** golang:1.6
*# Install beego and the bee dev tool*
**RUN** go get github.com/astaxie/beego go get github.com/beego/bee
*# Expose the application on port 8080*
**EXPOSE** 8080
*# Set the entry point of the container to the bee command that runs the*
*# application and watches for changes*
**CMD** [“bee”, “run”]
第一行,
FROM golang:1.6
將Go的官方映像文件作為基礎映像。該映像文件預安裝了 Go 1.6 . 該映像已經把 $GOPATH 的值設置到了 /go 。所有安裝在 /go/src 中的包將能夠被go命令訪問。
第二行,
RUN go get github.com/astaxie/beego go get github.com/beego/bee
安裝 beego 包和 bee 工具。 beego 包將在應用程序中使用。 bee 工具用語在開發中再現地重新載入咱們的代碼。
第三行,
EXPOSE 8080
在開發主機上利用容器為應用程序開放8080埠。
最後一行,
CMD [“bee”, “run”]
使用bee命令啟動應用程序的在線重新載入。
步驟二 - 構建image
一旦創建了Docker file,運行如下的命令來創建image:
docker build -t ma-image .
執行以上的命令將創建名為ma-image的image。該image現在可以用於使用該應用程序的任何人。這將確保這個團隊能夠使用一個統一的開發環境。
為了查看自己的系統上的image列表,運行如下的命令:
docker images
這行該命令將輸出與以下類似的內容:
REPOSITORY TAG IMAGE ID CREATED SIZE
ma-image latest 8d53aa0dd0cb 31 seconds ago 784.7 MB
golang 1.6 22a6ecf1f7cc 5 days ago 743.9 MB
注意image的確切名字和編號可能不同,但是,應該至少看到列表中有 golang 和 ma-image image。
步驟三 - 運行容器
一旦 ma-image 已經完成,可以使用以下的命令啟動一個容器:
docker run -it –rm –name ma-instance -p 8080:8080 \
-v /app/MathApp:/go/src/MathApp -w /go/src/MathApp ma-image
讓咱們分析一下上面的命令來看看它做了什麼。
。docker run命令用於從一個image上啟動一個容器
。-it 標籤以交互的方式啟動容器
。–rm 標籤在容器關閉後將會將其清除
。–name ma-instance 將容器命名為ma-instance
。-p 8080:8080 標籤允許通過8080埠訪問該容器
。-v /app/MathApp:/go/src/MathApp更複雜一些。它將主機的/app/MathApp映射到容器中的/go/src/MathApp。這將使得開發文件在容器的內部和外部都可以訪問。
。ma-image 部分聲明了用於容器的image。
執行以上的命令將啟動Docker容器。該容器為自己的應用程序開發了8080埠。無論何時做了變更,它都將自動地重構自己的應用程序。自己將在console(控制台)上看到以下的輸出:
bee :1.4.1
Golang 綁定mac和ip地址,限制伺服器
實際業務:go 二進位文件在私有化部署中,需要對客戶的伺服器mac和ip進行綁定,系統只能運行在綁定的伺服器上。把mac和ip地址配置到config中。
運行效果:系統可正常編譯,正常訪問,在用戶Auth介面進行核對。
//檢驗Mac和內網IP,測試環境不做校驗
func (c *CommonBase)CheckMacAndIp()error {
ipCfg :=g.Cfg().GetString(“machine.Ipaddr”)
macCfg :=g.Cfg().GetString(“machine.Macip”)
if ipCfg ==”127.0.0.1″ {
return nil
}
macArray,_ :=gipv4.GetMacArray()
if len(macArray) ==0 {
return gerror.New(“mac地址獲取失敗”)
}
if garray.NewStrArrayFrom(macArray).Contains(macCfg) ==false {
return gerror.New(“示授權的應用MAC,請聯繫”)
}
ipArray,_ :=gipv4.GetIpArray()
ipIntranetArray,_ :=gipv4.GetIntranetIpArray()
if len(ipArray) ==0 len(ipIntranetArray) ==0 {
return gerror.New(“ip地址獲取失敗”)
}
if garray.NewStrArrayFrom(ipArray).Merge(ipIntranetArray).Contains(ipCfg) ==false {
return gerror.New(“示授權的應用IP,請聯繫”)
}
return nil
}
項目使用GoFrame框架1.6。考慮到客戶可能會對內存數據做分析破解,可以把mac和ip地址做AES加密。
Go語言之Context
golang在1.6.2的時候還沒有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的庫中。中文譯作「上下文」,它主要包含了goroutine 的運行狀態、環境等信息。
context 主要用來在 goroutine 之間傳遞上下文信息,包括:同步信號、超時時間、截止時間、請求相關值等。
該介面定義了四個需要實現的方法:
如果有個網路請求Request,然後這個請求又可以開啟多個goroutine做一些事情,當這個網路請求出現異常和超時時,這個請求結束了,這時候就可以通過context來跟蹤這些goroutine,並且通過Context來取消他們,然後系統才可回收所佔用的資源。
為了更方便的創建Context,包裡頭定義了Background來作為所有Context的根,它是一個emptyCtx的實例。
Background返回一個非空的Context。它永遠不會被取消。它通常用來初始化和測試使用,作為一個頂層的context,也就是說一般我們創建的context都是基於Background。
TODO返回一個非空的Context。當不清楚要使用哪個上下文的時候可以使用TODO。
他們兩個本質上都是emptyCtx結構體類型,是一個不可取消,沒有設置截止時間,沒有攜帶任何值的Context。
有了如上的根Context,那麼是如何衍生更多的子Context的呢?這就要靠context包為我們提供的With系列的函數了。
通過這些函數,就創建了一顆Context樹,樹的每個節點都可以有任意多個子節點,節點層級可以有任意多個。
WithCancel函數,最常用的派生 context 方法。該方法接受一個父 context。父 context 可以是一個 background context 或其他 context。
WithDeadline函數,該方法會創建一個帶有 deadline 的 context。當 deadline 到期後,該 context 以及該 context 的可能子 context 會受到 cancel 通知。另外,如果 deadline 前調用 cancelFunc 則會提前發送取消通知。
WithTimeout和WithDeadline基本上一樣,這個表示是超時自動取消,是多少時間後自動取消Context的意思。
WithValue函數和取消Context無關,它是為了生成一個綁定了一個鍵值對數據的Context,這個綁定的數據可以通過Context.Value方法訪問到,一般我們想要通過上下文來傳遞數據時,可以通過這個方法,如我們需要tarce追蹤系統調用棧的時候。
使用Context的程序應遵循以下規則,以使各個包之間的介面保持一致:
1.不要將 Context 塞到結構體里。直接將 Context 類型作為函數的第一參數,而且一般都命名為 ctx。
2.不要向函數傳入一個 nil 的 context,如果你實在不知道傳什麼,標準庫給你準備好了一個 context:todo。
3.不要把本應該作為函數參數的類型塞到 context 中,context 存儲的應該是一些共同的數據。例如:登陸的 session、cookie 等。
4.同一個 context 可能會被傳遞到多個 goroutine,別擔心,context 是並發安全的。
原創文章,作者:DLLL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/142376.html