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实战,墙裂推荐(十九)插图1

我们的系列教程的主角Docker,就是基于Go语言编写。由于以上一些特性,Go特别适合云计算相关服务开发(关于这一点,大家可以关注各大云厂商的开源项目)、服务器编程、分布式系统、网络编程、内存数据库等等。

Docker最全教程之Go实战,墙裂推荐(十九)插图3

官方镜像

官方镜像地址:

https://hub.docker.com/_/golang

由于爹好,所以官方文档比较详细:

Docker最全教程之Go实战,墙裂推荐(十九)插图5

同样,我们可以使用docker images golang命令来查看相关镜像。这里值得注意的是,一般情况下,请使用带有alpine标签的golang镜像,因为体积更小。

Docker最全教程之Go实战,墙裂推荐(十九)插图7

使用Go推送钉钉消息

接下来,我们使用Go编写一个简单的Demo:即通过钉钉机器人WebHooks推送消息到钉钉。

目前钉钉已经普遍应用于办公领域,通过对接钉钉机器人,我们可以将一些希望相关团队关注的信息推送到相应的钉钉群。

了解钉钉机器人

在开始之前,我们需要对钉钉机器人有个大致的了解:

https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq

这里我们是使用自定义机器人。当前自定义机器人支持文本 (text)、连接 (link)、markdown (markdown)、ActionCard、FeedCard消息类型,我们可以根据自己的使用场景选择合适的消息类型,达到最好的展示样式。例如我们用的比较多的是markdown类型:

Docker最全教程之Go实战,墙裂推荐(十九)插图9

定义消息类型

我们暂且定义文本和markdown类型:

Docker最全教程之Go实战,墙裂推荐(十九)插图11

从环境变量获取参数

我们可以通过环境变量来传参。

  • 定义环境变量参数:

//环境变量

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_MOBILESIS_AT_ALL两者之一!)

os.Exit(1)

}

设置消息格式并发送请求

相关包引用如下:

import(

“bytes”

“encoding/json”

“fmt”

“io/ioutil”

“net/http”

“strings”

)

关键代码如下所示:

Docker最全教程之Go实战,墙裂推荐(十九)插图13

Docker最全教程之Go实战,墙裂推荐(十九)插图15

设置Dockerfile

Dockerfile如下所示:

FROMgolang:1.10-alpineasbuilder

WORKDIR/go/src/component-dingding

COPY.//go/src/component-dingding

RUNset -ex&&

go build -v -o/go/bin/component-dingding

-gcflags-N -l

./*.go

FROMalpine

RUNapk update&& apk add ca-certificates

COPY–from=builder/go/bin/component-dingding /usr/bin/

CMD[“component-dingding”]

注意不要单独使用MAINTAINER指令,MAINTAINER已被Label标签代替

LABELMAINTAINER =“xinlai@xin-lai.com”

LABEL指令用于将元数据添加到镜像,支持键值对和JSON,我们可以使用docker inspect命令来查看

LABELDingtalkComponent={

“description”: “使用钉钉发送通知消息.”,

“input”: [

{“name”: “WEBHOOK”,”desc”: “必填,钉钉机器人Webhook地址“},

{“name”: “AT_MOBILES”,”desc”: “非必填,被@人的手机号“},

{“name”: “IS_AT_ALL”,”desc”: “非必填,@所有人时:true,否则为:false”},

{“name”: “MESSAGE”,”desc”: “必填,自定义发送的消息内容“}

{“name”: “MSG_TYPE”,”desc”: “必填,自定义发送的消息类型,目前仅支持textmarkdown”}

]

}

这里我们使用了标签来说明参数,我们可以使用以下命令来查看标签:

docker inspect go-dingtalk

Docker最全教程之Go实战,墙裂推荐(十九)插图17

编译出来的镜像非常小,使用了分阶段构建,因为alpine的镜像非常小,而go可以直接编译成机器代码:

Docker最全教程之Go实战,墙裂推荐(十九)插图19

看到这个大小,是不是相对惊诧呢!!其实.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用于自动清理。也就是用之即来,用完即走。

推送成功后,效果图如下所示:

Docker最全教程之Go实战,墙裂推荐(十九)插图21

Docker最全教程之Go实战,墙裂推荐(十九)插图23

写到这里,笔者有些技痒了!!于是准备试试使用.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开发环境(十八)

Docker最全教程之Go实战,墙裂推荐(十九)插图25

转载是一种动力 分享是一种美德

Docker最全教程之Go实战,墙裂推荐(十九)插图27

如果喜欢作者的文章,请关注magiccodes订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原创文章 Docker最全教程之Go实战,墙裂推荐(十九),版权所有
如若转载,请注明出处:https://www.itxiaozhan.cn/202210364.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注