前言
與其他語言相比,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推送釘釘消息
接下來,我們使用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) }
設置消息格式並發送請求
相關包引用如下:
i
mport( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" "strings" )
關鍵代碼如下所示:
設置Dockerfile
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也編寫類似代碼,下節內容將持續更新,敬請關注!