Docker最全教程之Go实战,墙裂推荐(十九)
前言
與其他語言相比,Go非常值得推薦和學習,真香!為什么?主要是可以直接編譯成機器代碼(性能優越,體積非常小,可達10來M,見實踐教程圖片)而且設計良好,上手門檻低。本篇主要側重于講解了Go語言的優勢,并且提供了一個推送釘釘消息的Demo。最后由于技癢,也編寫了一個.NET Core的Demo,作為簡單的對照(見下一篇)。
目錄
Go
Go的優勢
官方鏡像
使用Go推送釘釘消息
了解釘釘機器人
定義消息類型
從環境變量獲取參數
設置消息格式并發送請求
設置Dockerfile
運行并設置環境變量推送消息
Go
Go(又稱Golang)是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言。在2016年,Go被軟件評價公司TIOBE 選為“TIOBE2016 年最佳語言”。
和其他語言的規定相比,在Go中有幾項不同的強制的規定,當不匹配以下規定時編譯將會產生錯誤:
每行程序結束后不需要撰寫分號(;)。
大括號({)不能夠換行放置。
if判斷式和for循環不需要以小括號包覆起來。
Go的優勢
相比其他語言,Go語言主要有以下優勢:
可直接編譯成機器代碼,不依賴其他庫;
豐富的內置數據類型(error也是基本的數據類型);
語言層面支持并發;
設計良好(雖然不算優秀,但是恰到好處,特別實用);
支持垃圾回收;
規范(不規范直接編譯報錯,這點太生猛了)、簡單、易學;
豐富的標準庫;
跨平臺編譯;
性能相對強勁;
部署簡單;
生態豐富
Go的性能強勁,但是又比C/C++的開發效率高(Go語言的開發者很多都是從C/C++轉換過來的,上手幾乎沒門檻),維護成本更低,同時開發效率又不弱于Python等動態語言,而且還支持編譯,可能減少很多低級錯誤。除此之外,Go還有個很大的優勢,Go和.NET Core一樣,講的好聽一點呢,就是出身名門、血統純正,講的不好聽一點呢,都是富二代,都有一個好爹。
我們的系列教程的主角Docker,就是基于Go語言編寫。由于以上一些特性,Go特別適合云計算相關服務開發(關于這一點,大家可以關注各大云廠商的開源項目)、服務器編程、分布式系統、網絡編程、內存數據庫等等。
官方鏡像地址:
https://hub.docker.com/_/golang
由于爹好,所以官方文檔比較詳細:
同樣,我們可以使用docker images golang命令來查看相關鏡像。這里值得注意的是,一般情況下,請使用帶有alpine標簽的golang鏡像,因為體積更小。
接下來,我們使用Go編寫一個簡單的Demo:即通過釘釘機器人WebHooks推送消息到釘釘。
目前釘釘已經普遍應用于辦公領域,通過對接釘釘機器人,我們可以將一些希望相關團隊關注的信息推送到相應的釘釘群。
在開始之前,我們需要對釘釘機器人有個大致的了解:
https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
這里我們是使用自定義機器人。當前自定義機器人支持文本 (text)、連接 (link)、markdown (markdown)、ActionCard、FeedCard消息類型,我們可以根據自己的使用場景選擇合適的消息類型,達到最好的展示樣式。例如我們用的比較多的是markdown類型:
我們暫且定義文本和markdown類型:
我們可以通過環境變量來傳參。
定義環境變量參數:
//環境變量
varenvList = []string{
????//釘釘機器人地址
????"WEBHOOK",
????//@的手機號碼
????"AT_MOBILES",
????//@所有人
????"IS_AT_ALL",
????//消息內容
????"MESSAGE",
????//消息類型(僅支持文本和markdown)
????"MSG_TYPE",
}
?
從環境變量獲取參數并校驗
?
????//獲取環境變量
????envs:= make(map[string]string)
????for_, envName :=rangeenvList {
????????envs[envName]= os.Getenv(envName)
????????//參數檢查
????????ifenvs[envName]==""&&envName !="AT_MOBILES"&&envName !="IS_AT_ALL"{
????????????fmt.Println("envionmentvariable "+envName+" isrequired")
????????????os.Exit(1)
????????}
????}
?
????ifenvs["AT_MOBILES"] ==""&& envs["IS_AT_ALL"] ==""{
????????fmt.Println("必須設置參數AT_MOBILES和IS_AT_ALL兩者之一!")
????????os.Exit(1)
????}
?
設置消息格式并發送請求相關包引用如下:
import(
????"bytes"
????"encoding/json"
????"fmt"
????"io/ioutil"
????"net/http"
????"strings"
)
?
關鍵代碼如下所示:
Dockerfile如下所示:
FROM?golang:1.10-alpineasbuilder
?
WORKDIR?/go/src/component-dingding
?
COPY?.//go/src/component-dingding
?
RUN?set -ex&& \
go build -v -o/go/bin/component-dingding \
-gcflags'-N -l'\
./*.go
?
FROM?alpine
RUN?apk update&& apk add ca-certificates
?
COPY?--from=builder/go/bin/component-dingding /usr/bin/
CMD?["component-dingding"]
?
#注意不要單獨使用MAINTAINER指令,MAINTAINER已被Label標簽代替
LABEL?MAINTAINER ="xinlai@xin-lai.com"
# LABEL指令用于將元數據添加到鏡像,支持鍵值對和JSON,我們可以使用docker inspect命令來查看
LABEL?DingtalkComponent='{\
? "description": "使用釘釘發送通知消息.",\
? "input": [\
??? {"name": "WEBHOOK","desc": "必填,釘釘機器人Webhook地址"},\
??? {"name": "AT_MOBILES","desc": "非必填,被@人的手機號"},\
??? {"name": "IS_AT_ALL","desc": "非必填,@所有人時:true,否則為:false"},\
??? {"name": "MESSAGE","desc": "必填,自定義發送的消息內容"},\
??? {"name": "MSG_TYPE","desc": "必填,自定義發送的消息類型,目前僅支持text和markdown"}\
? ]\
}'
?
這里我們使用了標簽來說明參數,我們可以使用以下命令來查看標簽:
docker inspect go-dingtalk
編譯出來的鏡像非常小,使用了分階段構建,因為alpine的鏡像非常小,而go可以直接編譯成機器代碼:
看到這個大小,是不是相對驚詫呢!!其實.NET Core也支持,需要用到CoreRT(.NET Core Runtime,C++的性能,.NET的生產力),不過目前雖然可用,但是還不算完全成熟。有興趣的可以了解下官方的這個開源庫:
https://github.com/dotnet/corert
注意
Alpine Linux 是一個社區開發的面向安全應用的輕量級Linux發行版。從上圖我們可以看到,它非常非常小,只有5M,這是其最大的優勢。因此,其非常適合用來做Docker鏡像、路由器、防火墻、VPNs、VoIP 盒子以及服務器的操作系統。
運行并設置環境變量推送消息
我們使用PowerShell編寫簡單腳本如下所示:
docker build --rm-f"Dockerfile"-t go-dingtalk:latest .
?
docker run --rm -e"WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token={AccessToken}"`
?-e"MESSAGE=*使用go發送釘釘消息。*"`
?-e"IS_AT_ALL=true"`
?-e"MSG_TYPE=markdown"`
?-d go-dingtalk
?
注意
--rm用于自動清理。也就是用之即來,用完即走。
推送成功后,效果圖如下所示:
寫到這里,筆者有些技癢了!!于是準備試試使用.NET Core也編寫類似代碼,下節內容將持續更新,敬請關注!
Docker最全教程——從理論到實戰(一)
Docker最全教程——從理論到實戰(二)
Docker最全教程——從理論到實戰(三)
Docker最全教程——從理論到實戰(四)
Docker最全教程——從理論到實戰(五)
Docker最全教程——從理論到實戰(六)
Docker最全教程——從理論到實戰(七)
Docker最全教程——從理論到實戰(八)? ??
Docker最全教程——從理論到實戰(九)
Docker最全教程之使用Tencent Hub來完成CI(十)Docker最全教程——數據庫容器化(十一)
Docker最全教程——數據庫容器化之持久保存數據(十二)
Docker最全教程——MongoDB容器化(十三)
Docker最全教程——Redis容器化以及排行榜實戰(十四)
Docker最全教程之Ubuntu下安裝Docker(十五)
Docker最全教程之樹莓派和Docker(十六)
Docker最全教程之使用TeamCity來完成內部CI、CD流程(十七)
Docker最全教程之使用Docker搭建Java開發環境(十八)
如果喜歡作者的文章,請關注“magiccodes”訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
QQ群:
編程交流群<85318032>?
產品交流群<897857351>
長沙線下技術社區已經創建,有興趣者可以通過客服加群。接下來,我們會定期組織一些線下技術交流分享會,以饗大家。
總結
以上是生活随笔為你收集整理的Docker最全教程之Go实战,墙裂推荐(十九)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 基于JWT的认
- 下一篇: 一键发布部署vs插件[AntDeploy