Go Cloud项目开源发布:Go语言将成为云端应用开发的首选语言?(go语言开发云平台)
作者 | The Go Blog
编辑 | 张婵 – 高效开发运维公众号
Go 语言团队发布了一个新的开源项目 Go Cloud,用于开发具有可移植性的云端应用程序。
7 月 24 日,Go 语言团队发布了一个新的开源项目 Go Cloud。Go Cloud 是一个可在开放云平台上进行开发的库和工具集,旨在让 Go 语言成为开发构建可移植云端应用程序的首选语言。
1 为什么瞄准具有可移植性的云端编程?为什么是现在?
谷歌的 Go 语言是当今发展最快的编程语言之一,在全球拥有约 100 万的活跃开发人员。Go 语言为包括 Kubernetes,Istio 和 Docker 在内的许多关键云基础架构项目提供支持,并凭借其高效性,内置并发性和低延迟受到很多云端开发人员的喜爱。
Go 语言团队从合作伙伴当中了解到,很多公司都对跨云的可迁移性有共同的需求,他们想要在多云或混合云环境中部署健壮的应用程序,并希望无需对代码进行大量更改就能在不同的云服务之间迁移工作负载。
为实现这一目标,一些团队尝试将应用程序与特定云服务的 API 分离,以生成更简单,更可移植的代码。然而,功能的快速迭代需求必将牺牲长期的可移植性。因此,云中运行的大多数 Go 应用程序都与其初始云服务紧密耦合。
现在,团队可以使用 Go Cloud(一组开放的通用云端 API)编写更简单,可移植的云端应用程序。Go Cloud 使团队能够实现其功能开发目标,同时能保持在多云和混合云架构中迁移的灵活性。
2 Go Cloud 是什么
Go 语言团队识别了云端应用程序使用的通用服务,并创建了可跨云进行应用的通用 API。Go Cloud 采用 blob 存储,可访问 MySQL 数据库,可进行运行时配置,还有一个具有内置日志记录,跟踪和运行状况检查的 HTTP 服务器。Go Cloud 目前提供对 Google Cloud Platform(GCP)和 Amazon Web Services(AWS)的支持。后期 Go 团队计划与其他云服务和 Go 语言社区合作,尽快为其他云厂商添加支持。
Go Cloud 旨在为各种云中最常用的服务提供中立于厂商的 API,这样可以轻松地将 Go 应用程序进行跨云迁移。Go Cloud 还为其他编写跨云的库的开源项目奠定了基础。来自社区各级各类开发人员的反馈将决定 Go Cloud 中未来 API 的优先级。
3 如何使用 Go Cloud
Go Cloud 的核心是一组进行便携云端编程的通用 API 集合。 我们来看一个使用 blob 存储的例子。你可以使用 * blob.Bucket 这个通用类型将文件从本地磁盘复制到云服务中。 首先使用附带的 s3blob 包打开一个 S3 bucket:
// 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,就可以创建一个可以实现 io.Writer 的 blob.Writer。 然后这个程序程序可以使用 * blob.Writer 将数据写入 bucket,确保 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) }
注意:使用 Bbucket 的逻辑不适用于AWS S3。通过更改用于打开 * blob.Bucket 的功能,Go Cloud 可以交换云端存储。这样应用程序可以使用 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) }
虽然访问不同云服务中的 bucket 需要不同的步骤,但应用程序使用的结果类型是一样的:* blob.Bucket。这将应用程序代码与特定云服务的代码隔离开来。为了提高与现有 Go 库的互操作性,Go Cloud 利用了 io.Writer,io.Reader 和 * sql.DB 等已建立的接口。
4 如何开始
官方教程地址:
https://github.com/google/go-cloud/tree/master/samples/tutorial
可按照此教程进行操作并尝试自行构建应用程序。如果你已经在使用 AWS 或 GCP,可以尝试迁移现有的应用程序的一部分来尝试使用 Go Cloud。如果你使用的是其他云服务或本地服务,则可以通过实现驱动程序接口(如 driver.Bucket)来扩展 Go Cloud 进行支持。
Go Cloud 开源地址:
https://github.com/google/go-cloud