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推送釘釘消息

接下來,我們使用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也編寫類似代碼,下節內容將持續更新,敬請關注!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM