1.4 从事DevOps工作应该掌握的语言
如果要从事DevOps工作,那么除了我们所熟悉的Shell和Python之外,建议在此基础上熟悉下Go(Golang)的特性和语法,如果团队都喜欢用Go语言来开发,则建议继续深入研究。这里我们可以先比较下Python和Go语言,看看Go语言的优势在哪里。
1)部署简单。Go语言编译生成的是一个静态可执行文件,除了glibc之外再没有其他的外部依赖。这也使得部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,这就大大减轻了维护的负担。
2)并发性好,天生支持高并发。Goroutine和Channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效地利用多个CPU核,其并行执行的性能很好。这一点与Python也是天壤之别。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁GIL的原因,多线程的Python程序并不能有效利用多核,只能用多进程的方式进行部署,其实在很多场景中这样并不能有效地利用计算机资源,这也是饱受Python爱好者诟病的地方。
3)良好的语言设计。从学术的角度讲,Go语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go的设计是非常优秀的:规范足够简单灵活,具有其他语言基础的程序员都能迅速上手。更重要的是Go自带完善的工具链,大大提高了团队协作的一致性,比如gofmt自动排版Go代码,这在很大程度上杜绝了不同人编写代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行gofmt,这样在编写代码的时候就可以随意摆放位置了,存档的时候gofmt会将它们自动变成正确排版的代码。此外,还有gofix、govet等非常有用的工具。
4)执行性能好。Go语言虽然不如C和Java,但其通常比原生Python应用还是高一个数量级的,适合编写一些瓶颈业务,内存占用也非常低。
下面再来看看Go语言适用的场景,具体如下。
1)服务器编程,如果大家以前习惯使用C或者C++来进行服务器编程,那么用Go来做也是很合适的,例如日志处理系统、数据打包、虚拟机处理、文件系统等。
2)分布式存储、数据库代理器等。
3)Key-Value存储,例如工作中常见的etcd。
4)网络编程,目前这一块应用得最广,包括Web应用、API应用、下载应用等。
5)内存数据库,前一段时间Google开发的groupcache等。
6)游戏服务端的开发。
7)云平台,目前国内外很多云平台都在采用Go开发,例如国外的CloudFoundy、Apcera云平台和国内的青云、七牛云等。
建议大家在平常的DevOps中,除了使用Python之外,还可以用Go语言来编写些项目需求或自动化运维的API,这样来加深理解,熟悉其语法特性,相信大家最终会被其大道至简的设计哲学所折服。