使用Go Cloud进行跨云编程

引言


今天(大约译者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存储:

// setupBucket opens an AWS bucket. func setupBucket(ctx context.Context) (*blob.Bucket, error) { // Obtain AWS credentials. sess, err := session.NewSession(&aws.Config{ Region: aws.String("us-east-2"), }) if err != nil { return nil, err } // Open a handle to s3://go-cloud-bucket. return s3blob.OpenBucket(ctx, sess, "go-cloud-bucket") } 

* 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,而无需更改复制文件的代码:

 // setupBucket opens a GCS bucket. func setupBucket(ctx context.Context) (*blob.Bucket, error) { // Open GCS bucket. creds, err := gcp.DefaultCredentials(ctx) if err != nil { return nil, err } c, err := gcp.NewHTTPClient(gcp.DefaultTransport(), gcp.CredentialsTokenSource(creds)) if err != nil { return nil, err } // Open a handle to gs://go-cloud-bucket. return gcsblob.OpenBucket(ctx, "go-cloud-bucket", c) } 

但是,到目前为止,访问各种云提供商的存储需要采取不同的步骤,应用程序使用的最终类型仍为* blob.Bucket 。 因此,应用程序代码与特定于云的代码保持隔离。 为了增强与现有Go库的兼容性,Go Cloud使用标准Go库中提供的现有接口,例如io.Writerio.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选择构建跨云(便携式)应用程序的开发人员。

Source: https://habr.com/ru/post/zh-CN418131/


All Articles