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