引言
今天(大约译者2018年7月24日),谷歌的Go团队发布了新的开源项目
Go Cloud ,这是一个在
开放云中的库和开发工具。 通过该项目,我们旨在使开发人员选择Go语言来创建跨云应用程序。
这篇文章解释了为什么我们开始这个项目,详细介绍了Go Cloud的工作原理,以及如何参与和开始使用它。
为什么要进行跨云编程? 为什么现在呢?
我们估计全世界有
超过一百万的开发人员在使用Go。 Go服务于许多最关键的面向云的项目,包括Kubernetes,Istio和Docker。 Lyft,Capital One,Netflix
等公司都依赖Go进行生产。 多年来,我们发现开发人员喜欢使用Go进行云开发,因为它的效率,生产力,内置的竞争力和低延迟。
作为支持Go快速发展的工作的一部分,我们采访了与Go合作的团队,并了解了他们如何使用该语言以及将来如何改善Go生态系统。 在许多接受调查的组织中表达的主要主题之一是对跨云开发的需求。 这些团队(受访者)希望能够在
多云和
混合云环境中部署他们的应用程序,并在云提供商之间分配负载,而无需对应用程序代码进行重大更改。
为此,一些团队尝试将其应用程序与特定于提供程序的API解除绑定,以编写更简单,更可移植(跨云)的代码。 但是,对功能交付的短期需求意味着团队必须牺牲对跨云计算的长期需求。 结果,大多数在云中运行的Go应用程序都紧密地连接到最初选择的云提供商。
另外,团队可以使用Go Cloud(一组开放的共享云API)来编写更简单,更可移植的云应用程序。 Go Cloud还为便携式云库的生态系统提供了基础。 Go Cloud使团队能够在应用程序开发期间专注于功能,同时保持长期的灵活性,以便在多云和混合云架构中部署应用程序。 Go Cloud应用程序也可以迁移到最适合应用程序需求的云提供商。
什么是Go Cloud?
我们已经确定了云应用程序使用的通用服务,并创建了用于在云提供商之间工作的通用API。 如今,Go Cloud可以与blob存储,MySQL数据库,运行时设置(配置)以及配置了请求日志记录,监视和运行状况检查的HTTP服务器一起使用。 Go Cloud可与Google Cloud Platform(GCP)和Amazon Web Services(AWS)一起使用。 我们将在不久的将来继续与云行业和Go社区的合作伙伴合作,以增加对其他云提供商的支持。
Go Cloud的目标是为所使用的大多数服务开发与供应商无关的通用API,例如,将Go应用程序简单轻松地部署到另一个云。 Go Cloud也可以用作开发其他开放源代码库以在云提供商之间工作的基础。 来自各种开发人员和所有开发级别的反馈将影响Go Cloud API未来版本中实现或添加该功能的优先级。
如何运作?
Go Cloud基于一套用于跨云编程的通用API。 我们来看一个使用Blob存储的示例。 您可以使用通用
* blob.Storage类型将文件从本地驱动器复制到云。 让我们首先使用捆绑的
s3blob软件包打开S3存储:
从
* blob.Bucket出现在应用程序中的那一刻起,您
就有机会创建
* blob.Writer ,后者又实现了
io.Writer接口。 从这一刻起,应用程序(程序)可以使用
* blob.Writer将数据写入云存储,并检查
Close不会返回错误。
ctx := context.Background() b, err := setupBucket(ctx) if err != nil { log.Fatalf("Failed to open bucket: %v", err) } data, err := ioutil.ReadFile("gopher.png") if err != nil { log.Fatalf("Failed to read file: %v", err) } w, err := b.NewWriter(ctx, "gopher.png", nil) if err != nil { log.Fatalf("Failed to obtain writer: %v", err) } _, err = w.Write(data) if err != nil { log.Fatalf("Failed to write to bucket: %v", err) } if err := w.Close(); err != nil { log.Fatalf("Failed to close: %v", err) }
请注意,使用存储(存储桶)的逻辑并不涉及AWS S3的细节。 Go Cloud使替换云存储本质上可以替代用于打开
* blob.Bucket的功能。 通过使用
gcsblob.OpenBucket实例化
* blob.Bucket,应用程序可以轻松切换到使用Google Cloud Storage,而无需更改复制文件的代码:
但是,到目前为止,访问各种云提供商的存储需要采取不同的步骤,应用程序使用的最终类型仍为
* blob.Bucket 。 因此,应用程序代码与特定于云的代码保持隔离。 为了增强与现有Go库的兼容性,Go Cloud使用标准Go库中提供的现有接口,例如
io.Writer ,
io.Reader和
*sql.DB。访问云服务所需的代码(上例中的
setupBucket()函数)遵循以下模式:较高的抽象使用更基本的(较低的)抽象来构造。 虽然您可以用笔编写此类代码,但Go Cloud会使用
Wire (该工具为您生成特定于云的代码)自动执行此操作。
Wire文档说明了如何安装和使用它,而
示例显示了Wire的实际作用。
如何参与项目并了解更多信息?
首先,我们建议使用以下
指南 ,然后建议您尝试自己使用Go Cloud构建应用程序。 如果您已经使用过AWS或GCP,则可以尝试迁移部分现有应用程序以使用Go Cloud。 如果您使用其他云提供商或本地服务,则可以通过实现驱动程序接口(例如
driver.Bucket )来扩展Go Cloud以支持此功能。
我们将感谢Go Cloud的各种经验。
Go Cloud开发由GitHub
驱动 。 我们将很高兴为该项目做出任何贡献,包括提供资源。 创建一个
问题以使我们知道您认为应该改进什么,或者库应该首先支持哪些API。 要随时关注更新和新闻,请加入项目
邮件列表 。
该项目要求贡献者签署与Go项目采用的相同的“贡献者许可协议”。 阅读
贡献者指南以了解更多详细信息。
感谢您花时间了解Go Cloud,我们很高兴与您合作,让Go选择构建跨云(便携式)应用程序的开发人员。