Go 博客
Go Cloud 便携式云编程
介绍
今天,Google 的 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 还为构建在这些通用 API 之上的便携式云库生态系统奠定了基础。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.Bucket
将文件从本地磁盘复制到云提供商。让我们首先使用包含的 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
的函数的问题。应用程序可以使用 Google Cloud Storage,通过使用 gcsblob.OpenBucket
构建 *blob.Bucket
,而无需更改复制文件的代码
// 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 利用了已建立的接口,如 io.Writer
、io.Reader
和 *sql.DB
。
访问云服务所需的设置代码往往遵循一种模式:从更基本的基础抽象构建更高层的抽象。虽然您可以手动编写此代码,但 Go Cloud 使用 **Wire** 自动执行此操作,Wire 是一种工具,可以为您生成特定于云的设置代码。 Wire 文档 解释了如何安装和使用该工具,并且 Guestbook 示例 展示了 Wire 的实际应用。
我如何参与并了解更多信息?
要开始使用,我们建议您按照 教程 进行操作,然后尝试自己构建一个应用程序。如果您已经使用 AWS 或 GCP,可以尝试迁移现有应用程序的部分内容以使用 Go Cloud。如果您使用的是其他云提供商或本地服务,可以通过实现驱动程序接口(如 driver.Bucket
)来扩展 Go Cloud 以支持它。
我们感谢您对您体验的任何和所有输入。 Go Cloud 的 开发在 GitHub 上进行。我们期待您的贡献,包括拉取请求。提交问题 告诉我们哪些地方可以改进,或者项目应该支持哪些未来的 API。有关项目的更新和讨论,请加入 项目的邮件列表。
该项目要求贡献者签署与 Go 项目相同的贡献者许可协议。阅读 贡献指南 以了解更多详细信息。请注意,Go Cloud 受 Go 行为准则 的约束。
感谢您抽出时间了解 Go Cloud。我们很高兴与您合作,使 Go 成为构建便携式云应用程序的开发人员的首选语言。
下一篇文章:Go 1.11 发布
上一篇文章:走向 Go:Go 垃圾收集器的旅程
博客索引