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()
        }
    }
    ifenvs["AT_MOBILES"] ==""&& envs["IS_AT_ALL"] ==""{
        fmt.Println("必须设置参数AT_MOBILES和IS_AT_ALL两者之一!")
        os.Exit()
    }
设置消息格式并发送请求
相关包引用如下:
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也编写类似代码,下节内容将持续更新,敬请关注!
Docker最全教程之Go实战,墙裂推荐(十八)的更多相关文章
- Docker最全教程之MySQL容器化 (二十四)
		
前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过此块,本篇仅从笔者角度进行总结和编写. 目录 镜像说明 运行MySQL容器镜像 1.运行MySQL容器 ...
 - Docker最全教程之Python爬网实战(二十一)
		
Python目前是流行度增长最快的主流编程语言,也是第二大最受开发者喜爱的语言(参考Stack Overflow 2019开发者调查报告发布).笔者建议.NET.Java开发人员可以将Python发展 ...
 - Docker最全教程之Ubuntu下安装Docker(十四)
		
前言 Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,应用很广.本篇主要讲述Ubuntu下使用SSH远程登录并安装Docker,并且提供了Docker安装的两种方式,希望对大家有所帮 ...
 - 墙裂推荐一本案例驱动的PhoneGap入门书,早看早收货
		
清华大学出版社推出的<构建跨平台APP:PhoneGap移动应用实战> 零门槛学APP开发 从无到有 循序渐进 20余个示例APP 3个项目APP 全平台à跨终端à移动开发 完美生命周期: ...
 - 《手把手教你》系列技巧篇(十八)-java+ selenium自动化测试-元素定位大法之By css中卷(详细教程)
		
1.简介 按计划今天宏哥继续讲解倚天剑-css的定位元素的方法:ID属性值定位.其他属性值定位和使用属性值的一部分定位(这个类似xpath的模糊定位). 2.常用定位方法(8种) (1)id(2)na ...
 - 墙裂推荐 iOS 资源大全
		
这是个精心编排的列表,它包含了优秀的 iOS 框架.库.教程.XCode 插件.组件等等. 这个列表分为以下几个部分:框架( Frameworks ).组件( Components ).测试( Tes ...
 - Linux Shell 编程基础详解——吐血整理,墙裂推荐!
		
第一部分:Linux Shell 简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...
 - 墙裂推荐一波mysql学习资源
		
在日常工作与学习中,无论是开发.运维.测试,还是架构师,数据库是一门必不可少的"必修课", 也是必备的涨薪神器.在互联网公司中,开源数据库用得比较多的当属 MySQL 了. 但my ...
 - 如何从零开始参与 Apache 顶级开源项目?| 墙裂推荐
		
 写在开头 从 2021 开始,有一个很有意思的说法经常在各大技术媒体或开源论坛中出现,「开源正在吞噬一切」.不论是否言过其实,从一个行业从业者的切身感知来看,开源确实从少数极客的小众文化成为主流的 ...
 
随机推荐
- Python 描述符是什么?以及如何实现
			
先看一个例子,@property.被@property修饰的成员函数,将变为一个描述符.这是最简单的创建描述符的方式. class Foo: @property def attr(self): pri ...
 - [ SSH框架 ] Struts2框架学习之四(自定义拦截器)
			
一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...
 - 读《图解HTTP》有感-(返回结果的HTTP状态码)
			
写在前面 HTTP状态码是由服务端产生,用于告诉客户端,服务端处理结果的编码 正文 1.状态码的作用是什么?具有什么特征? 状态码的作用是当客户端向服务器发送请求时,描述服务器的响应结果(如:服务器正 ...
 - seo优化做起来不是哪么简单,其实需要的是思维
			
SEO百科:随着人们互联网的认识水平的提升,SEO似乎也已经得到了更多的认识.无论是浅显还是深入,SEO一直被大众认为是简单的,甚至是不值得一提的东西,甚至认为SEO无非就是作弊,SEO并 ...
 - 数组、ArrayList、List、LinkedList的区别
			
一.数组 数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. 1.一维数组 声明一个数组: ]; 初始化一个数组: ] { , , , , }; //定长 声明并初始化: ...
 - xcode6.1 设置中文输入
			
XCode6.1中设置中文输入方法:Product->scheme->Edit Scheme->Options->Application Region->中国 ios 模 ...
 - Java JFrame图形界面 ----一个简单的窗口
			
#开始 申请博客已经有一段时间了 但是一直没有时间写博文(其实还是懒虫侵蚀了大脑) 最近正在学习JFrame做窗口 遇到了很多的问题 为了解决问题也谋杀了很多的脑细胞 为了让更多的朋友不死的很多脑细胞 ...
 - web前端 DOM 详解
			
先来点概念 文档对象模型(DOM)是一个独立于语言的,使用 XML 和 HTML 文档操作的应用程序接口(API). 在浏览器中,主要与 HTML 文档打交道,在网页应用中检索 XML 文档也很常见. ...
 - linux安装tomcat Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
			
这两天我们的开发机重启了好几次,发现每次重启后我的tomcat总是没有启动.检查java路径,配置正确,后来拿普通账号启动tomcat时报如下的错: Neither the JAVA_HOME nor ...
 - Python 模块详解及import本质
			
同在当前目录下的模块和包导入 模块定义 本质就是.py结尾的python文件. 用来从逻辑上组织python代码(变量,函数,类,逻辑) 文件名: test.py; 对应的模块名 : test 模块 ...