golang devops项目实战 - 为什么选择go语言

先来聊聊go有趣的历史

在google中,大部分的项目都是采用C C++开发,少量地用了java,其次 才是python;在2007年的某一天,google的首席工程师在编译一个C++项目 过程中,尽管在google早就实现了分布式编译系统,但是Rob Pike和Robert Griesemer实在受够了那个漫长的编译等待时间,于是突发灵感与坐在旁边的 Ken Thompson一起讨论实在有必要发明一个新的编程语言,这个编程语言必 须有近乎C语言的执行效率和近乎解析型语言的开发效率,以及近乎完美的编译 速度,于是他们取名这个语言为go语言,就如每一个go语言的使用者都成为 gopher,gopher是一种生活在加拿大的小动物,它的中文名叫做囊地鼠,这 种动物有个特点就是生活在底下,哈哈,当然这个不是最关键的,他们最大的 特点就是挖洞速度特别快,当然可能不止是挖洞啦,取名为go意为语言的运行 速度、开发速度、学习速度(develop)都像gopher一样快。

 

 

被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可 少就是多,还是少就是少(Less is more or less is less)。Rob Pike以一种非常 朴素的方式,概括了GO语言的整个设计哲学--将简单、实用体现得淋漓尽致。

很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性 能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让 开发者在语言级别就可以方便的得到自己想要的东西。

强大的研发团队

go的应用

使用go语言开发的开源项目比较著名的主要有:

Docker,火热的容器化技术; Kubernetes,Goole Borg的开源实现; Etcd,类似zookeeper的高可用key-value存储; TIDB,国人开发的Google spanner的开源实现;

许多大厂都已经拥抱 Go 语言,包括以 Java 打天下的阿里巴巴,更别提深 爱着 Go 语言的滴滴、今日头条、小米、奇虎 360、京东等明星公司。同时, 创业公司也很喜欢 Go 语言,主要因为其入门快、程序库多、运行迅速,很适 合快速构建互联网软件产品,比如轻松筹、快手、知乎、探探、美图、猎豹移 动等等,更比如前不久泄漏的B站后端源码都是采用go语言开发。

从业务维度看,在云计算、微服务、大数据、区块链、物联网等领域,Go 语言早已蓬勃发展。有的使用率已经非常之高,有的已有一席之地。即使是在 Python 为王的数据科学和人工智能领域,Go 语言也在缓慢渗透,并初露头 角。

go的特性

  • 并发与协程
  • 基于消息传递的通信方式
  • 丰富实用的内置数据类型
  • 函数多返回值
  • defer机制
  • 反射(reflect)
  • 高性能HTTP Server
  • 工程管理
  • 编程规范

为什么要选择go语言

你为什么选择这门语言去开发,关于这个话题,永远是争议最大的,比如 程序员鄙视链,但是我在开讲go语言之前还是要来趟这个浑水,如果有失偏颇 的话,还请海涵。首先存在即合理,那么多的计算机语言存在,都会有其时代 背景和对软件工程中某些特殊问题的解决,不能一棍子敲死,比如C/C++牛 逼,那为什么java的应用范围非常广,java程序员的数量多过C/C++,java看 起来被这么多人如此使用,那为什么现在越来越多的企业转向用go语言开 发?!

 从以下三个方面来阐述下:

首先,对于架构师来讲,他应该是精通的领域较广,对技术了解比较深 刻,那么python、java、c、c++、lua、go比较了解,根据业务场景去选择开 发语言,比如网易云风,在架构网易游戏的时候就大量低使用了lua语言,因为 lua动态解释的,简洁小而美,方便做热更新,方便作为实现业务逻辑的,是 c、c++各模块之间的粘合剂,比如web开发;java有很多成熟的库,开发效率 比较高;比如音视频相关的开发,用C和C++,因为很多图像处理、编解码、 音效处理大多采用了C/C++开发,你再用java开发就是不伦不类的。

其次,对于软件工程来讲,注重研发效率和合理适度的架构设计,在这方 便,C和C++对于移动互联网和物联网后台服务以及基础架构设计来讲,因为 能够直接操作内存,比如内存溢出、栈溢出、内存泄漏、野指针操作等会导致 应用程序直接崩溃,而更加的是这些问题可能隐藏比较深,定位BUG和解决的 成本较大,所以对开发人员的技能要求比较高,那么如果在一个团队内没有严 格的管理,用C和C++开发的工程代码极难维护。现在很多的后台应用使用java 语言开发,但是java的框架和组件非常多,这十分容易引起过度化设计。

再者,对于企业和行业现状来讲,很多的企业都面临高并发和大数据的请 求,对于并发或者并行开发,python就免谈了,压根不合适,但是对于java语 言或者C/C++语言来讲,如果采用多进程和多线程的方式,采用这种方式时, 很多时候我们采用锁的机制解决问题,但是采用锁带来的成本是很大的(可见 http://47.106.79.26:4000/2018/11/28/kernel_mutex/ 对mutex的分析), 采用多线程最著名的《并发危险:解决多线程代码中的 11 个常见的问题》( https://blog.csdn.net/mergerly/article/details/39028861)。那么在业界内 我们采用的比较多的是lock-free的方案,比如自旋锁和原子操作等,例如 Disruptor。几年前我接触了ZeroMQ的设计,从ZeroMQ的主要贡献者Pieter Hintjens里了解到最好的并发方式,是不共享任何资源,如果真要共享资源则 可以设计为线程通信的方式去解决。那么我们也看到go语言里实现的协程,以 及协程间用channel去通信的设计。

论述完以上三点,那go语言又有哪些优势呢?

性能:go语言是一门静态语言,编译成机器字节码,java虽然有JVM,但 是java也有JIT,可以生成字节码去执行。C和C++也是静态语言,直接编 译生成机器字节码,所以go在语言层面的性能是接近C和C++的。关于语 言性能的比较我们可以从 https://benchmarksgame- http://team.pages.debian.net/benchmarksgame/fastest/go.html略窥一 二。但是在应用一门语言时,语言的性能仅仅是一个方面,还跟其它方面 有关系:比如跟写代码的人的水平和方式有关( Will your toy benchmark program be faster if you write it in a different programming language? It depends how you write it!);其二在内存管理和IO操作上,这个就不 是语言层面能够控制的了,比如C/C++能够自己实现内存的管理,比如内 存池的技术,所以对于后台服务的应用程序需要海量请求时,可以从内存

池的技术上去优化性能,相对来说go语言和其它高级语言没有指针的这个 操作,所以在这方面还是不如C/C++的;其三,应用程序的性能也符合 28原则,我们更应当将注意力集中在频繁被执行的代码上。

go还提供了一些性能分析工具(比如pprof),通过这些工具可以分 析程序CPU使用、内部使用,查看协程栈、GC日志和Trace信息。 语言技术栈:首先,go语言里内置了很多的package,从其官网( https://golang.org/pkg/)可以查看到,基于这些package可以足够开 发出你的应用了,所以go语言是比较反对框架的;但是你也可以引入第三 方的package,如首先执行: go

get http://github.com/garyburd/redigo/redis,然后import这个package, 就可以使用这个package了,现在很多组件都提供了go语言版本的接口, 也有很多第三方的框架,比如web服务的beego、buffalo、echo、gin、 iris和revel,比如微服务的非常著名并且性能彪悍的grpc,分布式文件系 统的go-fastdfs,对于很多的其它方面的应用都有go语言的接口实现。 开发效率:

编译效率高,go语言的设计的初衷之一就是解决C/C++混乱的头文 件依赖机制所导致的编译时间过长问题,在GO语言中,有一套标准 的工程管理规范,只要按照这个规范进行项目开发,之后的事情 (比如包管理、编译等等)都将变得非常的简单。在GO项目下,存 在两个关键目录,一个是src目录,用于存放所有的.go源码文件; 一个是bin目录,用于存在编译后的二进制文件。在src目录下,除 了main主包所在的目录外,其它所有的目录名称与直接目录下所对 应的包名保持对应,否则编译无法通过。这样,GO编译器就可以从 main包所在的目录开始,完全使用目录结构和包名来推导工程结构 以及构建顺序,避免像C++一样,引入一个额外的Makefile文件。 在GO的编译过程中,我们唯一要做的就是将GO项目路径赋值给一 个叫GOPATH的环境变量,让编译器知道将要编译的GO项目所在的 位置。然后进入bin目录下,执行go build {主包所在的目录名},即 可秒级完成工程编译。

一处编译到处运行, Go编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。(够浪) 学习成本:go语言的设计者,一开始就遵守少就是多的原则,所以 go语言没有太多的特性,不像C一样需要控制内存,也不像 C++11/14/17/20一样引入了特别多的语法特性,go的代码比较简 单,学习的成本比较低。除此之外我们可以从官网和社区获取到很 多的帮助。

Golang官网

Golang官方地址: http://golang.org,无论学习什么知识,第一手资料 基本都是首发于官网。进入到官网后,会看到很多资源,比如:

文档:http://golang.org/doc,官方文档,仔细读下文档首页并分 类,了解下自己要学哪些内容; 一览:http://tour.golang.org,交互式运行环境,不安装golang便 可体验学习它的语法与使用; 指南:http://golang.org/ref/spec,golang学习指导手册,从基础 语法到高级特性全部都有介绍;

标准库:http://golang.org/pkg/,可以查看所有的官方库的接口、 源码以及使用介绍; 博客:http://blog.golang.org,不定期分享go的最佳实践,有些公 司也会投稿介绍自己的案例; 实验室:http://play.golang.org,感觉和tour类似,不过在这里编 写的代码可以分享给别人;

官网是个宝库,我们需要认真仔细去挖掘其中的内容;但由于一 些原因,golang的官方站点我们无法访问,不过golang为我们提供了中国的官 网,地址: https://go-zh.org;

golang社区

一门语言的发展需要有大批牛人的分享布道,也需要我们这些菜鸟学习有更多 的参考路径。这一切都离不开社区。国内外也有很多优秀的go语言社区。

https://www.bilibili.com/video/av57709660

转载于:https://my.oschina.net/u/3868062/blog/3069236

你可能感兴趣的:(golang devops项目实战 - 为什么选择go语言)