Go Cloud —— 便携式云编程

未匹配的标注

本文为官方 Go Blog 的中文翻译,详见 翻译说明

Eno Compton and Cassandra Salisbury
2018 年 7 月 24 日

介绍#

今天,Google 的 Go 团队发布了一个新的开源项目, Go Cloud , 它是一个用于在 open cloud 上进行开发的库和工具。通过这个项目,我们旨在使 Go 成为开发者构建便携式云应用的首选语言。

这篇文章解释了我们为什么开启这个项目,Go Cloud 的工作原理,以及如何参与其中。

为什么要进行便携式云编程?为什么是现在?#

我们估计现在全球有 超过一百万 的 Go 开发者。Go 为许多最关键的云基础设施项目提供支持,包括 Kubernetes,Istio,和 Docker。像 Lyft,Capital One,Netflix 和 许多其他公司 在生产中都依赖 Go 做开发。多年来,我们发现开发者因为 Go 的效率,生产力,内置的并发性和低延迟而喜欢用 Go 进行云开发。

作为支持 Go 快速增长的工作的一部分,我们一直在采访使用 Go 的团队,以了解他们是如何使用该语言的以及怎样进一步改善 Go 生态系统。许多组织都有跨云提供商的可移植性的需求。这些团队希望在 多云混合云 环境部署强健的应用程序,并在云提供商之间移植他们的工作而无需对代码进行重大修改。

为此,一些团队试图将其应用程序与特定提供商的 API 解耦,以便获得更简单,更易移植的代码。但是,发布功能的短期压力意味着团队通常会牺牲需要长期工作的可移植性。结果,大部分在云中运行的 Go 应用都与它们的初始云提供商紧密耦合。

作为替代方案,团队可以使用 Go Cloud,它是一组开放的通用云 API, 来编写更简单,更具备可移植性的云应用程序。Go Cloud 还为在这些通用 API 之上构建便携式云库的生态系统奠定了基础。Go Clould 使团队实现功能开发目标的同时,维持多云和混合云架构的长期灵活性。Go Clould 应用程序还可以迁移到最能满足其需求的云提供商。

什么是 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 Clould 未来 API 的优先级。

它是如何工作的?#

Go Cloud 的核心是用于便携式云编程的通用 API 的集合。让我们来看一个使用 Blob 存储的例子。你可以使用通用类型 *blob.Bucket 将文件从本地磁盘复制到云提供商的云平台。让我们首先使用 s3blob package 打开一个 S3 存储桶:

// setupBucket 打开一个 AWS 存储桶
func setupBucket(ctx context.Context) (*blob.Bucket, error) {
    // 获取 AWS 凭证。
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-2"),
    })
    if err != nil {
        return nil, err
    }
    // 打开一个指向 s3://go-cloud-bucket 的句柄。
    return s3blob.OpenBucket(ctx, sess, "go-cloud-bucket")
}

一旦程序拿到 *blob.Bucket,它可以创建一个 *blob.Writer*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 使用谷歌云存储,而不需要更改复制文件的代码:

// setupBucket 打开一个 GCS 存储桶。
func setupBucket(ctx context.Context) (*blob.Bucket, error) {
    // 打开 GCS 存储桶。
    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
    }
    // 打开一个指向 gs://go-cloud-bucket 的句柄
    return gcsblob.OpenBucket(ctx, "go-cloud-bucket", c)
}

尽管访问不同云提供商的存储桶需要不同的步骤,但是你的应用程序使用的结果类型都是一样的:*blob.Bucket。这将应用程序代码与用于特定云的代码隔离开。为了提高与现有 Go 库的互操作性,Go Cloud 采用了已存在的接口,比如 io.Writerio.Reader*sql.DB

访问云服务所需的设置代码通常都遵循一种模式:更高层次的抽象是从更基础的抽象构造而来的。你可以手动编写此代码,而 Go Cloud 可以使用 Wire (一个为你生成特定云设置代码的工具)自动生成此代码。 Wire 文档 说明了如何安装和使用该工具,Guestbook 样例 以实战方式展示了如何使用 Wire

如何参与并了解更多信息?#

首先,我们建议你按照 教程 尝试自己构建应用程序。如果你已经在使用 AWS 或者 GCP,你可以尝试将现有应用的一部分迁移以使用 Go Cloud。如果你正在使用其他的云提供商或者内部部署服务,你可以通过实现驱动程序接口来扩展 Go Cloud(像这样 driver.Bucket)。

我们非常感谢你提供的所有的用户体验。Go Cloud 的开发在 GitHub 进行。我们欢迎任何贡献,包括 Pull Request。你可以 提出问题 来告知我们哪些地方可以改进或者该项目未来应该支持哪些 API。有关该项目的更新和讨论,请加入 项目论坛

该项目要求贡献者签署和 Go 项目相同的贡献者许可协议。更多信息请阅读 贡献指南。请注意,Go 的 行为规范 涵盖了 Go Cloud。

感谢你抽出宝贵的时间学习 Go Cloud。我们很期待与你合作,使 Go 成为开发者构建便携式云应用程序的首选语言。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/go-blog/go-clou...

译文地址:https://learnku.com/docs/go-blog/go-clou...

上一篇 下一篇
Summer
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~