本文作者:Serdar Yegulalp[1]原文链接:10 open source projects proving the power of Google Go[2]译者:Go 语言中文网 polaris ,非原文直译方式从 2007 年项目启动,到 2009 年底对外开源,Go 语言已经 10 年了。这 10 年是狂奔的 10 年,特别是最近一两年,从 Go 语言中文网的用户量和访问量可以明显看出来,Go 确实越来越受到关注。同时由于丰富的库和抽象机制简化了开发并发分布式(即云)应用程序的工作,简单、高性能、易于写高并发程序、编译速度极快的 Go 备受关注。然而,一门语言要被大众接受,生态很重要。得益于一些重量级的开源项目,使得 Go 得到了越来越多人的认可,特别是云计算相关的项目,这其中最重要的莫过于 Docker 和 Kubernetes。Go 已证明它是快速开发网络服务、软件基础结构项目以及各种功能强大的紧凑工具的首选。本文介绍了 10 个用 Go 语言编写的被大量关注、使用的项目,许多项目已经比 Go 语言更出名。所有这些项目都在各自的领域发挥了重要作用。本文介绍的所有项目都托管在 GitHub 上,因此对 Go 好奇的人可以轻松查看让这些项目取得成功的 Go 代码。这 10 个项目是:Docker[3]Kubernetes[4]Fedora CoreOS[5]的Etcd[6]和Fleet[7]InfluxDB[8]Istio[9]Traefik[10]Hugo[11]Terraform[12]CockroachDB[13]Gravitational Teleport[14]一个个看看。DockerDocker[15]是一个开源的应用容器引擎,让开发者可以打包他们的应用和依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 、Mac 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 无疑是 Go 最成功的案例。在一年多点的时间里,这种软件容器化技术成为了 Go 适用于大规模分布式软件项目的典范。Docker 团队之所以喜欢 Go[16],是由于它有很多优点:全静态编译、强大的标准库、完整的开发环境,以及出色的跨平台特性。KubernetesKubernetes,简称 k8s,是用 8 代替 8 个字符 “ubernete” 而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署、规划、更新、维护的一种机制。因为 Docker 是用 Go 编写的,自然而言,其他重要的面向云的容器项目也采用了 Go 编写。谷歌的容器编排项目Kubernetes[17]就是一个 Go 项目,大部分 Kubernetes 子组件和生态系统也是如此。一个典型例子是:超轻量级的 Kubernetes 衍生品k3s[18]适用于只需要 Kubernetes 基础组件的人群。(Go 语言中文网译注:K8S 有点 Java 中的 Hadoop 这种量级应用的味道)谷歌考虑过使用其他语言(包括 C/C++、Java 和 Python)编写 Kubernetes。但是据 Kubernetes 的联合创始人、前技术负责人,目前是 VMware 首席工程师的Joe Beda 声称[19],这些语言没有一个像 Go 那样“称心如意”。正如 Beda 所说,“Go 既不太高级,又不太低级。”Fedora CoreOSCoreOS 是一种操作系统,于 2013 年十二月发布,它的设计旨在关注开源操作系统内核的新兴使用 — 用于大量基于云计算的虚拟服务器。CoreOS[20](现在是 Red Hat 的项目)使用 Docker 将 Linux 变成一堆松散耦合的容器,有可能摆脱一系列混乱的依赖项,依赖已成为 Linux 软件包管理的基本对象。因此,CoreOS 利用 Docker 来实现它也就不足为奇了。CoreOS 的两个基本服务 Etcd 和 Fleet 都是用 Go 编写的。Fleet[21]让你可以“就像 CoreOS 集群共享单一的初始化系统那样对待它”。Etcd[22]是一个分布式键值存储系统,处理 Docker 应用程序与 CoreOS 实例之间的配置同步。两者都是用 Go 编写的,Go 拥有“出色的跨平台支持、小巧的二进制文件以及强大的社区。”InfluxDBInfluxDB[23]是一个用于存储和分析时间序列数据的开源数据库。是“没有外部依赖的分布式时间序列数据库”。“时间序列”这个术语是指 InfluxDB 主要负责获取度量指标或事件,允许对它们进行实时分析。“没有外部依赖”意味着你不需要其他软件即可使用 InfluxDB。它完全是独立自主的(Go 应用程序往往如此)。支持使用 REST 方式,通过 JSON 将数据写入数据库或从数据库读取数据,甚至可以允许使用简单 SQL 语言进行查询。InfluxDB 具有高度弹性和横向可扩展性,选择 Go 这种语言可能是为了使那些特性变得可行和易于实现。(Go 语言中文网注:使用 Go 语言实现的时序数据库还有其他的,比如饿了么开源的LinDB[24])InfluxDB 主要特性有:内置 HTTP 接口,使用方便数据可以打标记,这样查询可以很灵活类 SQL 的查询语句安装管理很简单,并且读写数据很高效能够实时查询,数据在写入时被索引后就能够被立即查出……推荐 InfluxDB 中文文档:https://jasper-zhang1.gitbooks.io/influxdb/content/IstioIstio[25]提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,而不需要对服务的代码做任何改动。它是 Kubernetes 生态系统的一部分,它解决许多企业应用环境中一个没有深入了解又没有处理好的问题:如何处理将服务彼此连接并与外界连接的网络结构?Istio 在 Kubernetes 集群中的每个容器之间以及那些容器与外界之间提供了一个可编程的“服务网格”,或网络代理层,那样可以通过共享控制平面以编程方式对该网络进行任何更改。鉴于 Kubernetes 也是用 Go 编写的,因此 Go 非常适合此任务,另一个原因是 Go 适用于去中心化的分布式网络项目。TraefikTraefik 是一个为了让部署微服务更加便捷而诞生的现代 HTTP 反向代理、负载均衡工具。 它支持多种后台 (Docker[26],Swarm[27],Kubernetes[28],Marathon[29],Mesos[30],Consul[31],Etcd[32],Zookeeper[33],BoltDB[34], Rest API, file…) 来自动化、动态的应用它的配置文件设置。Traefik 旨在与一系列广泛的编排选项一起使用,从 Kubernetes 和 Docker Swarm 到 Amazon ECS 和 Azure Service Fabric,不一而足。Traefik 自动创建在那些编排器下运行的微服务所需的路由,以便与外界进行对话。它还生成适合编排器的跟踪数据和统计信息。中文网:https://traefik.cn/HugoHugo 是由 Go 语言实现的静态网站生成器。简单、易用、高效、易扩展、快速部署。静态网站生成器现在很流行。因为它们仅仅使用静态 HTML、CSS 和 JavaScript 来创建快速、安全的网站,这是一种很简便的方法。Hugo[35]是一个静态网站生成器,它利用了 Go 的许多特性来快速顺畅地工作 —— 即 Go 用于渲染 HTML 的工具、网络库、国际化功能以及作为单个可以再分发的平台原生二进制文件加以部署的特性。Go 的所有这些特性使 Hugo 易于拆包、运行,方便用来快速构建网站。中文网:https://www.gohugo.org/TerraformHashiCorp — 由 Vagrant(基于 Ruby 的开发环境管理工具)的开发者创办,它充分利用 Go 的速度和强大来构建更庞大更宏伟的项目:Terraform[36],该系统用于通过定义文件转为代码在本地或云端构建 IT 基础架构。你所做的任何更改可以前滚或后滚,而且在调用代码之前可以获得到底会发生什么情况的完整摘要(即执行计划)。Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 “Write, Plan, and create Infrastructure as Code”, 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务。具体的说就是可以用代码来管理维护 IT 资源,把之前需要手动操作的一部分任务通过程序来自动化的完成,这样的做的结果非常明显:高效、不易出错。CockroachDBGo 常被用于构建各种分布式云原生应用程序。CockroachDB[37]以弹性而闻名,这种分布式数据库旨在承受各种各样的灾难(甚至是数据中心故障),而能继续响应你的 SQL 查询。 CockroachDB 完全是用 Go 编写的,只有部分来源于前一个项目 RocksDB 的性能密集型核心功能使用了一小部分 C++ 代码。CockroachDB 可实现跨数据中心同步的可伸缩开源数据库。目标是打造一个开源、可伸缩、跨地域复制且兼容事务的 ACID 特性的分布式数据库,它不仅能实现全局(多数据中心)的一致性,而且保证了数据库极强的生存能力,就像 Cockroach(蟑螂)这个名字一样,是打不死的小强。Gravitational TeleportGo 已成为许多网络项目以及基于它们的下游项目的默认语言。一个典型的例子是:用 Go 实现的 SSH 本身就很有用,充当Gravitational Teleport[38]等项目的基础。Gravitational Teleport 让用户可以通过 shell 安全地访问服务器。它通过单点登录来保证安全,但又不需要事务通常需要的那种管理开销(比如密钥管理和轮换)。喜欢本文的朋友,欢迎关注“Go语言中文网”文中链接[1]Serdar Yegulalp:https://www.infoworld.com/author/Serdar-Yegulalp/[2]10 open source projects proving the power of Google Go:https://www.infoworld.com/article/3442978/10-open-source-projects-proving-the-power-of-google-go.html[3]Docker:https://github.com/docker/docker[4]Kubernetes:https://github.com/kubernetes/kubernetes[5]Fedora CoreOS:https://github.com/coreos[6]Etcd:https://github.com/etcd-io/etcd[7]Fleet:https://github.com/coreos/fleet[8]InfluxDB:https://github.com/influxdb/influxdb[9]Istio:https://istio.io/[10]Traefik:https://github.com/containous/traefik[11]Hugo:https://gohugo.io/[12]Terraform:https://github.com/hashicorp/terraform[13]CockroachDB:https://github.com/cockroachdb/cockroach[14]Gravitational Teleport:https://github.com/gravitational/teleport[15]Docker:https://github.com/docker/docker[16]Docker 团队之所以喜欢Go:http://www.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-go[17]Kubernetes:http://www.infoworld.com/article/2608021/paas/google-plunges-in-to-docker-management.html[18]k3s:https://github.com/rancher/k3s[19]Joe Beda 声称:https://blog.gopheracademy.com/birthday-bash-2014/kubernetes-go-crazy-delicious/[20]CoreOS:http://www.infoworld.com/article/2608236/application-virtualization/coreos-uses-docker-to-put-linux-on-a-diet.html[21]Fleet:https://coreos.com/using-coreos/clustering/[22]Etcd:https://coreos.com/using-coreos/etcd/[23]InfluxDB:https://github.com/influxdb/influxdb[24]LinDB:https://github.com/lindb/lindb[25]Istio:https://istio.io/[26]Docker:https://www.docker.com/[27]Swarm:https://docs.docker.com/swarm[28]Kubernetes:https://kubernetes.io/[29]Marathon:https://mesosphere.github.io/marathon/[30]Mesos:https://github.com/apache/mesos[31]Consul:https://www.consul.io/[32]Etcd:https://coreos.com/etcd/[33]Zookeeper:https://zookeeper.apache.org/[34]BoltDB:https://github.com/boltdb/bolt[35]Hugo:https://gohugo.io/[36]Terraform:https://github.com/hashicorp/terraform[37]CockroachDB:https://github.com/cockroachdb/cockroach[38]Gravitational Teleport:https://github.com/gravitational/teleport